JDK tools.jar作为Maven依赖项


77

我想将JDK tools.jar作为编译依赖项。我发现了一些指示使用systemPath属性的示例,如下所示:

<dependency>
  <groupId>com.sun</groupId>
  <artifactId>tools</artifactId>
  <scope>system</scope>
  <systemPath>${java.home}/../lib/tools.jar</systemPath>
</dependency>

问题是该路径对于Mac Os X不正确(但是对于Windows和Linux是正确的)。为此,正确的路径是$ {java.home} /../ Classes / classes.jar

我正在寻找一种定义maven属性的方法,以便如果将系统检测为Mac Os X,则将值设置为$ {java.home} /../ Classes / classes.jar,否则将其设置为$ {java.home} /../ lib / tools.jar(就像可以使用ANT一样)。有人有主意吗?



@ user7610这不是重复的,此问题解决了Java 9之前的情况。您建议的副本处理Java 9之后的情况。
Mark Rotteveel

Answers:


47

这就是配置文件的用途,提取属性的路径,为Windows,OSX等设置配置文件,并适当地定义属性值。

这是讨论操作系统配置文件的文档页面:Maven本地设置模型

它应该最终看起来像这样:

  <profiles>
    <profile>
      <id>windows_profile</id>
      <activation>
        <os>
          <family>Windows</family>
        </os>
      </activation>
      <properties>
        <toolsjar>${java.home}/../lib/tools.jar</toolsjar>
      </properties>
    </profile>
    <profile>
      <id>osx_profile</id>
      <activation>
        <os>
          <family>mac</family>
        </os>
      </activation>
      <properties>
        <toolsjar>${java.home}/../Classes/classes.jar</toolsjar>
      </properties>
    </profile>
  </profiles>

我正在运行OS X 10.7(Lion),这对我有用,除了有趣的是,我已经有一个* nix配置文件用于Linux机器(<family> unix </ family>)。有了这两个配置文件,它就忽略了我的<family> mac </ family>配置文件。因此,我可以更改* nix配置文件条目的路径,或者我必须注释掉该配置文件的配置文件,以便它可以看到我的<family> mac </ family>的配置文件
Mark J Miller

3
如果您需要在OS X上同时支持Apple Java 6(Classes/classes.jar)和Oracle Java 7(lib/tools.jar),则将无法使用,但@Laurent的回答会起作用。
Matt McHenry

1
stackoverflow.com/a/29585979对于我来说,似乎对于JDK 1.7,JDK 1.8和El Capitan是一个更好的答案。
保罗·坎宁安

该文件的路径和名称应该是什么?
vivekanon

40

感谢您向我介绍Maven个人资料。

我已经使用了如上所述的配置文件,并根据所需文件的存在来激活配置文件:

<profiles>
    <profile>
        <id>default-profile</id>
        <activation>
            <activeByDefault>true</activeByDefault>
            <file>
                <exists>${java.home}/../lib/tools.jar</exists>
            </file>
        </activation>
        <properties>
            <toolsjar>${java.home}/../lib/tools.jar</toolsjar>
        </properties>
    </profile>
    <profile>
        <id>mac-profile</id>
        <activation>
            <activeByDefault>false</activeByDefault>
            <file>
                <exists>${java.home}/../Classes/classes.jar</exists>
            </file>
        </activation>
        <properties>
            <toolsjar>${java.home}/../Classes/classes.jar</toolsjar>
        </properties>
    </profile>
</profiles>

我在前一篇文章中发布了此答案以强调一个错误:属性部分只能在激活部分中使用,以便基于指定属性的存在来激活配置文件。为了定义属性,必须像上面一样使用properties部分。


有关classes.jar的存在性检查的好处是,它可以回溯到在Mac平台上使用tools.jar。这对于将来在Mac(link)上发布的OpenJDK可能很重要,因为它可能具有tools.jar而不是classes.jar。
修剪

+1,因为这会测试我们所追求的实际文件,并且不依赖于操作系统检测(无论如何都没有必要)
Stefan Haberl 2013年

言归正传,但至少对于JDK 1.7 / 1.8和El Capitan而言,stackoverflow.com/ a/29585979最终是更好的解决方案。
保罗·坎宁安

9

嗨,我知道你们都很聪明,但是这让我花了几天的时间才弄清楚答案是不完整的-配置文件和依赖项都是必需的。我希望没有人会再浪费时间在这上面。请在下面查看我的完整代码:

<profiles>
    <profile>
        <id>osx_profile</id>
        <activation>
            <activeByDefault>false</activeByDefault>
            <os>
                <family>mac</family>
            </os>
        </activation>
        <properties>
            <toolsjar>${java.home}/../Classes/classes.jar</toolsjar>
        </properties>
        <dependencies>
            <dependency>
                <groupId>com.sun</groupId>
                <artifactId>tools</artifactId>
                <version>1.6.0</version>
                <scope>system</scope>
                <systemPath>${toolsjar}</systemPath>
            </dependency>
        </dependencies>
    </profile>
</profiles>

