Другое рабочее решение, использующее Инструментарий, которое работает для меня. Он имеет преимущество в изменении поиска загрузчика классов, избегая проблем с видимостью классов для зависимых классов:
Создать класс агента
В этом примере он должен находиться в том же банке, который вызывается из командной строки:
package agent;
import java.io.IOException;
import java.lang.instrument.Instrumentation;
import java.util.jar.JarFile;
public class Agent {
public static Instrumentation instrumentation;
public static void premain(String args, Instrumentation instrumentation) {
Agent.instrumentation = instrumentation;
}
public static void agentmain(String args, Instrumentation instrumentation) {
Agent.instrumentation = instrumentation;
}
public static void appendJarFile(JarFile file) throws IOException {
if (instrumentation != null) {
instrumentation.appendToSystemClassLoaderSearch(file);
}
}
}
Изменить MANIFEST.MF
Добавляем ссылку на агента:
Launcher-Agent-Class: agent.Agent
Agent-Class: agent.Agent
Premain-Class: agent.Agent
Я на самом деле использую Netbeans, так что этот пост помогает о том, как изменить manifest.mf
Бег
Поддерживается Launcher-Agent-Class
только в JDK 9+ и отвечает за загрузку агента без явного определения его в командной строке:
java -jar <your jar>
То, как работает JDK 6+, определяет -javaagent
аргумент:
java -javaagent:<your jar> -jar <your jar>
Добавление нового Jar во время выполнения
Затем вы можете добавить jar по мере необходимости, используя следующую команду:
Agent.appendJarFile(new JarFile(<your file>));
Я не нашел никаких проблем с использованием этого в документации.