मेरे लिए काम करने वाले इंस्ट्रूमेंटेशन का उपयोग कर एक और काम कर समाधान। इसमें क्लास लोडर खोज को संशोधित करने, आश्रित कक्षाओं के लिए कक्षा दृश्यता में समस्याओं से बचने का लाभ है:
एक एजेंट वर्ग बनाएँ
इस उदाहरण के लिए, यह कमांड लाइन द्वारा लागू एक ही जार पर होना चाहिए:
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);
}
}
}
MANIFEST.MF को संशोधित करें
एजेंट का संदर्भ जोड़ना:
Launcher-Agent-Class: agent.Agent
Agent-Class: agent.Agent
Premain-Class: agent.Agent
मैं वास्तव में नेटबीन्स का उपयोग करता हूं, इसलिए यह पोस्ट मैनिफेस्टोफ को बदलने के तरीके पर मदद करती है
चल रहा है
Launcher-Agent-Class
केवल JDK 9+ पर समर्थित और स्पष्ट रूप से कमांड लाइन पर यह परिभाषित करने के बिना एजेंट लोड हो रहा है के लिए जिम्मेदार है:
java -jar <your jar>
JDK 6+ पर काम करने का तरीका -javaagent
तर्क को परिभाषित कर रहा है:
java -javaagent:<your jar> -jar <your jar>
रनटाइम में नया जार जोड़ना
फिर आप निम्न कमांड का उपयोग करके जार को आवश्यकतानुसार जोड़ सकते हैं:
Agent.appendJarFile(new JarFile(<your file>));
मुझे प्रलेखन पर इसका उपयोग करने में कोई समस्या नहीं आई।