Maven:POM.xml中编译时异常“Missing artifact com.sun:tools:jar:1.6.0”

5

我遇到了一个奇怪的问题,在我的pom.xml中添加依赖项tools.jar时,编译时出现异常,错误信息如下(Missing artifact com.sun:tools: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>

但我知道这不是一个好的做法。请求指导以解决此错误。


Maven将使用JAVA_HOME环境变量来确定要使用的JDK。请检查该变量是否设置正确。 - Stijn Geukens
@Shirish,你是在使用Maven命令行还是从IDE运行的? - Stijn Geukens
@StijnGeukens:我正在通过命令提示符运行它,但已将其与我的Eclipse集成。 - sTg
是的,如果您在Eclipse中为M2E插件定义了其他设置(我不再使用Eclipse,所以现在无法验证),这可能会有所不同。 - Stijn Geukens
你为什么需要tools.jar? - khmarbaise
显示剩余2条评论
2个回答

13

java.home 是一个系统属性,通常指向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>

更新:如lexicore所提到的,这在MAC上将不起作用,因为MAC JDK具有不同的文件结构。


这在 Mac 上不起作用。 - lexicore
感谢指出,我已在答案中进行了更新。 - coderplus
是的,我看到了,做得好。但最终似乎还是重复了。https://dev59.com/83A75IYBdhLWcg3w1sv2#3080695 - lexicore

3
在Maven中,${java.home}指向JDK使用的JRE目录,而不是JDK本身。请参考这个问题:

Maven中的Java_home

因此,不要使用:
${java.home}/lib/tools.jar

假设您应该使用的JDK目录
${java.home}/../lib/tools.jar

然而,这只是解决方案的一半。问题在于,在Mac下,目录结构是不同的。您必须使用用户配置文件才能使构建可靠地跨平台工作。
请查看此问题:
JDK工具包tools.jar作为maven依赖项
特别是这个答案(这是正确的答案,而不是被接受的答案)。
这是Oracle在其中一个POM中处理它的方式:
<!--  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 的文件结构不同。这就是为什么您需要定义这些配置文件的原因。
另请参阅以下帖子:
- JDK tools.jar 作为 Maven 依赖项 - 构建错误:缺少 com.sun:tools:jar:1.6 的工件 - 缺少工件 sun.jdk:tools:jar:1.6.0:system - 缺少工件 com.sun:tools:jar:1.5.0 Maven

请注意这里的区别 - 他们使用${java.home}/../lib而不是${java.home}/lib,这表明${java.home}指向JDK内部的jre目录而不是JDK本身。 - Ian Roberts
@IanRoberts 很有趣。我想知道为什么它会起作用。这也可能是我遇到的另一个问题的原因:https://dev59.com/R18d5IYBdhLWcg3w1FB0我会问他们的。 - lexicore
@IanRoberts 我已经重新检查过了。在Maven中,${java.home}指向jre目录。因此上面的配置是正确的。另请参阅https://dev59.com/cmUp5IYBdhLWcg3wbnMS - lexicore

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接