diff --git a/one-java-agent-plugin/src/main/java/io/oneagent/plugin/TraditionalPlugin.java b/one-java-agent-plugin/src/main/java/io/oneagent/plugin/TraditionalPlugin.java index 3134402..c5a94b8 100644 --- a/one-java-agent-plugin/src/main/java/io/oneagent/plugin/TraditionalPlugin.java +++ b/one-java-agent-plugin/src/main/java/io/oneagent/plugin/TraditionalPlugin.java @@ -7,6 +7,7 @@ import java.net.URL; import java.util.Properties; import java.util.jar.JarFile; +import java.util.jar.Manifest; import io.oneagent.plugin.classloader.PluginClassLoader; import io.oneagent.plugin.config.PluginConfig; @@ -96,15 +97,29 @@ public void start() throws PluginException { } Class clazz = null; - if (this.pluginConfig.isAppendToSystemClassLoaderSearch()) { - this.instrumentation.appendToSystemClassLoaderSearch(new JarFile(agentJarFile)); - this.parentClassLoader = ClassLoader.getSystemClassLoader(); - } else { - this.parentClassLoader = new PluginClassLoader(new URL[] { agentJarFile.toURI().toURL() }, - this.getClass().getClassLoader()); + if(this.pluginConfig.isAppendToSystemClassLoaderSearch()){ + JarFile agentJar = null; + try { + agentJar = new JarFile( agentJarFile, false); + verifyJarManifestMainClassIsThis(agentJarFile, agentJar); + instrumentation.appendToBootstrapClassLoaderSearch(agentJar); + instrumentation.appendToSystemClassLoaderSearch(agentJar); + clazz = Class.forName(className,false,null); + } catch (IOException e) { + throw new PluginException("agentJar",e); + } + }else{ + if (this.pluginConfig.isAppendToSystemClassLoaderSearch()) { + this.instrumentation.appendToSystemClassLoaderSearch(new JarFile(agentJarFile)); + this.parentClassLoader = ClassLoader.getSystemClassLoader(); + } else { + this.parentClassLoader = new PluginClassLoader(new URL[] { agentJarFile.toURI().toURL() }, + this.getClass().getClassLoader()); + } + + clazz = parentClassLoader.loadClass(className); } - clazz = parentClassLoader.loadClass(className); // 反射调用启动 Method method = clazz.getMethod(methodName, String.class, Instrumentation.class); @@ -115,6 +130,18 @@ public void start() throws PluginException { } + private static void verifyJarManifestMainClassIsThis(File jarFile, JarFile agentJar) + throws IOException { + Manifest manifest = agentJar.getManifest(); + if (manifest.getMainAttributes().getValue("Premain-Class") == null) { + throw new IllegalStateException( + "The agent was not installed, because the agent was found in '" + + jarFile + + "', which doesn't contain a Premain-Class manifest attribute. Make sure that you" + + " haven't included the agent jar file inside of an application uber jar."); + } + } + @Override public void stop() throws PluginException { // TODO Auto-generated method stub diff --git a/one-java-agent-plugin/src/main/java/io/oneagent/plugin/config/TraditionalPluginConfigImpl.java b/one-java-agent-plugin/src/main/java/io/oneagent/plugin/config/TraditionalPluginConfigImpl.java index 7556cf0..71e0215 100644 --- a/one-java-agent-plugin/src/main/java/io/oneagent/plugin/config/TraditionalPluginConfigImpl.java +++ b/one-java-agent-plugin/src/main/java/io/oneagent/plugin/config/TraditionalPluginConfigImpl.java @@ -23,6 +23,8 @@ public class TraditionalPluginConfigImpl extends PluginConfigImpl { private boolean appendToSystemClassLoaderSearch; + private boolean appendToBootstrapClassLoaderSearch; + private String agentArgs; @@ -37,6 +39,8 @@ public TraditionalPluginConfigImpl(Properties globalProperties, Properties plugi this.appendToSystemClassLoaderSearch = this.propertyResolver.getProperty("appendToSystemClassLoaderSearch", Boolean.class, Boolean.TRUE); + this.appendToBootstrapClassLoaderSearch = this.propertyResolver.getProperty("appendToBootstrapClassLoaderSearch", Boolean.class, Boolean.FALSE); + } @@ -48,6 +52,10 @@ public boolean isAppendToSystemClassLoaderSearch() { return appendToSystemClassLoaderSearch; } + public boolean isAppendToBootstrapClassLoaderSearch() { + return appendToBootstrapClassLoaderSearch; + } + public String getAgentArgs() { return agentArgs; }