Загрузить агент Java во время выполнения на OpenJDK?

Я нашел много ответов, указывающих на меня VirtualMachine#loadAgent, что, честно говоря, было бы здорово, за исключением того, что у меня нигде нет класса VirtualMachine. Я был довольно смущен этим, но у меня, похоже, нет API-интерфейса Attach. Я использую OpenJDK 8:

$ java -version
openjdk version "1.8.0_222"
OpenJDK Runtime Environment (build 1.8.0_222-b05)
OpenJDK 64-Bit Server VM (build 25.222-b05, mixed mode)

Какие есть еще способы загрузить Java-агент? Окружающая среда, в которой я работаю, имела бы очень небольшой успех при прохождении -javaagent: аргументы, так как он предназначен для внедрения в classpath во время выполнения, и, очевидно, любой обычный пользователь не захочет / не будет иметь знания, чтобы вручную изменять аргументы JVM только для моей конкретной программы.

С другой стороны, просто чтобы убедиться, что этот класс является частью OpenJDK, так как он не предназначен только для виртуальной машины Java, я загрузил код OpenJDK с http://hg.openjdk.java.net/ и нашел файл VirtualMachine.java, что означает, что он определенно должен существовать

1 ответ

Решение

Я нашел много ответов, указывающих на меня VirtualMachine::loadAgent, что честно было бы здорово, если не считать VirtualMachine класс, где угодно.

Давайте начнем этот Javadocs для VirtualMachine а также VirtualMachineDescriptor

Очевидно, что VirtualMachine класс определяется библиотеками классов Java, поэтому класс существует. Поэтому вопрос в том, почему вы не можете найти сам класс во время компиляции и / или во время выполнения.

Для более старых JVM до Java 6, VirtualMachine класс был полувнутренным, и вам нужно было получить к нему доступ из tools.jar файл:

Когда VirtualMachine класс стал официальным API в Java 6, его имя изменилось на com.sun.tools.attach.VirtualMachine, Тем не менее, это было еще в tools.jar файл, а не основной rt.jar файл. Это продолжалось до (и в том числе) Java 8.

В Java9 была представлена ​​система модулей, и все изменилось. ни rt.jar или же tools.jar существовать больше Чтобы получить доступ к этим классам сейчас (начиная с Java9), вам нужно включить requires java.attach в вашей module.info файл.

Другие вопросы по тегам