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

Posted

技术标签:

【中文标题】Maven:POM.xml 中缺少工件 com.sun:tools:jar:1.6.0 编译时异常 [重复]【英文标题】:Maven : Missing artifact com.sun:tools:jar:1.6.0 compile time exception in POM.xml [duplicate] 【发布时间】:2014-12-12 20:58:49 【问题描述】:

当我尝试添加对工具的依赖时,我遇到了一个奇怪的问题并在我的 pom.xml 中遇到了编译时异常。 jar 显示如下(缺少工件 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。检查那个设置是否正确。 @Shirish,您是在运行 maven 命令行还是从 IDE 运行? @StijnGeukens :我正在通过命令提示符运行它,但已将其与我的 Eclipse 集成。 @StijnGeukens :当我通过命令提示符运行我的命令(如清理、编译、测试)时,Stijn 有什么不同吗?我没有发现任何错误。我应该认为一切都很好吗?我第一次将我的 maven 项目与 eclipse 集成,所以我对这个编译时错误有点困惑。 是的,如果您在 eclipse 中为 M2E 插件定义了其他设置,这可能会有所不同(我不再使用 eclipse,所以我现在无法验证这一点)。 【参考方案1】:

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。 感谢指出,我已经更新了答案。 是的,我看到了,做得好。但它毕竟似乎是重复的。 ***.com/questions/3080437/…【参考方案2】:

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

另见以下帖子:

JDK tools.jar as maven dependency Build error: missing artifact com.sun:tools:jar:1.6 missing artifact sun.jdk:tools:jar:1.6.0:system Missing artifact com.sun:tools:jar:1.5.0 maven

【讨论】:

注意这里的区别——他们使用$java.home/../lib而不是$java.home/lib,这表明$java.home指向JDK内部的jre目录而不是JDK本身。 @IanRoberts 有趣。我想知道为什么它会起作用。这可能也是我面临的另一个问题的原因:***.com/questions/26393332/…我会问他们。 @IanRoberts 我已经重新检查过了。在 Maven 中,$java.home 指向 jre 目录。所以上面的配置是正确的。另见***.com/questions/15279586/java-home-in-maven

以上是关于Maven:POM.xml 中缺少工件 com.sun:tools:jar:1.6.0 编译时异常 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

由于 pom.xml 中的错误,无法使用 Maven 运行构建

Maven:缺少工件presto

pom.xml 中的 JDBC Maven 依赖关系

缺少工件 com.oracle:ojdbc6:jar:11.2.0.3

无法解析 Maven 工件

在运行时获取 Maven 工件版本