You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sirona.apache.org by rm...@apache.org on 2014/11/27 15:32:57 UTC
svn commit: r1642160 - in /incubator/sirona/trunk: agent/javaagent/
agent/javaagent/src/main/java/org/apache/sirona/javaagent/
agent/javaagent/src/test/java/org/apache/sirona/javaagent/
core/src/main/java/org/apache/sirona/configuration/
Author: rmannibucau
Date: Thu Nov 27 14:32:57 2014
New Revision: 1642160
URL: http://svn.apache.org/r1642160
Log:
finer config for javaagent runner + forcing fallback classloader for Configuration + upgrading asm + using system classloader for libs and not bootstrap one (to validate)
Modified:
incubator/sirona/trunk/agent/javaagent/pom.xml
incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/SironaAgent.java
incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/sirona/javaagent/AgentArgs.java
incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/sirona/javaagent/JavaAgentRunner.java
incubator/sirona/trunk/core/src/main/java/org/apache/sirona/configuration/Configuration.java
Modified: incubator/sirona/trunk/agent/javaagent/pom.xml
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/agent/javaagent/pom.xml?rev=1642160&r1=1642159&r2=1642160&view=diff
==============================================================================
--- incubator/sirona/trunk/agent/javaagent/pom.xml (original)
+++ incubator/sirona/trunk/agent/javaagent/pom.xml Thu Nov 27 14:32:57 2014
@@ -30,7 +30,7 @@
<properties>
<test.debug.remote>false</test.debug.remote>
<sirona.agent.debug>false</sirona.agent.debug>
- <asm.version>5.0.1</asm.version>
+ <asm.version>5.0.3</asm.version>
<agent.class>org.apache.sirona.javaagent.SironaAgent</agent.class>
</properties>
@@ -132,18 +132,21 @@
<createSourcesJar>true</createSourcesJar>
<shadedArtifactAttached>true</shadedArtifactAttached>
<shadedClassifierName>shaded</shadedClassifierName>
+ <createDependencyReducedPom>true</createDependencyReducedPom>
+ <dependencyReducedPomLocation>${project.build.directory}/reduced-pom.xml</dependencyReducedPomLocation>
<relocations>
<relocation>
<pattern>org.objectweb.asm</pattern>
<shadedPattern>org.apache.sirona.asm</shadedPattern>
</relocation>
- <!--
- <relocation>
- <pattern>org.apache.sirona</pattern>
- <shadedPattern>org.apache.sirona.sirona</shadedPattern>
- </relocation>
- -->
</relocations>
+ <artifactSet>
+ <includes>
+ <include>org.ow2.asm:asm-all</include>
+ <include>org.apache.sirona:sirona-aop</include>
+ <include>org.apache.sirona:sirona-core</include>
+ </includes>
+ </artifactSet>
</configuration>
</execution>
</executions>
Modified: incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/SironaAgent.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/SironaAgent.java?rev=1642160&r1=1642159&r2=1642160&view=diff
==============================================================================
--- incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/SironaAgent.java (original)
+++ incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/SironaAgent.java Thu Nov 27 14:32:57 2014
@@ -18,15 +18,17 @@ package org.apache.sirona.javaagent;
import java.io.ByteArrayOutputStream;
import java.io.File;
-import java.io.IOException;
import java.lang.instrument.Instrumentation;
import java.lang.reflect.Method;
import java.net.URL;
+import java.net.URLClassLoader;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.jar.JarFile;
+import static java.util.Arrays.asList;
+
public class SironaAgent {
private static final boolean FORCE_RELOAD = Boolean.getBoolean("sirona.javaagent.force.reload");
@@ -49,7 +51,7 @@ public class SironaAgent {
}
});
- final ClassLoader loader = Thread.currentThread().getContextClassLoader();
+ final ClassLoader loader = ClassLoader.getSystemClassLoader(); // TCCL works for sirona but not for libs
try {
final String resource = SironaAgent.class.getName().replace('.', '/') + ".class";
final URL agentUrl = loader.getResource(resource);
@@ -65,19 +67,21 @@ public class SironaAgent {
e.printStackTrace();
}
+ final boolean debug = "true".equalsIgnoreCase(extractConfig(agentArgs, "debug="));
+ final boolean envrtDebug = debug || "true".equalsIgnoreCase(extractConfig(agentArgs, "environment-debug="));
+
+ final StringBuilder out = new StringBuilder();
final String libs = extractConfig(agentArgs, "libs=");
if (libs != null) {
- final File root = new File(libs);
- if (root.exists()) {
- final File[] children = root.listFiles();
- if (children != null) {
- for (final File f : children) {
- if (!f.isDirectory()) {
- try {
- instrumentation.appendToBootstrapClassLoaderSearch(new JarFile(f));
- } catch (final IOException e) {
- e.printStackTrace();
- }
+ for (final String lib : libs.split(" *, *")) {
+ final File root = new File(lib);
+ if (root.isFile() && root.getName().endsWith(".jar")) {
+ addLib(instrumentation, out, root);
+ } else if (root.isDirectory()) {
+ final File[] children = root.listFiles();
+ if (children != null) {
+ for (final File f : children) {
+ addLib(instrumentation, out, f);
}
}
}
@@ -91,6 +95,11 @@ public class SironaAgent {
e.printStackTrace();
}
+ // we can log/sysout only from here
+ if (envrtDebug) {
+ System.out.print(out.toString());
+ }
+
try {
// setup agent parameters
Class<?> clazz = Class.forName("org.apache.sirona.javaagent.AgentContext", true, loader);
@@ -106,15 +115,24 @@ public class SironaAgent {
try {
- final boolean debug = "true".equalsIgnoreCase(extractConfig(agentArgs, "debug="));
if (debug) {
System.out.println("Sirona debugging activated, find instrumented classes in /tmp/sirona-dump/");
}
+
final SironaTransformer transformer = new SironaTransformer(debug);
final boolean reloadable = instrumentation.isRetransformClassesSupported() && FORCE_RELOAD;
instrumentation.addTransformer(transformer, reloadable);
final Class<?> listener = loader.loadClass("org.apache.sirona.javaagent.spi.InvocationListener");
+
+ if (envrtDebug) {
+ System.out.println("ClassLoader: " + loader);
+ System.out.println("Loading ClassLoader: " + listener.getClassLoader());
+ if (URLClassLoader.class.isInstance(loader)) {
+ System.out.println("URLs: " + asList(URLClassLoader.class.cast(loader).getURLs()));
+ }
+ }
+
if (reloadable) {
for (final Class<?> clazz : instrumentation.getAllLoadedClasses()) {
if (!clazz.isArray()
@@ -146,6 +164,19 @@ public class SironaAgent {
}
}
+ private static void addLib(final Instrumentation instrumentation, final StringBuilder out, final File f) {
+ if (out != null) {
+ out.append("Added ").append(f.getAbsolutePath())
+ .append(" to (instrumentation) classpath")
+ .append(System.getProperty("line.separator"));
+ }
+ try {
+ instrumentation.appendToSystemClassLoaderSearch(new JarFile(f));
+ } catch (final Exception e) {
+ e.printStackTrace();
+ }
+ }
+
private static void debug(ClassLoader loader, String msg, Object... objects) {
try
{
Modified: incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/sirona/javaagent/AgentArgs.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/sirona/javaagent/AgentArgs.java?rev=1642160&r1=1642159&r2=1642160&view=diff
==============================================================================
--- incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/sirona/javaagent/AgentArgs.java (original)
+++ incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/sirona/javaagent/AgentArgs.java Thu Nov 27 14:32:57 2014
@@ -29,6 +29,7 @@ import java.lang.annotation.Target;
public @interface AgentArgs
{
boolean removeTargetClassesFromClasspath() default true;
+ boolean removeSironaFromClasspath() default true;
String value();
Modified: incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/sirona/javaagent/JavaAgentRunner.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/sirona/javaagent/JavaAgentRunner.java?rev=1642160&r1=1642159&r2=1642160&view=diff
==============================================================================
--- incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/sirona/javaagent/JavaAgentRunner.java (original)
+++ incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/sirona/javaagent/JavaAgentRunner.java Thu Nov 27 14:32:57 2014
@@ -104,9 +104,9 @@ public class JavaAgentRunner extends Blo
}
};
- final List<FrameworkMethod> befores = getTestClass() .getAnnotatedMethods(BeforeFork.class);
+ final List<FrameworkMethod> befores = getTestClass().getAnnotatedMethods(BeforeFork.class);
statement = befores.isEmpty() ? statement : new RunBefores(statement, befores, null);
- final List<FrameworkMethod> afters = getTestClass() .getAnnotatedMethods(AfterFork.class);
+ final List<FrameworkMethod> afters = getTestClass().getAnnotatedMethods(AfterFork.class);
statement = befores.isEmpty() ? statement : new RunAfters(statement, afters, null);
return statement;
}
@@ -181,10 +181,15 @@ public class JavaAgentRunner extends Blo
}
}
- final String cp = System.getProperty("surefire.test.class.path", System.getProperty("java.class.path"));
-
+ String cp = System.getProperty("surefire.test.class.path", System.getProperty("java.class.path"));
+ if (agentArgs == null || agentArgs.removeTargetClassesFromClasspath()) {
+ cp = removeAgentFromCp(cp);
+ }
+ if (agentArgs != null && agentArgs.removeSironaFromClasspath()) {
+ cp = removeSironaFromCp(cp);
+ }
args.add("-cp");
- args.add(agentArgs == null || agentArgs.removeTargetClassesFromClasspath() ? removeAgentFromCp(cp) : cp);
+ args.add(cp);
args.add(JavaAgentRunner.class.getName());
args.add(mtd.getMethod().getDeclaringClass().getName());
args.add(mtd.getName());
@@ -196,11 +201,31 @@ public class JavaAgentRunner extends Blo
private static String removeAgentFromCp(final String property) {
final String path = new File("target" + File.separatorChar + "classes").getAbsolutePath();
+ return removeFromCp(property, new Predicate() {
+ @Override
+ public boolean accept(final String segment) {
+ return !segment.equals(path);
+ }
+ });
+ }
+
+ private static String removeSironaFromCp(final String property) {
+ return removeFromCp(property, new Predicate() {
+ @Override
+ public boolean accept(final String segment) {
+ final String name = new File(segment).getName();
+ // we remove sirona* but this jar with the runner
+ return !name.startsWith("sirona-") || name.endsWith("-tests.jar");
+ }
+ });
+ }
+
+ private static String removeFromCp(final String property, final Predicate predicate) {
final String sep = System.getProperty("path.separator");
final String[] segments = property.split(sep);
final StringBuilder builder = new StringBuilder(property.length());
for (final String segment : segments) {
- if (!segment.equals(path)) {
+ if (predicate.accept(segment)) {
builder.append(segment).append(sep);
}
}
@@ -358,4 +383,7 @@ public class JavaAgentRunner extends Blo
}
+ private static interface Predicate {
+ boolean accept(String path);
+ }
}
Modified: incubator/sirona/trunk/core/src/main/java/org/apache/sirona/configuration/Configuration.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/core/src/main/java/org/apache/sirona/configuration/Configuration.java?rev=1642160&r1=1642159&r2=1642160&view=diff
==============================================================================
--- incubator/sirona/trunk/core/src/main/java/org/apache/sirona/configuration/Configuration.java (original)
+++ incubator/sirona/trunk/core/src/main/java/org/apache/sirona/configuration/Configuration.java Thu Nov 27 14:32:57 2014
@@ -42,7 +42,12 @@ public final class Configuration {
providers.add(new FileConfigurationProvider(source));
}
providers.add(new PropertiesConfigurationProvider(System.getProperties()));
- for (final ConfigurationProvider provider : ServiceLoader.load(ConfigurationProvider.class, Configuration.class.getClassLoader())) {
+
+ ClassLoader classLoader = Configuration.class.getClassLoader();
+ if (classLoader == null) { // ServiceLoader fallbacks to it normally but ensure it is portable
+ classLoader = ClassLoader.getSystemClassLoader();
+ }
+ for (final ConfigurationProvider provider : ServiceLoader.load(ConfigurationProvider.class, classLoader)) {
providers.add(provider);
}
Collections.sort(providers, Sorter.INSTANCE);