Outra solução de trabalho usando a Instrumentação que funciona para mim. Tem a vantagem de modificar a pesquisa do carregador de classes, evitando problemas na visibilidade de classes para classes dependentes:
Criar uma classe de agente
Para este exemplo, ele deve estar no mesmo jar chamado pela linha 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);
}
}
}
Modifique o MANIFEST.MF
Adicionando a referência ao agente:
Launcher-Agent-Class: agent.Agent
Agent-Class: agent.Agent
Premain-Class: agent.Agent
Na verdade, eu uso o Netbeans, portanto, este post ajuda a alterar o manifest.mf
Corrida
Ele Launcher-Agent-Class
é suportado apenas no JDK 9+ e é responsável por carregar o agente sem defini-lo explicitamente na linha de comandos:
java -jar <your jar>
A maneira que funciona no JDK 6+ é definir o -javaagent
argumento:
java -javaagent:<your jar> -jar <your jar>
Adicionando novo Jar em tempo de execução
Você pode adicionar jar conforme necessário, usando o seguinte comando:
Agent.appendJarFile(new JarFile(<your file>));
Não encontrei nenhum problema ao usar isso na documentação.