当我尝试为工具添加依赖性时,我遇到了一个奇怪的问题并在我的pom.xml中获得了编译时异常。 jar显示如下(缺少工件com.sun:工具:jar:1.6.0 )
我已将JAVA_HOME变量设置如下:
JAVA_HOME :C:\ Program Files \ Java \ jdk1.6.0_34
当我将它硬编码到JDK1.6的实际路径时,我没有发现任何错误,如下所示。
<dependency>
<groupId>com.sun</groupId>
<artifactId>tools</artifactId>
<version>1.6.0</version>
<scope>system</scope>
<systemPath>C:\Program Files\Java\jdk1.6.0_34\lib\tools.jar</systemPath>
</dependency>
但我知道这不是好习惯。请求解决此错误的指导。
答案 0 :(得分:13)
java.home
是一个System属性,通常指向jre目录,当你指向一个不存在的jar时会出现错误。
如果您想在pom文件中引用环境变量,请使用以下语法。
${env.variable_name}
在您的情况下,它应该是${env.JAVA_HOME}
,如下所示
<dependency>
<groupId>com.sun</groupId>
<artifactId>tools</artifactId>
<version>1.6.0</version>
<scope>system</scope>
<systemPath>${env.JAVA_HOME}/lib/tools.jar</systemPath>
</dependency>
更新:正如词汇提到的那样,这不会与MAC协同工作,因为MAC JDK具有不同的文件结构。
答案 1 :(得分:3)
在Maven中,$ {java.home}指向JDK使用的JRE目录,而不是JDK本身。请看这个问题:
所以而不是
${java.home}/lib/tools.jar
假定您应该使用的JDK目录
${java.home}/../lib/tools.jar
然而,这只是解决方案的一半。问题是在Mac下,目录结构不同。您必须使用用户配置文件才能使您的构建可靠地跨平台工作。
请看这个问题:
JDK tools.jar as maven dependency
并且,具体而言,this answer(这是正确答案,而不是OP接受的答案)。
这就是Oracle在one of their POMs中处理它的方式:
<!-- JDK dependencies -->
<dependency>
<groupId>com.sun</groupId>
<artifactId>tools</artifactId>
<version>1.6</version>
<scope>system</scope>
<systemPath>${tools.jar}</systemPath>
</dependency>
然后在profiles
:
<profile>
<id>default-tools.jar</id>
<activation>
<file>
<exists>${java.home}/../lib/tools.jar</exists>
</file>
</activation>
<properties>
<tools.jar>${java.home}/../lib/tools.jar</tools.jar>
</properties>
</profile>
<profile>
<id>default-tools.jar-mac</id>
<activation>
<file>
<exists>${java.home}/../Classes/classes.jar</exists>
</file>
</activation>
<properties>
<tools.jar>${java.home}/../Classes/classes.jar</tools.jar>
</properties>
</profile>
在Mac上,JDK具有不同的文件结构。这就是您必须定义这些配置文件的原因。
另见以下帖子: