Maven:缺少工件com.sun:tools:jar:POM.xml中的1.6.0编译时异常

时间:2014-10-17 09:43:35

标签: java maven maven-2 maven-3 pom.xml

当我尝试为工具添加依赖性时,我遇到了一个奇怪的问题并在我的pom.xml中获得了编译时异常。 jar显示如下(缺少工件com.sun:工具:jar:1.6.0

Issue

我已将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>

但我知道这不是好习惯。请求解决此错误的指导。

2 个答案:

答案 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 in Maven

所以而不是

${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具有不同的文件结构。这就是您必须定义这些配置文件的原因。

另见以下帖子: