Eine weitere funktionierende Lösung mit Instrumentation, die bei mir funktioniert. Sie hat den Vorteil, dass sie die Suche des Klassenladers modifiziert und Probleme mit der Sichtbarkeit von Klassen für abhängige Klassen vermeidet:
Erstellen einer Agentenklasse
In diesem Beispiel muss es sich um dasselbe jar handeln, das über die Befehlszeile aufgerufen wird:
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);
}
}
}
Ändern Sie die Datei MANIFEST.MF
Hinzufügen des Verweises auf den Agenten:
Launcher-Agent-Class: agent.Agent
Agent-Class: agent.Agent
Premain-Class: agent.Agent
Ich verwende eigentlich Netbeans, also diese Stelle Hilfe bei der Änderung der manifest.mf
Laufen
En Launcher-Agent-Class
wird nur von JDK 9+ unterstützt und ist für das Laden des Agenten verantwortlich, ohne dass er explizit auf der Kommandozeile definiert wird:
java -jar <your jar>
Die Art und Weise, wie das unter JDK 6+ funktioniert, ist die Definition der -javaagent
Argument:
java -javaagent:<your jar> -jar <your jar>
Hinzufügen neuer Jar zur Laufzeit
Mit dem folgenden Befehl können Sie dann je nach Bedarf jar hinzufügen:
Agent.appendJarFile(new JarFile(<your file>));
Ich habe keine Probleme bei der Verwendung dieser Dokumentation festgestellt.