2017-11-28 19 views
1

jmockit 실행 /jmockit-1.n.jar 또는 -Djdk.attach.allowAttachSelfjMockit 오류 java.lang.IllegalStateException가 : JDK 9 실행하면 -javaagent이 필요합니다 이클립스 초기화 할 수 없습니다 JDK에 9

-Djdk.attach.allowAttachSelf VM 인수를 추가하면 올바르게 작동합니다.

왜 그 인수를 추가해야합니까? jmockit은 JDK 9에서 실행될 때 필요하다고 말하지 않습니다. 예, JRE 시스템 라이브러리는 JDK를 가리키고 jmockit jar는 외부 라이브러리 순서대로 junit보다 위에 있습니다.

버전 : JUnit을 4.12, 자바 JDK 9.0.1가, 1.37, hamcrest 코어 jmockit 1.3

java.base에서 testClass.testMethod (testClass.java:20)에서 java.lang.ExceptionInInitializerError/ java.base에서 jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (기본 방법)/jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) 에서 java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl .invoke (DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect. Method.invoke org.junit.internal.runners.model.ReflectiveCallable.run에서 org.junit.runners.model.FrameworkMethod $ 1.runReflectiveCall (FrameworkMethod.java:50) 에서 (Method.java:564) (ReflectiveCallable. 자바 12) org.junit.runners.model.FrameworkMethod.invokeExplosively (FrameworkMethod.java:47) 에서 org.junit.internal.runners.statements.InvokeMethod.evaluate (InvokeMethod.java:17 AT)에서 org.junit.runners.BlockJUnit4ClassRunner.runChild에서 org.junit.runners.ParentRunner.runLeaf org.junit.runners.BlockJUnit4ClassRunner.runChild (BlockJUnit4ClassRunner.java:78)에서 (ParentRunner.java:325) (BlockJUnit4ClassRunner.java : 57) org.junit.runners.ParentRunner $ 3.run (ParentRunner.java:290) at org.junit.runners.ParentRunner $ 1.schedule (ParentRunner.java:71) at org.junit.runners.ParentRunner.runChildren (ParentRunner.java:290) .java : 288) at org.junit.runners.ParentRunner.access $ 000 (ParentRunner.java:58) at org.junit.runners.ParentRunner $ 2.evaluate (ParentRunner.java:268) at org.junit.runners .ParentRunner.run org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run (JUnit4TestReference.java:86)에서 (ParentRunner.java:363) org.eclipse.jdt.internal.junit.runner에서 . TestExecution.run (TestExecution.java:38) at 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) java.lang.IllegalStateException :에 의한 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main (RemoteTestRunner.java:207) 에서 /jmockit-1.n : JDK 9에서 실행이 -javaagent 필요 .JAR 또는 -Djdk.attach.allowAttachSelf mockit.internal.startup.AgentLoader.loadAgent (AgentLoader.java:60) 에서 mockit.internal.startup.AgentLoader.attachToRunningVM (AgentLoader.java:155) 에서 mockit.internal에서 .startup.Startup.verifyInitialization (Startup.java:137) mockit.Invocations에서 . (Invocations.java:26) ... 24 개

+0

예외 메시지에서 JMockit *은 JDK 9에서 필요합니다 (잘 또는'-javaagent'를 사용해야 함). 대부분의 사람들이 읽지 않는 문서보다 더 좋습니다 ... –

+0

@Rogerio, 하, 저는 항상 문서를 읽는 데 어려움을 겪습니다 ... – user2706641

답변

4

-Djdk.attach.allowAttachSelf VM 인수는, 그것을 잘 작동합니다.

왜 그 인수를 추가해야합니까?

JDK9의 인수는 자체 연결을 위해 로컬 VM 자체에 연결하는 데 사용됩니다.

jmockit은 주로 계측을 위해 자체 부착을 사용하며 이러한 플래그가 필요한 위치입니다. 또한 JDK8 이전 버전에서는이 인수를 무시해야합니다.

같은 이상 초기 논의는 jigsaw mailing list.


유사한 논의에서 볼 수 있습니다 및 해결 방법은 @Rafael에 의해 byte-buddy#295에서 제안되었다 : -

ByteBuddyAgent.install() 이제 자바 9 VM의 위치를 ​​감지 않는다 자체 첨부는 금지되어 있으며 여기에서 을 첨부하는 도우미 프로세스가 만들어집니다.

+1

일부 Oracle JDK 엔지니어가이 임의적 인, 부적절한 실행중인 JVM을 인스트루먼트하는 바이트 코드에서 악의적 인 코드를 막는 방법으로 명령 행 플래그를 추가하는 것은 비관적 인 결정입니다. 라이브러리가 새 프로세스를 작성하여 플래그 주위에서 쉽게 작업 할 수 있다는 사실은 원래 프로세스로 다시 첨부되어 플래그가 유용한 것을 얻지 못한다는 것을 증명합니다. 대신, 그들은 이미 존재하는'AttachPermission'에 의존해야합니다. –

+0

@ Rogério 글쎄, 나는 깃발이 매우 효과적이지는 않다고 생각한다. 어쩌면 Alan (if)이이를보고 어떤 효과가 있었는지에 대한 세부 정보를 제공 할 수 있습니다. – nullpointer