使用Eclipse/Maven构建Hadoop - 缺少jdk.tools:jdk.tools:jar:1.6组件

75

我正在尝试在Eclipse 3.81的Maven项目中使用Oracle的JDK 1.7.0_05,在Windows 7上使用m2e插件,从CDH4 Maven仓库导入Cloudera的org.apache.hadoop:hadoop-client:2.0.0-cdh4.0.0

<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-client</artifactId>
    <version>2.0.0-cdh4.0.0</version>
</dependency>

但是,我收到了以下错误:

The container 'Maven Dependencies' references non existing library 'C:\Users\MyUserId\.m2\repository\jdk\tools\jdk.tools\1.6\jdk.tools-1.6.jar'

更具体地说,Maven指出以下构件缺失

Missing artifact jdk.tools:jdk.tools:jar:1.6

怎么解决这个问题?

12个回答

103

问题出在Eclipse的Maven支持上,相关问题在这里

在Eclipse中,java.home变量被设置为启动Eclipse所使用的JRE版本,而不是build JRE版本。从C:\Program Files中默认安装的系统JRE不包含JDK,因此无法找到tools.jar

为了解决这个问题,您需要在eclipse.ini文件中添加如下内容来使用JDK中的JRE启动Eclipse(-vmargs之前):

-vm
C:/<your_path_to_jdk170>/jre/bin/server/jvm.dll

然后刷新Maven依赖项(Alt-F5)(仅刷新项目不足)。


9
谢谢。给读者的小建议:请记得在"-vm"和实际参数值之间加上换行符。 - Daniel Fernández
1
刚刚遇到一个问题,Eclipse自动检测了[jdk]\jre\bin\javaw.exe,但是以这种方式运行时,Maven无法找到tools.jar。需要明确更改Eclipse使用[jdk]\bin\javaw.exe运行,以便Maven能够正确地找到它所调用的com.sun:tools:1.8 jar包。 - Alex
1
我必须强调 @Alex 所说的:在 eclipse.ini 中使用 JDK bin 而不是 JRE bin 的 -vm。@rustyx 显示了 [jdk_path]/jre/bin 的路径,对我来说,那就是导致找不到 tools.jar 失败的原因——尽管我指向的是 javaw.exe,而不是 dll。当我将其更改为 C:/Program Files/Java/jdk1.8.0_51/bin/javaw.exe 并启动 eclipse,Alt-F5,错误消失了。我惊讶地发现,在 JDK 中有两个不同的 javaw 可执行文件,具有不同的校验和。 - David Lotts
1
如果您正确地指定了systemPath(http://maven.apache.org/general.html#tools-jar-dependency),即以“../”开头,则不会出现此问题。 Maven的java.home变量应该指向[JRE](https://web.archive.org/web/20150520200505/https://docs.codehaus.org/display/MAVENUSER/MavenPropertiesGuide),而不是JDK。 另一方面,环境变量JAVA_HOME应该指向JDK。 - rustyx
这个 m2e bug 影响的 45 个人应该在 Eclipse Bug Tracker 上对其进行投票 - https://bugs.eclipse.org/bugs/show_bug.cgi?id=432992。 - icyitscold
显示剩余4条评论

96

jdk.tools:jdk.tools(或者com.sun:tools,或其他你喜欢的名称)是随 JDK 分发的一个 JAR 文件。通常你可以像这样将其添加到 Maven 项目中:

<dependency>
    <groupId>jdk.tools</groupId>
    <artifactId>jdk.tools</artifactId>
    <scope>system</scope>
    <systemPath>${java.home}/../lib/tools.jar</systemPath>
</dependency>

请参考Maven FAQ以添加tools.jar的依赖。

或者,您可以使用以下方式手动在本地存储库中安装tools.jar

mvn install:install-file -DgroupId=jdk.tools -DartifactId=jdk.tools -Dpackaging=jar -Dversion=1.6 -Dfile=tools.jar -DgeneratePom=true

然后像Cloudera一样使用引用方式:

<dependency>
    <groupId>jdk.tools</groupId>
    <artifactId>jdk.tools</artifactId>
    <version>1.6</version>
</dependency>

7
建议补充说明,您的Maven命令需要在JDK(版本6)/lib文件夹中运行。 - Dan W
1
对于 Windows 上的绝对路径:需要将 std 反斜杠替换为 fwd 斜杠 - C:/Program Files/Java/jdk1.7.0_67/lib/tools.jar - user 923227
这很棒,但是mvn install命令一直给我构建失败的错误。为属性添加引号对我很有帮助。 - abhijitcaps
2
如果您是通过Program Files中的完整路径引用tools.jar,那么该路径包含空格,必须用引号括起来。更容易的方法是导航到该目录并从那里运行mvn install:install-file ;) @abhijitcaps - npe
尝试:mvn install:install-file -DgroupId=jdk.tools -DartifactId=jdk.tools -Dversion=1.6 -Dpackaging=jar -Dfile="C:\Program Files\Java\jdk\lib\tools.jar"或者查看http://maven.apache.org/guides/mini/guide-3rd-party-jars-local.html - Yogesh Borkhade

37
感谢npe的帮助,添加。
<dependency>
    <groupId>jdk.tools</groupId>
    <artifactId>jdk.tools</artifactId>
    <version>1.7.0_05</version>
    <scope>system</scope>
    <systemPath>${JAVA_HOME}/lib/tools.jar</systemPath>
</dependency>

将它添加到pom.xml中解决了问题。


11

如果您可以在没有tools.jar的情况下生存,并且它只作为链式依赖项包含在内,那么您可以将其从有问题的项目中排除:

<dependency>
    <groupId>org.apache.ambari</groupId>
    <artifactId>ambari-metrics-common</artifactId>
    <version>2.1.0.0</version>
    <exclusions>
        <exclusion>
            <artifactId>jdk.tools</artifactId>
            <groupId>jdk.tools</groupId>
        </exclusion>
    </exclusions>
</dependency>

“你可以不用tools.jar”这句话的确切意思是什么?如何确定它被移除后是安全的? - Alessandro S.

6
这是我的解决方案:

这个对我有用:

    <dependency>
        <groupId>jdk.tools</groupId>
        <artifactId>jdk.tools</artifactId>
        <version>1.7.0_05</version>
        <scope>system</scope>
        <systemPath>${JAVA_HOME}/lib/tools.jar</systemPath>
    </dependency>

1

我在我的MR项目中使用以下内容。

<exclusions>
                <exclusion>
                    <artifactId>jdk.tools</artifactId>
                    <groupId>jdk.tools</groupId>
                </exclusion>
</exclusions>

1
这并没有解释应该把这放在哪里。 - MikeKulls

0

我也遇到了这个问题,因为我只安装了 JRE 而没有安装 JDK。所以,添加依赖项 jdk.tools 不能解决我的问题,因为在我的 ${JAVA_HOME}/lib/ 目录下不存在 tools.jar

现在我下载并安装了 JDK 来解决这个问题。


0

可能系统已经安装了JDK包,但是可能缺少一些开发工具或插件。

我在opensuse环境下遇到了这个问题。 然后我安装了java-1_6_0-openjdk-devel

问题就消失了。


0

更改Eclipse中安装的JRE集合。 窗口>首选项>Java>已安装的JRE,更改jre的位置为%JAVA_HOME%/jre,而不是类似于C:\Program Files\Java\jre7之类的路径。


0
如果在.m2存储库中存在jdk.tools,但仍然出现以下错误:

丢失构件:jdk.tools.....c:.../jre/..

在Build Path -> Configure Build Path -> Libraries中,只需将JRE系统库从JRE更改为JDK即可。


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