Otra solución de trabajo usando Instrumentación que funciona para mí. Tiene la ventaja de modificar la búsqueda del cargador de clases, evitando problemas en la visibilidad de las clases dependientes:
Crear una clase de agente
Para este ejemplo, tiene que estar en el mismo jar invocado por la línea de 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);
}
}
}
Modificar el MANIFEST.MF
Agregar la referencia al agente:
Launcher-Agent-Class: agent.Agent
Agent-Class: agent.Agent
Premain-Class: agent.Agent
De hecho, uso Netbeans, por lo que esta publicación me ayuda a cambiar el manifiesto.
Corriendo
El Launcher-Agent-Class
solo es compatible con JDK 9+ y es responsable de cargar el agente sin definirlo explícitamente en la línea de comando:
java -jar <your jar>
La forma en que funciona en JDK 6+ es definir el -javaagent
argumento:
java -javaagent:<your jar> -jar <your jar>
Agregar nuevo Jar en tiempo de ejecución
Luego puede agregar jar según sea necesario con el siguiente comando:
Agent.appendJarFile(new JarFile(<your file>));
No encontré ningún problema al usar esto en la documentación.