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;
+ }
}