diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 673d691..03f2166 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -7,33 +7,17 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - java: [7, 8, 9, 10, 11 ] + java: [7, 8, 11, 17 ] steps: - uses: actions/checkout@v2 - - name: Setup java - uses: actions/setup-java@v1 - with: - java-version: ${{ matrix.java }} - - name: Build with Maven - run: | - mvn clean package -DskipTests - mvn test - - build_jdk_ge_12: - runs-on: ubuntu-latest - strategy: - matrix: - java: [12, 13, 14, 15] - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 1.8 + - name: Set up JDK 11 uses: actions/setup-java@v1 with: - java-version: 8 - - name: save java8 home + java-version: 11 + - name: save java11 home run: | - export JAVA8_HOME=$JAVA_HOME && echo $JAVA8_HOME - echo "export JAVA8_HOME=$JAVA_HOME" > ~/.testenv + export JAVA11_HOME=$JAVA_HOME && echo $JAVA11_HOME + echo "export JAVA11_HOME=$JAVA_HOME" > ~/.testenv - name: Setup java uses: actions/setup-java@v1 @@ -42,5 +26,5 @@ jobs: - name: Build with Maven run: | source ~/.testenv - mvn -Dmaven.compiler.fork=true -Dmaven.compiler.executable=$JAVA8_HOME/bin/javac clean package -DskipTests - mvn -Dmaven.compiler.fork=true -Dmaven.compiler.executable=$JAVA8_HOME/bin/javac test \ No newline at end of file + mvn -Dmaven.compiler.fork=true -Dmaven.compiler.executable=$JAVA11_HOME/bin/javac clean package -DskipTests --batch-mode + mvn -Dmaven.compiler.fork=true -Dmaven.compiler.executable=$JAVA11_HOME/bin/javac test --batch-mode \ No newline at end of file diff --git a/fastjson-demo-plugin/pom.xml b/fastjson-demo-plugin/pom.xml index bc21a1a..62f9e48 100644 --- a/fastjson-demo-plugin/pom.xml +++ b/fastjson-demo-plugin/pom.xml @@ -23,7 +23,7 @@ com.alibaba fastjson - 1.2.76 + 1.2.83 diff --git a/one-java-agent-plugin/src/main/java/com/alibaba/oneagent/plugin/PluginManagerImpl.java b/one-java-agent-plugin/src/main/java/com/alibaba/oneagent/plugin/PluginManagerImpl.java index 0261eaa..e2b85e2 100644 --- a/one-java-agent-plugin/src/main/java/com/alibaba/oneagent/plugin/PluginManagerImpl.java +++ b/one-java-agent-plugin/src/main/java/com/alibaba/oneagent/plugin/PluginManagerImpl.java @@ -275,6 +275,7 @@ public void run() { } } }, "oneagent plugin " + plugin.name() + " init"); + thread.setDaemon(true); thread.start(); } @@ -340,6 +341,7 @@ public void run() { } } }, "oneagent plugin " + plugin.name() + " start"); + thread.setDaemon(true); thread.start(); } diff --git a/one-java-agent/src/main/java/com/alibaba/oneagent/BootstrapAgent.java b/one-java-agent/src/main/java/com/alibaba/oneagent/BootstrapAgent.java index 5127466..e2c10ed 100644 --- a/one-java-agent/src/main/java/com/alibaba/oneagent/BootstrapAgent.java +++ b/one-java-agent/src/main/java/com/alibaba/oneagent/BootstrapAgent.java @@ -1,5 +1,7 @@ package com.alibaba.oneagent; +import com.alibaba.oneagent.inst.InstrumentationWrapper; + import java.lang.instrument.Instrumentation; /** @@ -28,6 +30,7 @@ public static void destroy() { } private static synchronized void main(String args, Instrumentation inst, boolean premain) { + inst = InstrumentationWrapper.newInstrumentationWrapper(inst); if (NopAgent.INSTANCE == AGENT) { Agent agent = new AgentImpl(); agent.init(args, inst, premain); diff --git a/one-java-agent/src/main/java/com/alibaba/oneagent/inst/InstrumentationInvocationHandler.java b/one-java-agent/src/main/java/com/alibaba/oneagent/inst/InstrumentationInvocationHandler.java new file mode 100644 index 0000000..a3e4e21 --- /dev/null +++ b/one-java-agent/src/main/java/com/alibaba/oneagent/inst/InstrumentationInvocationHandler.java @@ -0,0 +1,28 @@ +package com.alibaba.oneagent.inst; + +import java.lang.instrument.Instrumentation; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; + +public class InstrumentationInvocationHandler implements InvocationHandler { + private final Instrumentation instrumentation; + + private final Object lockForAppend = new Object(); + + public InstrumentationInvocationHandler(Instrumentation instrumentation) { + this.instrumentation = instrumentation; + } + + @Override + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + if (method.getName().equals("appendToBootstrapClassLoaderSearch") || + method.getName().equals("appendToSystemClassLoaderSearch") + ) { + synchronized (lockForAppend) { + return method.invoke(instrumentation, args); + } + } else { + return method.invoke(instrumentation, args); + } + } +} diff --git a/one-java-agent/src/main/java/com/alibaba/oneagent/inst/InstrumentationWrapper.java b/one-java-agent/src/main/java/com/alibaba/oneagent/inst/InstrumentationWrapper.java new file mode 100644 index 0000000..66cd513 --- /dev/null +++ b/one-java-agent/src/main/java/com/alibaba/oneagent/inst/InstrumentationWrapper.java @@ -0,0 +1,13 @@ +package com.alibaba.oneagent.inst; + +import java.lang.instrument.Instrumentation; +import java.lang.reflect.Proxy; + +public class InstrumentationWrapper { + public static Instrumentation newInstrumentationWrapper(Instrumentation instrumentation) { + return (Instrumentation) Proxy.newProxyInstance( + instrumentation.getClass().getClassLoader(), + new Class[]{Instrumentation.class}, + new InstrumentationInvocationHandler(instrumentation)); + } +}