【问题标题】:Maven : Missing artifact com.sun:tools:jar:1.6.0 compile time exception in POM.xml [duplicate]Maven:POM.xml 中缺少工件 com.sun:tools:jar:1.6.0 编译时异常 [重复]
【发布时间】: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,所以我现在无法验证这一点)。

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


【解决方案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 具有不同的文件结构。

【讨论】:

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

另见以下帖子:

【讨论】:

  • 注意这里的区别——他们使用${java.home}/../lib而不是${java.home}/lib,这表明${java.home}指向JDK内部的jre目录而不是JDK本身。
  • @IanRoberts 有趣。我想知道为什么它会起作用。这可能也是我面临的另一个问题的原因:stackoverflow.com/questions/26393332/…我会问他们。
  • @IanRoberts 我已经重新检查过了。在 Maven 中,${java.home} 指向 jre 目录。所以上面的配置是正确的。另见stackoverflow.com/questions/15279586/java-home-in-maven
猜你喜欢
  • 2012-01-12
  • 2013-02-08
  • 2012-08-17
  • 2012-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-16
  • 2021-02-12
相关资源
最近更新 更多