Un'altra soluzione funzionante che utilizza la strumentazione che funziona per me. Ha il vantaggio di modificare la ricerca del caricatore di classi, evitando problemi di visibilità delle classi per le classi dipendenti:
Creare una classe agente
Per questo esempio, deve trovarsi sullo stesso jar invocato dalla riga di comando:
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);
}
}
}
Modifica MANIFEST.MF
Aggiunta del riferimento all'agente:
Launcher-Agent-Class: agent.Agent
Agent-Class: agent.Agent
Premain-Class: agent.Agent
In realtà uso Netbeans, quindi questo post aiuta su come cambiare manifest.mf
In esecuzione
È Launcher-Agent-Class
supportato solo su JDK 9+ ed è responsabile del caricamento dell'agente senza definirlo esplicitamente sulla riga di comando:
java -jar <your jar>
Il modo in cui funziona su JDK 6+ sta definendo l' -javaagent
argomento:
java -javaagent:<your jar> -jar <your jar>
Aggiunta di un nuovo Jar in fase di esecuzione
È quindi possibile aggiungere jar come necessario utilizzando il seguente comando:
Agent.appendJarFile(new JarFile(<your file>));
Non ho riscontrato alcun problema utilizzando questo sulla documentazione.