You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by xi...@apache.org on 2020/12/09 03:15:08 UTC

[shardingsphere] branch master updated: support to load resource by plugin classloader (#8538)

This is an automated email from the ASF dual-hosted git repository.

xiaoyu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new 1dbdfc6  support to load resource by plugin classloader (#8538)
1dbdfc6 is described below

commit 1dbdfc69dc43c95d5874df0a968f1ced29ce8641
Author: Daming <zt...@foxmail.com>
AuthorDate: Wed Dec 9 11:14:36 2020 +0800

    support to load resource by plugin classloader (#8538)
    
    * support to load resource by plugin classloader
    
    * Update ShardingSphereTransformer.java
    
    * don't shade logging framework
---
 .../shardingsphere-agent-core/pom.xml              |  5 +-
 .../agent/core/ShardingSphereTransformer.java      |  6 +-
 .../agent/core/plugin/AgentPluginLoader.java       | 79 +++++++++++++---------
 3 files changed, 52 insertions(+), 38 deletions(-)

diff --git a/shardingsphere-agent/shardingsphere-agent-core/pom.xml b/shardingsphere-agent/shardingsphere-agent-core/pom.xml
index 38280b2..c128a51 100644
--- a/shardingsphere-agent/shardingsphere-agent-core/pom.xml
+++ b/shardingsphere-agent/shardingsphere-agent-core/pom.xml
@@ -48,6 +48,7 @@
                         <configuration>
                             <artifactSet>
                                 <excludes>
+                                    <exclude>org.slf4j:*</exclude>
                                     <exclude>com.google.errorprone:error_prone_annotations:jar:</exclude>
                                     <exclude>com.google.code.findbugs:jsr305:jar:</exclude>
                                     <exclude>org.checkerframework:checker-qual:jar:</exclude>
@@ -65,10 +66,6 @@
                                     <shadedPattern>${shade.package}.com.google</shadedPattern>
                                 </relocation>
                                 <relocation>
-                                    <pattern>org.slf4j</pattern>
-                                    <shadedPattern>${shade.package}.org.slf4j</shadedPattern>
-                                </relocation>
-                                <relocation>
                                     <pattern>org.apache.commons</pattern>
                                     <shadedPattern>${shade.package}.org.apache.commons</shadedPattern>
                                 </relocation>
diff --git a/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/ShardingSphereTransformer.java b/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/ShardingSphereTransformer.java
index 2b41785..49486fb 100644
--- a/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/ShardingSphereTransformer.java
+++ b/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/ShardingSphereTransformer.java
@@ -64,7 +64,7 @@ public class ShardingSphereTransformer implements AgentBuilder.Transformer {
                     final ConstructorMethodInterceptor interceptor = new ConstructorMethodInterceptor(agentPluginLoader.getOrCreateInstance(point.getAdvice()));
                     newBuilder = newBuilder.constructor(point.getConstructorMatcher()).intercept(SuperMethodCall.INSTANCE.andThen(MethodDelegation.withDefaultConfiguration().to(interceptor)));
                     // CHECKSTYLE:OFF
-                } catch (Exception e) {
+                } catch (Throwable e) {
                     // CHECKSTYLE:ON
                     log.error("Failed to load advice class: {}", point.getAdvice(), e);
                 }
@@ -74,7 +74,7 @@ public class ShardingSphereTransformer implements AgentBuilder.Transformer {
                     final StaticMethodAroundInterceptor interceptor = new StaticMethodAroundInterceptor(agentPluginLoader.getOrCreateInstance(point.getAdvice()));
                     newBuilder = newBuilder.method(point.getMethodsMatcher()).intercept(MethodDelegation.withDefaultConfiguration().to(interceptor));
                     // CHECKSTYLE:OFF
-                } catch (Exception e) {
+                } catch (Throwable e) {
                     // CHECKSTYLE:ON
                     log.error("Failed to load advice class: {}", point.getAdvice(), e);
                 }
@@ -84,7 +84,7 @@ public class ShardingSphereTransformer implements AgentBuilder.Transformer {
                     final MethodAroundInterceptor interceptor = new MethodAroundInterceptor(agentPluginLoader.getOrCreateInstance(point.getAdvice()));
                     newBuilder = newBuilder.method(point.getMethodMatcher()).intercept(MethodDelegation.withDefaultConfiguration().to(interceptor));
                     // CHECKSTYLE:OFF
-                } catch (Exception e) {
+                } catch (Throwable e) {
                     // CHECKSTYLE:ON
                     log.error("Failed to load advice class: {}", point.getAdvice(), e);
                 }
diff --git a/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/plugin/AgentPluginLoader.java b/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/plugin/AgentPluginLoader.java
index 78e887f..53f073f 100644
--- a/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/plugin/AgentPluginLoader.java
+++ b/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/plugin/AgentPluginLoader.java
@@ -24,11 +24,7 @@ import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
 import com.google.common.io.ByteStreams;
-import java.net.URL;
-import java.util.Enumeration;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.jar.JarEntry;
+import lombok.RequiredArgsConstructor;
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
 import net.bytebuddy.description.type.TypeDescription;
@@ -41,6 +37,10 @@ import java.io.ByteArrayOutputStream;
 import java.io.Closeable;
 import java.io.File;
 import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Collections;
+import java.util.Enumeration;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -48,6 +48,7 @@ import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.locks.ReentrantLock;
 import java.util.jar.Attributes;
+import java.util.jar.JarEntry;
 import java.util.jar.JarFile;
 import java.util.zip.ZipEntry;
 
@@ -67,20 +68,23 @@ public final class AgentPluginLoader extends ClassLoader implements Closeable {
     
     private final ReentrantLock lock = new ReentrantLock();
     
-    private final List<JarFile> jars = Lists.newArrayList();
+    private final List<UberJar> jars = Lists.newArrayList();
     
     private final List<Service> services = Lists.newArrayList();
     
-    private Map<String, PluginAdviceDefinition> pluginDefineMap = Maps.newHashMap();
+    private Map<String, PluginAdviceDefinition> pluginDefineMap;
+    
+    private AgentPluginLoader() {
+    }
     
     @Override
     protected Class<?> findClass(final String name) throws ClassNotFoundException {
         String path = classNameToPath(name);
-        for (JarFile jar : jars) {
-            ZipEntry entry = jar.getEntry(path);
+        for (UberJar jar : jars) {
+            ZipEntry entry = jar.jarFile.getEntry(path);
             if (Objects.nonNull(entry)) {
                 try {
-                    byte[] data = ByteStreams.toByteArray(jar.getInputStream(entry));
+                    byte[] data = ByteStreams.toByteArray(jar.jarFile.getInputStream(entry));
                     return defineClass(name, data, 0, data.length);
                 } catch (IOException ioe) {
                     log.error("Failed to load class {}.", name, ioe);
@@ -91,33 +95,39 @@ public final class AgentPluginLoader extends ClassLoader implements Closeable {
     }
     
     @Override
-    protected Enumeration<URL> findResources(final String name) throws IOException {
-        List<URL> allResources = new LinkedList<>();
-        for (JarFile jar : jars) {
-            JarEntry entry = jar.getJarEntry(name);
-            if (null != entry) {
-                allResources.add(new URL("jar:file:" + AgentPathBuilder.getAgentPath().getAbsolutePath() + "!/" + name));
+    protected Enumeration<URL> findResources(final String name) {
+        List<URL> resources = Lists.newArrayList();
+        for (UberJar jar : jars) {
+            JarEntry entry = jar.jarFile.getJarEntry(name);
+            if (entry != null) {
+                try {
+                    resources.add(new URL("jar:file:" + jar.sourcePath.getAbsolutePath() + "!/" + name));
+                } catch (MalformedURLException ignored) {
+                }
             }
         }
-        final Iterator<URL> iterator = allResources.iterator();
-        return new Enumeration<URL>() {
-            @Override
-            public boolean hasMoreElements() {
-                return iterator.hasNext();
-            }
-            
-            @Override
-            public URL nextElement() {
-                return iterator.next();
+        return Collections.enumeration(resources);
+    }
+    
+    @Override
+    protected URL findResource(final String name) {
+        for (UberJar jar : jars) {
+            JarEntry entry = jar.jarFile.getJarEntry(name);
+            if (entry != null) {
+                try {
+                    return new URL("jar:file:" + jar.sourcePath.getAbsolutePath() + "!/" + name);
+                } catch (MalformedURLException ignored) {
+                }
             }
-        };
+        }
+        return null;
     }
     
     @Override
     public void close() {
-        for (JarFile jar : jars) {
+        for (UberJar jar : jars) {
             try {
-                jar.close();
+                jar.jarFile.close();
             } catch (IOException ioe) {
                 log.error("", ioe);
             }
@@ -161,7 +171,7 @@ public final class AgentPluginLoader extends ClassLoader implements Closeable {
         for (File jarFile : jarFiles) {
             outputStream.reset();
             JarFile jar = new JarFile(jarFile, true);
-            jars.add(jar);
+            jars.add(new UberJar(jar, jarFile));
             Attributes attributes = jar.getManifest().getMainAttributes();
             String entrypoint = attributes.getValue("Entrypoint");
             if (Strings.isNullOrEmpty(entrypoint)) {
@@ -251,8 +261,8 @@ public final class AgentPluginLoader extends ClassLoader implements Closeable {
     /**
      * To get or create instance of the advice class. Create new one and caching when it is not exist.
      *
-     * @param <T>               advice type
      * @param classNameOfAdvice class name of advice
+     * @param <T> advice type
      * @return instance of advice
      */
     @SneakyThrows({ClassNotFoundException.class, IllegalAccessException.class, InstantiationException.class})
@@ -318,4 +328,11 @@ public final class AgentPluginLoader extends ClassLoader implements Closeable {
             }
         });
     }
+    
+    @RequiredArgsConstructor
+    private static class UberJar {
+        private final JarFile jarFile;
+        
+        private final File sourcePath;
+    }
 }