缺失的构件com.sun:tools:jar。

115

我一直在按照入门教程进行学习,但是在使用Maven导入playn项目后遇到了困难。我的操作系统是64位Windows 7,使用的IDE是Eclipse Indigo。

导入的所有项目都出现同样的错误:

Missing Artifact com.sun:tools:jar in all the pom.xml files.

在搜索论坛几个小时后,我已经尝试过:

安装最新的Java 1.6.029 将我的JAVA_HOME环境变量更改为指向\program files\Java\jdk1.6_029 更改我的Eclipse Java首选项以使用JRE jdk1.6_029

我真的很想尝试playn,但是为什么有一些帖子似乎找不到问题的共识答案。有些人说Sun从64位jdk中删除了某些东西,还有人说您必须编辑xml文件,许多人说您必须更改您的JAVA_HOME,还有人说您必须更改Eclipse的VM选项。

如果能够澄清这一点并可能对许多人有用,则将不胜感激,因为我在这里没有特别奇怪的设置。

(编辑) 以下是第一个项目中的pom.xml。 Eclipse在标有错误的行中标记了错误:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <parent>
    <groupId>com.googlecode.playn</groupId>
    <artifactId>playn-project</artifactId>
    <version>1.1-SNAPSHOT</version>
  </parent>

  <artifactId>playn-android</artifactId>
  <name>PlayN Android</name>
  <packaging>jar</packaging>

  <repositories>
  </repositories>

  <dependencies>
    <dependency>
      <groupId>com.googlecode.playn</groupId>
      <artifactId>playn-core</artifactId>
      <version>${project.version}</version>
    </dependency>

    <!-- needed because Android uses the same JSON code as playn-java;
         that should be factored into a library shared by both backends -->
    <dependency>
      <groupId>com.googlecode.playn</groupId>
      <artifactId>playn-java</artifactId>
      <version>${project.version}</version>
    </dependency>

    <dependency>
      <groupId>com.google.android</groupId>
      <artifactId>android</artifactId>
      <version>${android.version}</version>
      <scope>provided</scope>
    </dependency>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <sourceDirectory>src</sourceDirectory>
  </build>
</project>

你在命令行中运行Maven时是否遇到相同的错误? - Raghuram
我添加了pom.xml文件。很抱歉我不知道如何使用命令行来处理maven。 - boldinventions
由于这是一个常见问题,您能接受一个对您有效的答案吗? - Roy Truelove
一个快速的解决方案是将JRE指向JDK文件夹中可用的那个。 - Naveen Raj
在使用Eclipse Neon(4.6.3)运行机器人框架测试用例时,我遇到了类似的问题。在“Window/Preferences/Java/Installed JRE's”下将JRE更改为JDK,这对我有用。正如上面正确指出的那样,JDK确实包含tools.jar。 - David
显示剩余2条评论
27个回答

60
我刚在这个问题上发布了一个帖子,介绍了我是如何解决这个问题的,但是我也会在这里粘贴(并详细说明)一下,因为这似乎更相关。
当我在Windows 7中使用Eclipse时,即使我从Eclipse设置中删除了JRE并只保留了JDK,我仍然遇到了同样的问题。
最终我不得不修改启动Eclipse的快捷方式的命令行,在其中添加了-vm参数,像这样:
-vm "T:\Program Files\Java\jdk1.6.0_26\bin"

当然,你需要将其调整为指向的JDK安装目录下的bin目录。这样做的目的是使Eclipse本身使用JDK而不是JRE,然后就能够正确地找到tools.jar文件了。
我认为这与Eclipse在未指定JRE时如何查找其默认JRE有关。我猜测它倾向于选择JRE而不是JDK(为什么我不知道),并选择第一个兼容的JRE。如果像Vladiat0r的答案所建议的那样,它是基于Windows注册表键进行查找,则首先寻找HKLM\Software\JavaSoft\Java Runtime Environment键而不是HKLM\Software\JavaSoft\Java Development Kit键。

