jmockit:此JRE中未提供Attach API的本机库错误。

25

我尝试使用 jmockit 对我的项目进行单元测试,但是遇到了以下错误:

java.lang.UnsatisfiedLinkError: no attach in java.library.path
java.lang.IllegalStateException: Native library for Attach API not available in this JRE
    at mockit.internal.startup.JDK6AgentLoader.getVirtualMachineImplementationFromEmbeddedOnes(JDK6AgentLoader.java:95)
    at mockit.internal.startup.JDK6AgentLoader.loadAgent(JDK6AgentLoader.java:54)
    at mockit.internal.startup.AgentInitialization.initializeAccordingToJDKVersion(AgentInitialization.java:21)
    at mockit.internal.startup.Startup.initializeIfNeeded(Startup.java:98)
    at mockit.internal.startup.Startup.initializeIfPossible(Startup.java:112)
    at org.junit.runner.Runner.<clinit>(Runner.java:22)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
    at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
    at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.<init>(JUnit4TestReference.java:33)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestClassReference.<init>(JUnit4TestClassReference.java:25)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:48)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:452)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: java.lang.UnsatisfiedLinkError: no attach in java.library.path

我已经分别将jdk6/lib/tools.jar、jmockit.jar和junit.jar包含在类路径中,但是为什么会出现这种情况呢?


8个回答

50

进入你的项目的Java Build Path并更改JRE System Library使其指向jdk而不是jre。


10

你需要的不是 tools.jar,而是"Attach API"的本地库文件:attach.dll (或者Linux/Mac的等效物attach.so���。纯粹的JRE中不包含这个库文件。相反的,请将Eclipse指向一个包含jre/bin/attach.dll文件的JDK安装。


谢谢。但是你如何将Eclipse指向JDK安装?我尝试了Window->Java->Installed JREs->add->jdk目录,但没有帮助。 - Dao Lam
从Eclipse的“已安装的JRE”(窗口-> Java->已安装的JRE)选项卡中删除JRE安装路径。仅指定JDK安装路径。 - Krishna Roy

7
将attach.dll路径添加到您的PATH环境变量中。

9
这个答案在“它能用”的意义上是正确的,但根本原因是使用了jre而不是jdk。应该采纳另一个答案。 - L. Holanda

5
你需要设置代理。如果你使用的是eclipse,可以设置VM参数,参数如下:
-javaagent:本地路径到你的jmockit jar\jmockit.jar 例如:-javaagent:D:\jmockit.jar

2

看起来你需要将Eclipse指向JDK而不是JRE。

步骤:Windows->首选项>Java>“已安装的JRE”中删除JRE,并添加JDK,浏览到你的JDK位置并选择为默认。


2

Dao Lam, 以下是其他尝试方法:

  • 确保您的项目使用以下之一:
    • 工作区默认项(假定默认项是您刚刚添加的jdk安装。从添加它的窗口中,确保它被选中),
    • jdk版本,或者
    • 使用jdk版本的执行环境。
  • 打开系统的环境变量,并将此路径添加到其中:(jdk_dir)/jre/bin。(请记住,保存后必须重新启动Eclipse才能生效)。
  • 关闭Eclipse,并修改用于启动它的快捷方式以使用(jdk_dir)/jre/bin。

我发现这些措施中的任何一个都可以让Eclipse找到attach.dll。


0

我在64位Windows上使用JDK 1.8.45和1.8.80时遇到了这个问题。我的解决方案是将JDK的./jre/bin目录中的attach.dll复制到./bin中。这样就不需要更新Eclipse和Cygwin命令行以及非标准JAVA_HOME。

也许Windows版本可能会忽略JRE目录的内容?


如果您尝试在另一台机器上编译,这并没有什么帮助。 - MKorsch

0
我在IntelliJ中运行一个maven项目,我很确定我正在使用JDK而不是JRE。最后我找到了适合我的解决方案,就是在maven-surefire-plugin中配置-javagent来使用jmockit,配置如下:
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
        <argLine>-javaagent:"${settings.localRepository}"/org/jmockit/jmockit/1.14/jmockit-1.14.jar</argLine>
    </configuration>
</plugin>

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