Une autre solution de travail utilisant Instrumentation qui fonctionne pour moi. Il a l'avantage de modifier la recherche du chargeur de classe, en évitant les problèmes de visibilité des classes pour les classes dépendantes:
Créer une classe d'agent
Pour cet exemple, il doit être sur le même pot appelé par la ligne de commande:
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);
}
}
}
Modifiez le MANIFEST.MF
Ajout de la référence à l'agent:
Launcher-Agent-Class: agent.Agent
Agent-Class: agent.Agent
Premain-Class: agent.Agent
J'utilise en fait Netbeans, donc ce message aide à changer le manifest.mf
Fonctionnement
Le Launcher-Agent-Class
n'est pris en charge que sur JDK 9+ et est responsable du chargement de l'agent sans le définir explicitement sur la ligne de commande:
java -jar <your jar>
La façon dont cela fonctionne sur JDK 6+ définit l' -javaagent
argument:
java -javaagent:<your jar> -jar <your jar>
Ajout d'un nouveau pot au moment de l'exécution
Vous pouvez ensuite ajouter le pot si nécessaire à l'aide de la commande suivante:
Agent.appendJarFile(new JarFile(<your file>));
Je n'ai trouvé aucun problème en utilisant ceci sur la documentation.