缺少工件com.sun:工具:jar

时间:2011-12-04 12:54:23

标签: java maven playn

我一直在关注入门教程,但在使用Maven导入playn项目后卡住了。我正在使用在64位Windows 7上运行的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>

27 个答案:

答案 0 :(得分:53)

我刚刚在this question上发布了关于同一问题以及我如何解决它的问题,但我也会粘贴(并展开)它,因为它似乎更相关。

在Windows 7中使用Eclipse时遇到了同样的问题,即使我在Eclipse设置中从JRE列表中删除了JRE,并且只是在那里使用了JDK。

我最终必须做的事情(正如您在问题中提到的那样)修改命令行以获取用于启动Eclipse的快捷方式,以便像这样添加-vm参数:

-vm "T:\Program Files\Java\jdk1.6.0_26\bin"

当然,您可以将其调整为指向您的 JDK安装的bin目录。这样做是因为Eclipse本身使用JDK而不是JRE运行,然后它能够​​正确地找到tools.jar

我认为这与Eclipse在没有指定时发现默认JRE的方式有关。我猜它倾向于更喜欢JRE而不是JDK(为什么,我不知道)并且找到它发现的第一个兼容的JRE。如果像Vladiat0r的回答建议那样关闭Windows注册表项,它会首先查找HKLM\Software\JavaSoft\Java Runtime Environment密钥,而不是HKLM\Software\JavaSoft\Java Development Kit密钥。

答案 1 :(得分:23)

我遇到了同样的问题,我能够解决它的方法是将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文件所在的位置。

答案 2 :(得分:23)

在开发简单的Web服务应用程序时遇到了同样的问题,在我的情况下,我必须添加一个codehous插件才能获得jaxws库。但是,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>

他们建议包含工具罐的排除声明,它可以工作。总结一下:您可以在依赖项中包含排除规则,并避免出现tool.jar问题:

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

答案 3 :(得分:13)

其他答案都没有为我做过。检查&#34;依赖层次结构&#34;是什么? eclipse中的pom.xml,它提供了一个过滤器&#39;工具&#39;透露我对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>

排除似乎没有任何缺点。

答案 4 :(得分:6)

我在Eclipse 4.3设置中解决了这个问题 - 只是将JDK库添加到JRE的库中。

Go windows - &gt;设置 - &gt; Java - &gt;已安装的JRE - &gt;选择JDK并单击编辑 - &gt;单击Add External JARs并添加tools.jar(放在JDK / lib中)

答案 5 :(得分:5)

与我和Windows 7相同。我最后在eclipse.ini添加两行:

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

我尝试在那里使用%JAVA_HOME%,但它没有用。

答案 6 :(得分:4)

如果仍然出现此问题,则可能是因为JDK版本等于或大于11。

tools.jar存档已从那些JDK的lib文件夹中删除(请参阅this answer到类似的问题)。 在这种情况下,请尝试使用不依赖com.sun:tools库的其他版本的库。

答案 7 :(得分:4)

检查您机器上的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>

答案 8 :(得分:3)

经过一段时间的努力,我终于让它与eclipse.ini而不是命令行一起工作了。在最后阅读documentation后,我意识到-vm参数必须在一个单独的行上,不带引号,并且在任何-vmargs之前:

-vm
C:\Program Files\Java\jdk1.7.0_45\bin\javaw.exe

答案 9 :(得分:2)

我也遇到了同样的问题

