Ще одне робоче рішення з використанням інструментарію, яке працює для мене. Він має перевагу модифікувати пошук завантажувача класів, уникаючи проблем із видимістю класів для залежних класів:
Створіть клас агента
У цьому прикладі він повинен знаходитися в тому ж банку, на який викликається командний рядок:
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, тому ця публікація допомагає змінити маніфест.mf
Біг
Підтримується Launcher-Agent-Class
лише в JDK 9+ і відповідає за завантаження агента, не чітко визначаючи його в командному рядку:
java -jar <your jar>
Спосіб, що працює на JDK 6+, визначає -javaagent
аргумент:
java -javaagent:<your jar> -jar <your jar>
Додавання нового Jar під час виконання
Потім можна додати банку за необхідності за допомогою наступної команди:
Agent.appendJarFile(new JarFile(<your file>));
Я не знайшов жодних проблем, використовуючи це в документації.