10
在Windows 7上,这对我们起作用了。我们不得不修改快捷方式以添加“-vm"..."”参数,而不是使用eclipse.ini文件。此外,在错误消失之前,我们必须重新导入我们的Maven项目到工作区中。 - Kit Menke
2
这里也一样 - .ini 没有用,但是命令行中的 -vm 参数起作用了。 - Roy Truelove
1
我编辑了答案,以解释如何更改eclipse.init。来源:https://wiki.eclipse.org/Eclipse.ini#-vm_value:_Windows_Example - OGrandeDiEnne
1
同样的问题 - 在快捷方式中添加“-vm”对我有用。我不需要重新导入我的项目,只需更新它的project/maven即可。 - Łukasz Dumiszewski
1
为了让它正常工作,我还需要将javaw.exe添加到该路径中(完整路径为:-vm "T:\Program Files\Java\jdk1.8.0_66\bin\javaw.exe")。 - Jacob van Lingen
我必须在快捷方式中添加vm args后执行mvn update才能使其工作。 - Magnum23

32

在开发一个简单的Web服务应用程序时,我遇到了同样的问题,我的情况是必须添加Codehaus插件以获取JAX-WS库。然而,Maven POM一直在询问有关工具jar文件的信息。

我必须说上面的评论是正确的,您可以在POM文件中包含以下条目:

<dependency>
   <groupId>com.sun</groupId>
   <artifactId>tools</artifactId>
   <version>1.6</version>
   <scope>system</scope>
   <systemPath>C:\Program Files\Java\jdk1.6.0_29\lib\tools.jar</systemPath>
 </dependency>

但是,当你需要部署到生产实例时会发生什么?你可以用系统环境变量的引用替换路径,但至少在我看来这样不太好。

我在StackOverflow的评论中找到了另一个解决方案:

Maven 3 Artifact problem

<dependency>
    <groupId>org.apache.struts</groupId>
    <artifactId>struts2-core</artifactId>
    <version>${struts2.version}</version>
    <exclusions>
        <exclusion>
            <artifactId>tools</artifactId>
            <groupId>com.sun</groupId>
        </exclusion>
    </exclusions>
</dependency>

他们建议在工具jar中包含排除语句,这样做可以解决问题。总结一下:你可以在依赖项中包含一个排除规则,避免出现tool.jar问题:

 <exclusions>
            <exclusion>
                <artifactId>tools</artifactId>
                <groupId>com.sun</groupId>
            </exclusion>
        </exclusions>

3
使用“mvn dependency:tree”查找要插入排除项的位置。 - Lars
pom.xml中添加排除标签对我无效。 - user3437460

28

其他答案都无法解决我的问题。解决方法是在Eclipse的pom.xml文件中检查“Dependency hierarchy”(依赖层次结构),使用过滤器“tools”后发现我实际上有一个对tools.jar的依赖:

Eclipse View

所以对我来说,罪魁祸首就是这个:

<dependency>
    <groupId>com.github.markusbernhardt</groupId>
    <artifactId>robotframework-selenium2library-java</artifactId>
    <version>1.4.0.7</version>
    <scope>test</scope>
</dependency>

加入排除内容后问题得到解决:

<dependency>
    <groupId>com.github.markusbernhardt</groupId>
    <artifactId>robotframework-selenium2library-java</artifactId>
    <version>1.4.0.7</version>
    <scope>test</scope>
    <exclusions>
        <exclusion>
            <artifactId>tools</artifactId>
            <groupId>com.sun</groupId>
        </exclusion>
    </exclusions>  
</dependency>

这种排除似乎没有任何不利影响。


1
对我有用,问题出现在将Java 6代码库升级到Java 8时。 - jasonoriordan
我已经确认了spotbugs-maven-plugin是我的罪魁祸首,谢谢! - timbru31
历史记录中的备注:如果没有使用eclipse,你可以使用mvn dependency:tree和grep命令来查找依赖关系。 - eis