可能是由于这些中的任何一个 -->

  1. 您安装的是 JRE 而不是 JDK。 (继续安装 JDK)
  2. JDK 路径配置不正确或您的 IDE 使用了完全错误的 SDK(如果是 Intellij,请参阅项目结构)
  3. 您使用了错误的 JDK 版本,自版本 9 (https://docs.oracle.com/en/java/javase/13/migrate/migration-guide.pdf) 起,tools.jar 已从 jdk 中删除 为此,您可以通过使用适当的 JDK(< 9) 来解决 Screenshot from Oracle migration doc

答案 10 :(得分:1)

在pom文件的有效POM选项卡中,我看到以下派生路径: C:\Program Files\Java\jre6/../lib/tools.jar我认为它不是Windows中的有效路径。我尝试在jre6 / lib文件夹以及Java / lib中复制tools.jar但没有成功。

值“C:\ Program Files \ Java \ jre6”来自注册表

HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment\1.6.0_30
HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment\1.6

并将JavaHome键设置为jdk JRE的安装位置。然后所有编译器错误都消失了。

重新安装JDK没有修复它。设置JAVA_HOME或java.home系统环境变量没有帮助。

我见过的另一种选择是在每个pom xml文件中添加具有正确路径的依赖项,但是playn-samples有很多文件,这是一个非常痛苦的编辑。

这是有效的POM结果,显示了错误的路径!

 <dependency>
      <groupId>com.sun</groupId>
      <artifactId>tools</artifactId>
      <version>1.6</version>
      <scope>system</scope>
      <systemPath>C:\Program Files\Java\jre6/../lib/tools.jar</systemPath>
      <optional>true</optional>
    </dependency>

答案 11 :(得分:1)

如果在新安装/升级的操作系统上看到此错误,那是因为JAVA_HOME设置不正确。

我们需要正确设置JAVA_HOME。例如在Mac上: 如果我想使用Java版本1.8.0_261

export JAVA_HOME=`/usr/libexec/java_home -v 1.8.0_261`

答案 12 :(得分:1)

我得到了类似的错误。 这是因为在Eclipse中没有正确设置JDK。 Cucumber需要JDK和JRE,因此在pom.xml中添加以下依赖项

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

答案 13 :(得分:1)

正如其他海报所述,这里的问题与日食所使用的JRE有关,因为它无法找到工具罐。我解决了这个问题的方向与上面提到的方向不同,这是因为我的项目和环境的方式。

Eclipse 4.5至少需要Java 7 for runtime,所以我的系统设置是使用位于C:\ java \ jre1.8.0_45的Java 8 JRE。

接下来,我正在使用一个POM文件,假设我正在运行Java 6 JDK。

  <profiles>
    <profile>
      <id>default-profile</id>
      <activation>
        <activeByDefault>true</activeByDefault>
        <file>
          <exists>${java.home}/../lib/tools.jar</exists>
        </file>
      </activation>
      <properties>
        <toolsjar>${java.home}/../lib/tools.jar</toolsjar>
      </properties>
    </profile>
    <profile>
      <id>osx_profile</id>
      <activation>
        <activeByDefault>false</activeByDefault>
        <os>
          <family>mac</family>
        </os>
      </activation>
      <properties>
        <toolsjar>${java.home}/../Classes/classes.jar</toolsjar>
      </properties>
    </profile>
  </profiles>

  <dependencies>
    <dependency>
      <groupId>com.sun</groupId>
      <artifactId>tools</artifactId>
      <version>1.6.0</version>
      <scope>system</scope>
      <systemPath>${toolsjar}</systemPath>
    </dependency>
  </dependencies>

我不允许更改POM文件,所以我不得不做一些jiggery pokery。我从我的Java 6 JDK复制了tools.jar,创建了目录C:\ java \ lib并将其粘贴到那里。然后我重新启动了eclipse并清理了我的项目。而VOILA错误消失了。

这不是一个优雅的解决方案,我认为正确的解决方案是改变POM的设置方式,但正如我无法做到的那样,这是有效的。

答案 14 :(得分:1)

在pom.xml文件中添加此依赖项。希望这有帮助。
<systemPath>属性中,您必须编写jdk lib路径..

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

答案 15 :(得分:0)

在完成上述所有操作后,我仍然遇到同样的问题。

  • PATH环境变量指向JDK 1.7 \ bin
  • 我的JAVA_HOME环境变量指向JDK 1.7
  • 我的eclipse.ini有javaw -vm条目指向JDK 1.7
  • 我的eclipse首选项将JDK 1.7作为已安装的JRE。
  • 我的项目构建路径使用的是JDK 1.7。

然后我尝试了以下内容,

  • 打开命令提示符并键入java -version。它向我展示了JRE版本1.8。

  • 打开命令提示符并转到JDK 1.7 bin目录的位置并键入java -version。这次正确显示1.7。

然后在几个地方挖掘后,我发现除了上述位置之外,Java运行时还有其他位置。

<强>注册表

还有一个注册表项,其中JRE位置在

下指定
  

HKLM \ SOFTWARE \ JavaSoft的\版

我在这里更改了条目以指向JDK 1.7

<强> ProgramData

目录“C:\ ProgramData \ Oracle \ Java \ javapath”出现在PATH环境变量中,包含java,javaw等的快捷方式...... 这些快捷方式的目标都是JRE 1.8。 (我认为这是主要问题) 我更改了快捷方式以指向正确的JDK exe。

一旦完成所有这些。我打开eclipse所有的jdk.tools pom.xml错误都消失了。

答案 16 :(得分:0)

我遇到了这个问题,结果证明Windows上的JBossDevStudio 9.1是一个32位程序。 Eclipse以及JBossDevStudio不适用于错误类型的JVM。 64位eclipse需要一个64位JVM,32位eclipse需要一个32位JVM。因此,将Eclipse配置为使用我安装的64位JDK运行不起作用。

安装32位JDK并从中运行Eclipse解决了这个问题。

至少在我的一个项目中,我尝试在Eclipse项目属性中配置运行时JDK的另一个项目仍然存在。

答案 17 :(得分:0)

使用eclipse.ini修复结束:

openFile
-vm (Your Java Home JDK here)

例如,-vm C:\Java\JDK\1.6

还必须将JRE更改为JDK:

在Eclipse IDE中转到:

  1. 窗口 - &gt;偏好 - &gt;已安装的JRE
  2. 点击添加(找到新的JRE)
  3. 选择标准JVM - &gt;下一页
  4. 单击目录以找到JRE home,放置JDK_INSTALL_LOCATION并完成。
  5. 转到您的java项目的属性 - &gt; Java构建路径 - &gt;图书馆 - &gt;选择JRE - &gt;编辑 - &gt;选择工作区默认JRE - &gt;光洁度
  6. 使用项目进行完整的工作区清理 - &gt;干净。

答案 18 :(得分:0)

我通过从系统中卸载JRE并仅离开JDK解决了这个问题。重新安装JDK是不够的,因为Oracle JDK安装程序同时安装了JDK和JRE

顺便说一句,在我看来,这个错误导致了麻烦:java.home of the Eclipse JRE is used instead of the build JRE

答案 19 :(得分:0)

就我而言,我正在从Eclipse Run Configurations执行Maven Build。即使在将默认JRE配置更改为指向JDK安装文件夹之后,该问题也没有得到修复。原因是Maven Build - Run Configuration中有一个JRE选项卡(见下图)。它仍然指向我的JRE安装。我将其更改为指向JDK安装,然后运行Maven Build。这次,它奏效了。 enter image description here

答案 20 :(得分:0)

让我们了解为什么发生此问题:

  

$ mvn -version

     
    

Apache Maven 3.6.1(d66c9c0b3152b2e69ee9bac180bb8fcc8e6af555; 2019-04-04T20:00:29 + 01:00)     Maven主页:C:\ Program Files \ Apache \ maven-3.6.1     Java版本:1.8.0_221,供应商:Oracle Corporation,运行时:C:\ Program Files \ Java \ jre1.8.0_221     默认语言环境:en_GB,平台编码:Cp1252     操作系统名称:“ windows 10”,版本:“ 10.0”,拱门:“ amd64”,家族:“ windows”

  

Maven“ mvn -version”命令返回以上输出。

如果您未指定JAVA_HOME环境变量,我们可以看到maven将Java运行时路径获取为“ C:\ Program Files \ Java \ jre1.8.0_221”。然后,maven假定此路径为JAVA_HOME。这就是为什么从命令提示符或任何IDE构建应用程序时,maven会在路径“%JAVA_HOME%.. \ lib \ tools.jar”中寻找tools.jar文件的原因。

tools.jar存在于JDK路径中,因此我们需要在使用Maven之前提及它。现在,使用已经可用的jre构建机器,但是jdk仅用于开发。这可能就是Maven自动选择jre路径的原因。

有关更多帮助,请阅读maven安装路径中提供的代码mvn.cmd。

答案 21 :(得分:0)

问题是系统无法找到文件 tools.jar

因此,首先请检查该文件是否在目录的 JDK安装中。

enter image description here

使 POM.xml 中的以下条目正确指向其他人

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

然后按照以下步骤操作以解决问题

1)右键单击您的项目

