缺失的构件 "sun.jdk:jconsole:jar:jdk"

16

在将Arquillian添加到Maven构建中时,我在Eclipse中遇到了上述异常:

缺失的构件 sun.jdk:jconsole:jar:jdk

    <dependency>
        <groupId>org.jboss.arquillian.junit</groupId>
        <artifactId>arquillian-junit-container</artifactId>
        <version>1.1.7.Final</version>
    </dependency>
    <dependency>
        <groupId>org.jboss.arquillian.extension</groupId>
        <artifactId>arquillian-persistence-dbunit</artifactId>
        <version>1.0.0.Alpha7</version>
    </dependency>

问题不在于消息本身,而是Eclipse因为它拒绝编译这个项目。但Maven工作正常。

当然,我首先尝试从Maven依赖项中排除它(依赖树指出依赖关系来自wildfly-arquillian-container-managed):

    <dependency>
        <groupId>org.wildfly</groupId>
        <artifactId>wildfly-arquillian-container-managed</artifactId>
        <exclusions>
            <exclusion>
                <artifactId>jconsole</artifactId>
                <groupId>sun.jdk</groupId>
            </exclusion>
        </exclusions>
    </dependency> 

没有任何改变。我尝试使用 -vm C:\Program Files\Java\jdk1.8.0_60\bin 启动 Eclipse,并尝试在“Preferences -> Installed JREs”中编辑JDK以包含工具目录中的JAR文件,但是没有任何作用。

我该怎么办?


我认为你的版本是错误的。arquillian-junit-containerarquillian-persistence-dbunit没有8.2.0.Final版本。 - James R. Perkins
@JamesR.Perkins 没错,你说得对,我从父级的_pom.xml_中复制了错误的版本。 - Stefan S.
同样的问题在这里得到了回答: 使用Maven依赖(jconsole-jdk.jar)出现的构建路径问题 - zsizsik
8个回答

14

我按照以下方式安装我的依赖项,它运行良好:

<dependency>
        <groupId>org.jboss.arquillian.junit</groupId>
        <artifactId>arquillian-junit-container</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.wildfly</groupId>
        <artifactId>wildfly-arquillian-container-embedded</artifactId>
        <version>8.1.0.CR1</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-simple</artifactId>
        <version>1.7.15</version>
        <scope>test</scope>
    </dependency>
    <!-- Arquillian -->

    <dependency>
        <groupId>org.wildfly</groupId>
        <artifactId>wildfly-embedded</artifactId>
        <version>8.1.0.CR1</version>
        <exclusions>
            <exclusion>
                <groupId>sun.jdk</groupId>
                <artifactId>jconsole</artifactId>
            </exclusion>
        </exclusions>
        <scope>test</scope>
    </dependency>

请注意,排除标签位于“wildfly-embedded”依赖项中...

不要忘记执行“mvn install”命令,并在项目上单击右键并选择“Maven Update”,如果无法正常运行,请尝试删除文件夹“~/.m2/repository”并重新下载所有依赖项。


7

Alastair,感谢您解决了这个问题。原因在于短暂依赖org.wildfly:wildfly-cli(8.2.0.Final)的pom文件中。您可以在那里找到以下依赖声明:

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

实际上,该jar包位于${java.home}/lib/jconsole.jar。顺便说一句:版本也不够用。因此,我从本地maven存储库中删除了这个版本。

这仍然影响到 org.wildfly.core:wildfly-core-parent:13.0.0.Beta4,在 Eclipse 中的有效 POM 解析为 <systemPath>C:\Program Files\Java\jre1.8.0_261/../lib/jconsole.jar</systemPath>,这是一个无效的路径。我的解决方法是创建缺失的目录,然后将 jconsole.jar 从 JDK(而不是 JRE)复制到新创建的目录中。 - Bae

4
在 Windows 机器上工作时,我遇到了这个问题。但在 Ubuntu 机器上项目本身运行得非常好。然而,在由瞬态的 org.wildfly:wildfly-ejb 依赖引起的情况下,项目构建失败并出现了上述错误信息。

Missing artifact sun.jdk:jconsole:jar:jdk

我认为不需要更改项目配置,因为它应该在所有环境中都可以正常工作,因此是 Windows 环境本身的问题。我的第一个想法是 Eclipse 自身以某种方式使用的是 JRE 而不是 JDK。
所以我在 CMD 中检查了 java -version,显示它指向安装在 /Program Files 文件夹中的 JRE,而我一直手动安装 JDK 在 /Java 文件夹中。然后我在 Windows 设置中检查了 %PATH% 环境变量。它似乎包括一个 /ProgramData/Oracle/Java/javapath。该文件夹包含一些符号链接到 /Program Files 文件夹中的 JRE。因此,这实际上被用来启动 Eclipse 并运行其所有任务。当我删除它(在 %PATH% 设置中已经有一个 JDK/bin)并重启 Eclipse 后重新执行 Maven 构建,错误消失了。
不需要对 pom.xml 或 Eclipse 配置进行任何更改。只需注意 Windows 背景中安装和更新的内容,并检查您的 %PATH% 是否仍然在顶部包含 JDK。

3
问题的原因是jconsole.jar是jdk的一部分,因此它不像普通的maven包那样分发。
通常,项目的pom.xml将这个jconsole.jar作为系统包插入,即它甚至不尝试从中央maven仓库下载。虽然也可以通过这种方式进行分发。
问题的最简单解决方法是使用包含这个jconsole.jar的jdk。
或者,您可以从任何地方下载这个jar文件,只需使其在编译类路径中可达。
另外,您还可以修改pom.xml文件,或者像其他答案所述,手动将该包安装到本地maven仓库中。

1

我花了一整天的时间来解决这个问题。简单的解决方法是手动使用maven安装缺失的jar包,例如:

c:\workspace\prism>mvn install:install-file -Dfile=C:\java\jdk\lib\jconsole.jar -DgroupId=sun.jdk -DartifactId=jconsole -Dversion=1.8 -Dpackaging=war。

谁知道为什么eclipse不能做到这一点...


0

也许更像是一种变通方法而不是一个正确的解决方案,但我通过在pom中删除"profile activebydefault"来解决了这个问题。这样,Eclipse就不会因为"Missing artifact sun.jdk:jconsole:jar:jdk"而抱怨,但JUnit测试将无法在Eclipse中运行——因为我只使用maven test进行测试,而不是Eclipse内置的JUnit运行器,所以只需要指定要针对哪个配置文件ID运行即可。


0

我遇到了相同的问题,但这些都不是完美的解决方案。以下是解决步骤:

  1. 检查您是否正确指向JDK位置: echo $JAVA_HOME
  2. 从IDE(我的是eclipse)打开pom.xml,选择Dependency Hierarchy,并搜索jconsole。如果您看到jconsole,则有时会将jconsole作为相互依赖关系给出,而给定的路径可能无法识别。排除该jar文件将解决此问题。

依赖关系层次结构

相互依赖的jconsole

排除jconsole


-2

我在搜索JDK的全名。(因为我曾经使用1.8.0_191,但更换电脑后变成了1.8.0_282)所以我在STS中进行了搜索。

在.factorypath文件中有一个字符串(Java路径),所以我进行了更改。

现在已经修复了。

大家可以尝试这种方法~


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