23

我试图使用 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。任何线索为什么会发生这种情况?

4

7 回答 7

48

转到项目的Java 构建路径并更改JRE 系统库并使其指向jdk而不是 jre。

于 2014-08-09T13:51:09.470 回答
10

这不是tools.jar您需要的,而是“附加 API”的本机库文件:(attach.dll或 Linux/Mac 等效文件attach.so或类似文件)。普通的 JRE 不包含此库。相反,将 Eclipse 指向应包含该jre/bin/attach.dll文件的 JDK 安装。

于 2012-08-15T13:05:33.683 回答
7

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

于 2012-10-08T20:26:54.117 回答
4

您必须设置代理。如果您使用的是 eclipse,则可以设置 VM 参数,并且 Args 将如下所示:

-javaagent:jmockit jar\jmockit.jar 的本地路径

例如:-javaagent:D:\jmockit.jar

于 2013-05-21T11:59:35.447 回答
2

道林,这里有一些其他的尝试:

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

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

于 2013-11-13T19:26:41.070 回答
2

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

步骤:Windows->Preferences>Java>“Installed JRE's”并从“Installed JRE's”窗口中删除 JRE,并将 JDK 浏览添加到您的 JDK 位置并选择为默认值。

于 2017-03-20T03:35:19.743 回答
0

我在 64 位 Windows 上发现 JDK 1.8.45 和 1.8.80 存在这个问题。我的解决方案是将attach.dll 从JDK 的./jre/bin 目录复制到./bin。这消除了使用非标准 JAVA_HOME 更新 Eclipse 和 Cygwin 命令行的需要。

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

于 2015-11-24T22:58:08.910 回答