2
dependencies轮廓内部分是没有必要的。只需在配置文件外部声明一次,然后让配置文件为toolsjar属性确定正确的值就足够了。
爱德华·萨姆森

1
仅Mac需要此依赖关系,最好只在此配置文件中声明
Jianyu 2012年

这行不 <toolsjar>${java.home}/../Classes/classes.jar</toolsjar>应该<toolsjar>${java.home}/../lib/tools.jar</toolsjar>吗?
詹斯(Jens)

7

不知何故,Windows中的日食未能解决{java.home}。因此,我必须设置JAVA_HOME而不是java.home。JAVA_HOME是在“运行”->“运行配置”->“环境”中设置的。这适用于标准JDK(不是Apple JDK)。

<profiles>
        <profile>
            <id>windows-profile</id>
            <activation>
                <activeByDefault>true</activeByDefault>
                <file>
                    <exists>${JAVA_HOME}/lib/tools.jar</exists>
                </file>
            </activation>
            <properties>
                <toolsjar>${JAVA_HOME}/lib/tools.jar</toolsjar>
            </properties>
        </profile>
        <profile>
            <id>mac-profile</id>
            <activation>
                <activeByDefault>false</activeByDefault>
                <file>
                    <exists>${java.home}/../lib/tools.jar</exists>
                </file>
            </activation>
            <properties>
                <toolsjar>${java.home}/../lib/tools.jar</toolsjar>
            </properties>
        </profile>
    </profiles>


    <dependencies>
        <dependency>
                <groupId>jdk.tools</groupId>
                <artifactId>jdk.tools</artifactId>
                <version>jdk1.8.0</version>
                <scope>system</scope>
                <systemPath>${toolsjar}</systemPath>
            </dependency>
        </dependencies>

1
这是一个在许多地方都提出的老问题。因为这是2016年,并且我同时安装了同时安装了JDK 1.7和JDK 1.8的El Capitan,所以我认为这是解决STS(Eclipse)和Maven(命令行)中此问题的最简单,最干净的方法,而无需创建符号链接或以某种方式篡改已安装的系统。它对我来说是第一次。:) :) :)
保罗·坎宁安

5

我在Q中找到了解决方案:声明对tools.jar的maven依赖关系可在JDK 9上工作

由于实际的Maven巫术相当复杂,对于新手来说还是令人惊讶的,并且是未来需要改进的主题,因此最好不要将其共同粘贴。因此,该模块存在,因此您不必了解或关心细节。~~ https://github.com/olivergondza/maven-jdk-tools-wrapper

<dependency>
  <groupId>com.github.olivergondza</groupId>
  <artifactId>maven-jdk-tools-wrapper</artifactId>
  <version>0.1</version>
</dependency>

1

爱德华的评论是正确的。

您需要配置文件,并且需要块的dependency外部profiles。该配置文件仅确定${toolsjar}将获得哪个值。

<dependencies>
    <dependency>
        <groupId>jdk.tools</groupId>
        <artifactId>jdk.tools</artifactId>
        <version>jdk1.8.0</version>
        <scope>system</scope>
        <systemPath>${toolsjar}</systemPath>
    </dependency>
</dependencies>

0

正确的入门指导

首先将此配置文件添加到标签上方或其中其他位置的Pom.xml文件中。

<profiles>
    <profile>
        <id>default-profile</id>
        <activation>
            <activeByDefault>true</activeByDefault>
            <file>
                <exists>${java.home}/../lib/tools.jar</exists>
            </file>
        </activation>
        <properties>
            <toolsjar>${java.home}/../lib/tools.jar</toolsjar>
        </properties>
    </profile>
    <profile>
        <id>mac-profile</id>
        <activation>
            <activeByDefault>false</activeByDefault>
            <file>
                <exists>${java.home}/../Classes/classes.jar</exists>
            </file>
        </activation>
        <properties>
            <toolsjar>${java.home}/../Classes/classes.jar</toolsjar>
        </properties>
    </profile>
</profiles>

然后更正JRE路径

去 :

Windows>首选项>已安装的JRE

选择已安装的JRE并双击它,或者从右键菜单中单击“编辑”,然后确保JRE Home路径在JDK中,例如:

C:\ Program Files \ Java \ jdk1.8.0_181 \ jre

如果您单独安装了JRE,则eclipse会选择独立的JRE,例如:

C:\ Program Files \ Java \ jre1.8.0_181 \

因此,将其更改为JDK随附的JRE:

C:\ Program Files \ Java \ jdk1.8.0_181 \ jre


-11

我的解决方案:

  1. 将Sun的tools.jar放到 $JAVA_HOME/lib
  2. $JAVA_HOME/..名为lib的目标位置建立符号链接$JAVA_HOME/lib

8
这不是一个好的解决方案,因为它意味着在必须将JAR文件放入类路径的每台计算机上执行一些操作。
洛朗

我根据在其他地方找到的解决方案尝试了此操作,并对此进行了各种更改,但未获得预期的结果。
保罗·坎宁安
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.