Eine weitere funktionierende Lösung mit Instrumentation, die für mich funktioniert. Es hat den Vorteil, dass die Suche nach Klassenladeprogrammen geändert wird, wodurch Probleme bei der Sichtbarkeit von Klassen für abhängige Klassen vermieden werden:
Erstellen Sie eine Agentenklasse
In diesem Beispiel muss es sich in demselben JAR befinden, das von der 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 MANIFEST.MF
Hinzufügen des Verweises zum Agenten:
Launcher-Agent-Class: agent.Agent
Agent-Class: agent.Agent
Premain-Class: agent.Agent
Ich benutze tatsächlich Netbeans, daher hilft dieser Beitrag beim Ändern der manifest.mf
Laufen
Das Launcher-Agent-Class
wird nur von JDK 9+ unterstützt und ist für das Laden des Agenten verantwortlich, ohne ihn explizit in der Befehlszeile zu definieren:
java -jar <your jar>
Die Funktionsweise von JDK 6+ definiert das -javaagent
Argument:
java -javaagent:<your jar> -jar <your jar>
Hinzufügen eines neuen Glases zur Laufzeit
Sie können dann mit dem folgenden Befehl nach Bedarf jar hinzufügen:
Agent.appendJarFile(new JarFile(<your file>));
Ich habe in der Dokumentation keine Probleme damit gefunden.