Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
初始化时jMockit错误:java.lang.IllegalStateException:在JDK 9上运行_Java_Eclipse_Junit_Java 9_Jmockit - Fatal编程技术网

初始化时jMockit错误:java.lang.IllegalStateException:在JDK 9上运行

初始化时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

jmockit无法在eclipse中初始化: IllegalStateException:在JDK 9上运行需要 -javaagent:/jmockit-1.n.jar或-Djdk.attach.allowAttachSelf

如果我添加
-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类似的解决方案,以便不再需要此标志。