初始化时jMockit错误:java.lang.IllegalStateException:在JDK 9上运行
jmockit无法在eclipse中初始化: IllegalStateException:在JDK 9上运行需要 -javaagent:/jmockit-1.n.jar或-Djdk.attach.allowAttachSelf 如果我添加初始化时jMockit错误:java.lang.IllegalStateException:在JDK 9上运行,java,eclipse,junit,java-9,jmockit,Java,Eclipse,Junit,Java 9,Jmockit,jmockit无法在eclipse中初始化: IllegalStateException:在JDK 9上运行需要 -javaagent:/jmockit-1.n.jar或-Djdk.attach.allowAttachSelf 如果我添加-Djdk.attach.allowAttachSelfVM参数,它就可以正常工作 为什么我需要添加那个论点jmockit没有说明在jdk9上运行时需要这样做。是的,JRE系统库指向JDK,是的,JMockitJAR按照外部库的顺序位于junit之上 版本:JU
-Djdk.attach.allowAttachSelf
VM参数,它就可以正常工作
为什么我需要添加那个论点jmockit
没有说明在jdk9上运行时需要这样做。是的,JRE系统库指向JDK,是的,JMockitJAR按照外部库的顺序位于junit之上
版本:JUnit4.12、Java jdk 9.0.1、jmockit 1.37、hamcrest core 1.3
java.lang.ExceptionInInitializerRor位于
testClass.testMethod(testClass.java:20)位于
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(本机
方法)在
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
在
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
位于java.base/java.lang.reflect.Method.invoke(Method.java:564)
org.junit.runners.model.FrameworkMethod$1.runReflectVeCall(FrameworkMethod.java:50)
在
org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
在
org.junit.runners.model.FrameworkMethod.invokeeexplosive(FrameworkMethod.java:47)
在
org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
位于org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
在
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
位于org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)位于
org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)位于
org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)位于
org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)位于
org.junit.runners.ParentRunner.run(ParentRunner.java:363)位于
org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
在
org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
在
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:539)
在
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:761)
在
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:461)
在
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:207)
原因:java.lang.IllegalStateException:在JDK 9上运行需要
-javaagent:/jmockit-1.n.jar或-Djdk.attach.allowAttachSelf位于mockit.internal.startup.AgentLoader.attachToRunningVM(AgentLoader.java:155)
位于mockit.internal.startup.AgentLoader.loadAgent(AgentLoader.java:60)
在
mockit.internal.startup.startup.verifyInitialization(startup.java:137)
在mockit.Invocations.(Invocations.java:26)。。。还有24个
-Djdk.attach.allowAttachSelf
vm参数,工作正常
为什么我需要添加那个论点
JDK9中的参数用于附加到本地VM本身,换句话说,用于自附加
jmockit
主要使用一个self-attach进行检测,这就是他们需要这样一个标志的地方。此外,在JDK8或以前版本上,必须忽略此参数
关于这一问题的初步讨论可在
以下与会者提出了类似的讨论和解决方案:-
ByteBuddyAgent.install()
现在检测Java 9虚拟机,其中
禁止自连接,并创建要连接的辅助进程
从那里开始
请注意,JMockit在异常消息中确实表示jdk9上需要它(或者使用
-javaagent
)!比大多数人从未阅读过的文档要好…@Rogerio,哈,我总是在阅读文档时遇到麻烦…我想说真正的原因是因为某个Oracle JDK工程师做出了这个武断、无效的决定,最后,添加一个命令行标志作为防止恶意代码通过字节码检测正在运行的JVM的一种方式,这是一个非理性的决定。一个库可以通过创建一个新的进程来轻松地绕过该标志,然后将该进程附加回原始进程,这一事实证明该标志没有实现任何有用的功能。相反,他们应该仅仅依赖于已经存在的AttachPermission
。@Rogério嗯,我认为这个标志似乎不是很有目的。也许Alan(如果)可以看到这一点,并提供一些关于效果的细节。已提交申请,要求JMockit实现与Byte Buddy类似的解决方案,以便不再需要此标志。