Ошибка jMockit при инициализации: java.lang.IllegalStateException: работает на JDK 9

jmockit не может инициализироваться в eclipse: java.lang.IllegalStateException: для работы на JDK 9 требуется -javaagent: /jmockit-1.n.jar или -Djdk.attach.allowAttachSelf

Если я добавлю аргумент -Djdk.attach.allowAttachSelf VM, он будет работать нормально.

Зачем мне добавлять этот аргумент? jmockit не говорит, что это требуется при работе на JDK 9. Да, системная библиотека JRE указывает на JDK, и да, jmockit jar находится выше junit в порядке внешних библиотек.

Версии: JUnit 4.12, Java jdk 9.0.1, jmockit 1.37, hamcrest core 1.3

-Djdk.attach.allowAttachSelf аргумент vm, работает нормально.


person user2706641    schedule 28.11.2017    source источник
comment
@Rogerio, ха, у меня всегда возникают проблемы с чтением документации ...   -  person Rogério    schedule 28.11.2017
comment
Я бы сказал, что реальная причина заключается в том, что какой-то инженер Oracle JDK принял это произвольное, неэффективное и, в конечном итоге, бессмысленное решение добавить флаг командной строки как способ предотвратить вредоносный код от байт-кода, инструментирующего работающую JVM. . Тот факт, что библиотека может легко обойти флаг, создав новый процесс, который затем присоединяется к исходному процессу, доказывает, что флаг не дает ничего полезного. Вместо этого им просто следовало полагаться на уже существующий _1_.   -  person user2706641    schedule 29.11.2017


Ответы (1)


Зачем мне добавлять этот аргумент?

Аргумент в JDK9 используется для подключения к самой локальной виртуальной машине, другими словами, для самостоятельного подключения.

jmockit в основном использует самоприсоединение для Instrumentation, и именно здесь они могут потребовать такой флаг. Кроме того, этот аргумент должен игнорироваться в JDK8 или более ранней версии.

Первоначальное обсуждение того же можно найти на список рассылки jigsaw.

Аналогичное обсуждение и обходной путь были предложены на byte-buddy # 295 @Rafael: -


ByteBuddyAgent.install() теперь обнаруживает виртуальные машины Java 9, где самоприкрепление запрещено, и создает вспомогательный процесс для подключения оттуда.

Обратите внимание, что JMockit действительно говорит, что это требуется (ну, или с использованием -Djdk.attach.allowAttachSelf) в JDK 9, в сообщении об исключении! Лучше, чем документация, которую большинство людей никогда не читает ...

person Naman    schedule 28.11.2017
comment
@ Rogério Ну, я согласен с мыслью, что флаг кажется не очень эффективным. Может быть, Алан (если) мог бы просмотреть это и предоставить некоторые подробности с точки зрения эффективности. - person Rogério; 28.11.2017
comment
Проблема № 544 была подана с просьбой, чтобы JMockit реализовал аналогичное решение для Byte Buddy, чтобы этот флаг больше не нужен. - person Naman; 28.11.2017
comment
java.lang.ExceptionInInitializerError в testClass.testMethod (testClass.java:20) в java.base / jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) в java.base / jdk.internal.reflectd.NativeAccess (NativeMethod) .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.runReflectiveCall (FrameworkMethod.java:50) по адресу org.junit.internal.runners.model.ReflectiveCallable.run (ReflectiveCallable.java:12) по адресу org.junit.runners.modelhop. (FrameworkMethod.java:47) на org.junit.internal.runners.statements.InvokeMethod.evaluate (InvokeMethod.java:17) на org.junit.runners.ParentRunner.runLeaf (ParentRunner.java:325) на org.java:325). runners.BlockJUnit4ClassRunner.runChild (BlockJUnit4ClassRunner.java:78) в org.j unit.runners.BlockJUnit4ClassRunner.runChild (BlockJUnit4ClassRunner.java:57) на org.junit.runners.ParentRunner $ 3.run (ParentRunner.java:290) на org.junit.runners.ParentRunner.java $ 1.scheduler. по адресу org.junit.runners.ParentRunner.runChildren (ParentRunner.java:288) по адресу org.junit.runners.ParentRunner.access $ 000 (ParentRunner.java:58) по адресу org.junit.runners.ParentRunner $ 2.Runneruate (ParentRunner $ 2.evaluate.java : 268) на org.junit.runners.ParentRunner.run (ParentRunner.java:363) на org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run (JUnit4TestReference.java:86) на orjd.eclipse. internal.junit.runner.TestExecution.run (TestExecution.java:38) по адресу org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests (RemoteTestRunner.java:539) по адресу org.eclipse.jdun.internal.jdit. 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.Startialava.verify 137) на mockit.Invocations. (Invocations.java:26). .. еще 24 - person Thunderforge; 17.08.2018