2)单击构建路径

根据下图,选择工作区默认的JRE,然后单击完成。

enter image description here

答案 22 :(得分:0)

我在Windows 7和Eclipse 3.7上遇到了同样的问题 我设法通过启动来修复它

  

eclipse.exe -vm“D:\ JDK6 \ bin”

你可以启动一个cmd并启动这样的eclipse,或者你可以编辑你的快捷方式并在“目标部分”中添加-vm“D:\ JDK6 \ bin”作为参数。

作为旁注,我还试图将-vm“D:\ JDK6 \ bin”添加到eclipse.ini但是没有用。 添加JRE6将无法正常工作,因为它的“lib”目录中不包含tools.jar。只有JDK。

答案 23 :(得分:0)

我相信这些本地补丁会起作用。然而,这些可能会导致下游部署问题。我只是下载了一个带有 Java 11 的新版本 Eclipse,现在一切正常。

答案 24 :(得分:0)

另一种情景

  • JAVA_HOME 变量必须指向 Java 11+ 安装。
  • Maven 用于旧项目。新项目使用 Gradle。
  • 旧的 maven 项目使用 Java 8,如果我们使用 Java 9+,其中一些会因缺少 tools.jar 文件错误而中断。

一个解决方案

  • 编辑 mvn shell 脚本(Windows 上的 mvn.batmvn.cmd)并将 JAVA_HOME 设置为指向 JDK 8 安装。
  • 该脚本位于 apache maven 安装下的 /bin 目录中。
  • 设置变量的位置示例(Windows 脚本):
    @REM ==== START VALIDATION ====
    set JAVA_HOME=C:\Program Files\Java\jdk1.8.0_161

答案 25 :(得分:-1)

如果您使用的是openjdk,则需要安装openjdk-6-sdk软件包。

答案 26 :(得分:-1)

更改${java.home}/../lib/tools.jar与绝对路径的相对位置 C:\Program Files\Java\jdk1.6.0_29\lib\tools.jar对我有用。

您只需在playn/pom.xml

中更改它

现在对于playn-samples,Vladiator是对的,那太多的pom文件无法改变。