mirror of
https://github.com/alibaba/canal.git
synced 2026-11-04 00:30:15 +08:00
外部adapter plugin文件夹
This commit is contained in:
@@ -43,8 +43,6 @@ public class ExtensionLoader<T> {
|
|||||||
|
|
||||||
private static final ConcurrentMap<String, Object> EXTENSION_KEY_INSTANCE = new ConcurrentHashMap<>();
|
private static final ConcurrentMap<String, Object> EXTENSION_KEY_INSTANCE = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
private static final ConcurrentMap<String, List<?>> EXTENSION_KEY_INSTANCES = new ConcurrentHashMap<>();
|
|
||||||
|
|
||||||
private final Class<?> type;
|
private final Class<?> type;
|
||||||
|
|
||||||
private final String classLoaderPolicy;
|
private final String classLoaderPolicy;
|
||||||
@@ -180,6 +178,8 @@ public class ExtensionLoader<T> {
|
|||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
private T createExtension(String name, String key) {
|
private T createExtension(String name, String key) {
|
||||||
|
System.out.println("xxxxxxxxxxxxx");
|
||||||
|
getExtensionClasses().forEach((k, v) -> logger.info("fffff: " + k + " " + v.getName()));
|
||||||
Class<?> clazz = getExtensionClasses().get(name);
|
Class<?> clazz = getExtensionClasses().get(name);
|
||||||
if (clazz == null) {
|
if (clazz == null) {
|
||||||
throw new IllegalStateException("Extension instance(name: " + name + ", class: " + type
|
throw new IllegalStateException("Extension instance(name: " + name + ", class: " + type
|
||||||
@@ -210,6 +210,7 @@ public class ExtensionLoader<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return classes;
|
return classes;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -255,13 +256,13 @@ public class ExtensionLoader<T> {
|
|||||||
|
|
||||||
Map<String, Class<?>> extensionClasses = new HashMap<String, Class<?>>();
|
Map<String, Class<?>> extensionClasses = new HashMap<String, Class<?>>();
|
||||||
|
|
||||||
// 1. lib folder,customized extension classLoader (jar_dir/lib)
|
// 1. plugin folder,customized extension classLoader (jar_dir/plugin)
|
||||||
String dir = File.separator + this.getJarDirectoryPath() + File.separator + "lib";
|
String dir = File.separator + this.getJarDirectoryPath() + File.separator + "plugin";
|
||||||
|
|
||||||
File externalLibDir = new File(dir);
|
File externalLibDir = new File(dir);
|
||||||
if (!externalLibDir.exists()) {
|
if (!externalLibDir.exists()) {
|
||||||
externalLibDir = new File(File.separator + this.getJarDirectoryPath() + File.separator + "canal-adapter"
|
externalLibDir = new File(File.separator + this.getJarDirectoryPath() + File.separator + "canal-adapter"
|
||||||
+ File.separator + "lib");
|
+ File.separator + "plugin");
|
||||||
}
|
}
|
||||||
logger.info("extension classpath dir: " + externalLibDir.getAbsolutePath());
|
logger.info("extension classpath dir: " + externalLibDir.getAbsolutePath());
|
||||||
if (externalLibDir.exists()) {
|
if (externalLibDir.exists()) {
|
||||||
@@ -279,49 +280,7 @@ public class ExtensionLoader<T> {
|
|||||||
URLClassLoader localClassLoader;
|
URLClassLoader localClassLoader;
|
||||||
if (classLoaderPolicy == null || "".equals(classLoaderPolicy)
|
if (classLoaderPolicy == null || "".equals(classLoaderPolicy)
|
||||||
|| DEFAULT_CLASSLOADER_POLICY.equalsIgnoreCase(classLoaderPolicy)) {
|
|| DEFAULT_CLASSLOADER_POLICY.equalsIgnoreCase(classLoaderPolicy)) {
|
||||||
localClassLoader = new URLClassLoader(new URL[] { url }, parent) {
|
localClassLoader = new URLClassExtensionLoader(new URL[] { url });
|
||||||
|
|
||||||
@Override
|
|
||||||
public Class<?> loadClass(String name) throws ClassNotFoundException {
|
|
||||||
Class<?> c = findLoadedClass(name);
|
|
||||||
if (c != null) {
|
|
||||||
return c;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (name.startsWith("java.") || name.startsWith("org.slf4j.")
|
|
||||||
|| name.startsWith("org.apache.logging")
|
|
||||||
|| name.startsWith("org.apache.commons.logging.")) {
|
|
||||||
// || name.startsWith("org.apache.hadoop."))
|
|
||||||
// {
|
|
||||||
c = super.loadClass(name);
|
|
||||||
}
|
|
||||||
if (c != null) return c;
|
|
||||||
|
|
||||||
try {
|
|
||||||
// 先加载jar内的class,可避免jar冲突
|
|
||||||
c = findClass(name);
|
|
||||||
} catch (ClassNotFoundException e) {
|
|
||||||
c = null;
|
|
||||||
}
|
|
||||||
if (c != null) {
|
|
||||||
return c;
|
|
||||||
}
|
|
||||||
|
|
||||||
return super.loadClass(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Enumeration<URL> getResources(String name) throws IOException {
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
Enumeration<URL>[] tmp = (Enumeration<URL>[]) new Enumeration<?>[2];
|
|
||||||
|
|
||||||
tmp[0] = findResources(name); // local class
|
|
||||||
// path first
|
|
||||||
// tmp[1] = super.getResources(name);
|
|
||||||
|
|
||||||
return new CompoundEnumeration<>(tmp);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
} else {
|
} else {
|
||||||
localClassLoader = new URLClassLoader(new URL[] { url }, parent);
|
localClassLoader = new URLClassLoader(new URL[] { url }, parent);
|
||||||
}
|
}
|
||||||
@@ -331,48 +290,15 @@ public class ExtensionLoader<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// 只加载外部spi, 不加载classpath
|
||||||
// 2. load inner extension class with default classLoader
|
// 2. load inner extension class with default classLoader
|
||||||
ClassLoader classLoader = findClassLoader();
|
// ClassLoader classLoader = findClassLoader();
|
||||||
loadFile(extensionClasses, CANAL_DIRECTORY, classLoader);
|
// loadFile(extensionClasses, CANAL_DIRECTORY, classLoader);
|
||||||
loadFile(extensionClasses, SERVICES_DIRECTORY, classLoader);
|
// loadFile(extensionClasses, SERVICES_DIRECTORY, classLoader);
|
||||||
|
|
||||||
return extensionClasses;
|
return extensionClasses;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class CompoundEnumeration<E> implements Enumeration<E> {
|
|
||||||
|
|
||||||
private Enumeration<E>[] enums;
|
|
||||||
private int index = 0;
|
|
||||||
|
|
||||||
public CompoundEnumeration(Enumeration<E>[] enums){
|
|
||||||
this.enums = enums;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean next() {
|
|
||||||
while (this.index < this.enums.length) {
|
|
||||||
if (this.enums[this.index] != null && this.enums[this.index].hasMoreElements()) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
++this.index;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean hasMoreElements() {
|
|
||||||
return this.next();
|
|
||||||
}
|
|
||||||
|
|
||||||
public E nextElement() {
|
|
||||||
if (!this.next()) {
|
|
||||||
throw new NoSuchElementException();
|
|
||||||
} else {
|
|
||||||
return this.enums[this.index].nextElement();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void loadFile(Map<String, Class<?>> extensionClasses, String dir, ClassLoader classLoader) {
|
private void loadFile(Map<String, Class<?>> extensionClasses, String dir, ClassLoader classLoader) {
|
||||||
String fileName = dir + type.getName();
|
String fileName = dir + type.getName();
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -0,0 +1,88 @@
|
|||||||
|
package com.alibaba.otter.canal.client.adapter.support;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.net.URLClassLoader;
|
||||||
|
import java.util.Enumeration;
|
||||||
|
import java.util.NoSuchElementException;
|
||||||
|
|
||||||
|
public class URLClassExtensionLoader extends URLClassLoader {
|
||||||
|
public URLClassExtensionLoader(URL[] urls) {
|
||||||
|
super(urls);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Class<?> loadClass(String name) throws ClassNotFoundException {
|
||||||
|
Class<?> c = findLoadedClass(name);
|
||||||
|
if (c != null) {
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (name.startsWith("java.") || name.startsWith("org.slf4j.")
|
||||||
|
|| name.startsWith("org.apache.logging")
|
||||||
|
|| name.startsWith("org.apache.commons.logging.")) {
|
||||||
|
// || name.startsWith("org.apache.hadoop."))
|
||||||
|
// {
|
||||||
|
c = super.loadClass(name);
|
||||||
|
}
|
||||||
|
if (c != null) return c;
|
||||||
|
|
||||||
|
try {
|
||||||
|
// 先加载jar内的class,可避免jar冲突
|
||||||
|
c = findClass(name);
|
||||||
|
} catch (ClassNotFoundException e) {
|
||||||
|
c = null;
|
||||||
|
}
|
||||||
|
if (c != null) {
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
return super.loadClass(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Enumeration<URL> getResources(String name) throws IOException {
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
Enumeration<URL>[] tmp = (Enumeration<URL>[]) new Enumeration<?>[2];
|
||||||
|
|
||||||
|
tmp[0] = findResources(name); // local class
|
||||||
|
// path first
|
||||||
|
// tmp[1] = super.getResources(name);
|
||||||
|
|
||||||
|
return new CompoundEnumeration<>(tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class CompoundEnumeration<E> implements Enumeration<E> {
|
||||||
|
|
||||||
|
private Enumeration<E>[] enums;
|
||||||
|
private int index = 0;
|
||||||
|
|
||||||
|
public CompoundEnumeration(Enumeration<E>[] enums){
|
||||||
|
this.enums = enums;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean next() {
|
||||||
|
while (this.index < this.enums.length) {
|
||||||
|
if (this.enums[this.index] != null && this.enums[this.index].hasMoreElements()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
++this.index;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean hasMoreElements() {
|
||||||
|
return this.next();
|
||||||
|
}
|
||||||
|
|
||||||
|
public E nextElement() {
|
||||||
|
if (!this.next()) {
|
||||||
|
throw new NoSuchElementException();
|
||||||
|
} else {
|
||||||
|
return this.enums[this.index].nextElement();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -57,10 +57,6 @@
|
|||||||
<exclude>**/*</exclude>
|
<exclude>**/*</exclude>
|
||||||
</excludes>
|
</excludes>
|
||||||
</fileSet>
|
</fileSet>
|
||||||
<fileSet>
|
|
||||||
<directory>${project.basedir}/target/canal-adapter/plugin</directory>
|
|
||||||
<outputDirectory>/plugin/</outputDirectory>
|
|
||||||
</fileSet>
|
|
||||||
</fileSets>
|
</fileSets>
|
||||||
<dependencySets>
|
<dependencySets>
|
||||||
<dependencySet>
|
<dependencySet>
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ if "%OS%" == "Windows_NT" set ENV_PATH=%~dp0%
|
|||||||
set conf_dir=%ENV_PATH%\..\conf
|
set conf_dir=%ENV_PATH%\..\conf
|
||||||
|
|
||||||
set CLASSPATH=%conf_dir%
|
set CLASSPATH=%conf_dir%
|
||||||
set CLASSPATH=%conf_dir%\..\lib\*;%conf_dir%\..\plugin\*;%CLASSPATH%
|
set CLASSPATH=%conf_dir%\..\lib\*;%CLASSPATH%
|
||||||
|
|
||||||
set JAVA_MEM_OPTS= -Xms128m -Xmx512m -XX:PermSize=128m
|
set JAVA_MEM_OPTS= -Xms128m -Xmx512m -XX:PermSize=128m
|
||||||
set JAVA_OPTS_EXT= -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true -Dapplication.codeset=UTF-8 -Dfile.encoding=UTF-8
|
set JAVA_OPTS_EXT= -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true -Dapplication.codeset=UTF-8 -Dfile.encoding=UTF-8
|
||||||
|
|||||||
@@ -54,9 +54,6 @@ for i in $base/lib/*;
|
|||||||
do CLASSPATH=$i:"$CLASSPATH";
|
do CLASSPATH=$i:"$CLASSPATH";
|
||||||
done
|
done
|
||||||
|
|
||||||
for i in $base/plugin/*;
|
|
||||||
do CLASSPATH=$i:"$CLASSPATH";
|
|
||||||
done
|
|
||||||
CLASSPATH="$base/conf:$CLASSPATH";
|
CLASSPATH="$base/conf:$CLASSPATH";
|
||||||
|
|
||||||
echo "cd to $bin_abs_path for workaround relative path"
|
echo "cd to $bin_abs_path for workaround relative path"
|
||||||
|
|||||||
Reference in New Issue
Block a user