Kolejne działające rozwiązanie z wykorzystaniem Instrumentacji, które działa dla mnie. Ma tę zaletę, że modyfikuje wyszukiwanie modułu ładującego klasy, unikając problemów z widocznością klas dla klas zależnych:
Utwórz klasę agenta
W tym przykładzie musi znajdować się w tym samym słoju wywołanym z wiersza poleceń:
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);
}
}
}
Zmodyfikuj plik MANIFEST.MF
Dodanie odwołania do agenta:
Launcher-Agent-Class: agent.Agent
Agent-Class: agent.Agent
Premain-Class: agent.Agent
Właściwie korzystam z Netbeans, więc ten post pomaga zmienić sposób manifestu.mf
Bieganie
Launcher-Agent-Class
Jest obsługiwana tylko w JDK 9+ i jest odpowiedzialny za ładowanie agenta bez wyraźnego zdefiniowania go w wierszu poleceń:
java -jar <your jar>
Sposób, w jaki działa JDK 6+, polega na zdefiniowaniu -javaagent
argumentu:
java -javaagent:<your jar> -jar <your jar>
Dodanie nowego słoika w Runtime
Następnie możesz dodać słoik, jeśli to konieczne, za pomocą następującego polecenia:
Agent.appendJarFile(new JarFile(<your file>));
Nie znalazłem żadnych problemów z korzystaniem z tego w dokumentacji.