28

我遇到了相同的问题,解决办法是将 tools.jar 的依赖位置添加到 pom.xml 中。像这样:

 <dependency>
   <groupId>com.sun</groupId>
   <artifactId>tools</artifactId>
   <version>1.6</version>
   <scope>system</scope>
   <systemPath>C:\Program Files\Java\jdk1.6.0_29\lib\tools.jar</systemPath>
 </dependency>

请确保将 <systemPath> 更改为您的 tools.jar 文件所在的位置。


51
我强烈建议不要这样做——虽然它可以解决问题,但无法在其他开发者或构建环境中移植。请查看其他答案,它们似乎能解决问题。 - Roy Truelove
也许更好的做法是将 systemPath 更改为 <systemPath>${java.home}/lib/plugin.jar</systemPath>。 - Guilherme Santos
https://dev59.com/83A75IYBdhLWcg3w1sv2 介绍了如何以便携的方式实现此操作。 - vorburger
我修改了pom.xml文件,像这样(强制使用新版本的java-md-doclet),错误就消失了:<dependencyManagement> <dependencies> <dependency> <groupId>com.github.iotaledger</groupId> <artifactId>java-md-doclet</artifactId> <version>2.1.3</version> </dependency> </dependencies> </dependencyManagement> - Samir 007
我们如何在Mac上编写相同的路径? - dinesh kandpal

9

我也遇到了和Windows 7相同的问题。最终,我在eclipse.ini文件中添加了两行:

-vm 
C:\Program Files\Java\jdk1.6.0_35\bin

我试着使用%JAVA_HOME%,但没有成功。

3
给未来的我:这段代码必须放在“-vmargs”那一行之前,因为该行之后的任何内容都将被解释为虚拟机启动参数。所以:就在那一行的前面! - eis
这个解决方案在-vmargs之前使用-vm是关键!谢谢! - Taber

9

我也遇到了相同的问题

可能是由于以下任何一种原因-->

  1. 您安装了JRE而不是JDK。(请安装JDK)
  2. JDK路径配置不正确或者您的IDE使用错误的SDK (在Intellij中可以查看项目结构)
  3. 您正在使用错误的JDK版本,自JDK9版本起已删除tools.jar (https://docs.oracle.com/en/java/javase/13/migrate/migration-guide.pdf) ,为此您可以通过使用正确的JDK(<9)来解决。 Oracle迁移文档中的截图

6
我在Eclipse 4.3设置中解决了这个问题 - 只需将JDK库添加到JRE的库中即可。
依次点击“Windows” -> “Preferences” -> “Java” -> “Installed JREs”,选择JDK并点击“Edit”按钮,然后再点击“Add External JARs”按钮并添加tools.jar文件(位于JDK/lib目录下)。

6

请检查您机器上的JDK版本和pom.xml文件中的版本是否相同,两者应该保持一致。

<dependency>
    <groupId>sun.jdk</groupId>
    <artifactId>tools</artifactId>
    <version>1.8</version>
    <scope>system</scope>
    <systemPath>C:\Program Files\Java\jdk1.8.0_192\lib\tools.jar</systemPath>
</dependency>

5
如果这个问题仍然存在,可能是因为JDK的版本等于或大于11。在这些JDK中,lib文件夹中已经移除了tools.jar存档文件(参见类似问题的答案)。如果是这种情况,请尝试使用其他版本的库,不要依赖于com.sun:tools库。

4
如果您在新安装/升级的操作系统上看到此消息,则只是因为未正确设置JAVA_HOME
我们需要正确设置JAVA_HOME。例如,在macOS上:
如果我想使用Java版本1.8.0_261
export JAVA_HOME=`/usr/libexec/java_home -v 1.8.0_261`

这在2021年的Mac OS Big Sur上对我有效。 - Sankalp

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