### Environment
* Dubbo version: 2.6.3
* Operating System version: mac OS
* Java version: 1.8
### Steps to reproduce this issue
Dubbo通过 ExtensionLoader 加载各种SPI的实现,但是findClassLoader可能无法发现自定义SPI扩展点。
dubbo ExtensionLoader 代码:
private void loadFile(Map<String, Class<?>> extensionClasses, String dir) {
String fileName = dir + type.getName();
try {
Enumeration<java.net.URL> urls;
ClassLoader classLoader = findClassLoader();
if (classLoader != null) {
urls = classLoader.getResources(fileName);
} else {
urls = ClassLoader.getSystemResources(fileName);
}
......
}
private static ClassLoader findClassLoader() {
return ExtensionLoader.class.getClassLoader();
}
可以看到 ExtensionLoader 使用的是本身class所在的ClassLoader load
文件,当我们自定义的SPI扩展点和dubbo不在同一个classloader就会导致无法被load。
建议修改为 org.springframework.util.ClassUtils 中更合理的实现方式:
public static ClassLoader getDefaultClassLoader() {
ClassLoader cl = null;
try {
cl = Thread.currentThread().getContextClassLoader();
}
catch (Throwable ex) {
// Cannot access thread context ClassLoader - falling
back...
}
if (cl == null) {
// No thread context class loader -> use class loader
of this class.
cl = ClassUtils.class.getClassLoader();
if (cl == null) {
// getClassLoader() returning null indicates
the bootstrap ClassLoader
try {
cl = ClassLoader.getSystemClassLoader();
}
catch (Throwable ex) {
// Cannot access system ClassLoader -
oh well, maybe the caller can live with null...
}
}
}
return cl;
[ Full content available at:
https://github.com/apache/incubator-dubbo/issues/2507 ]
This message was relayed via gitbox.apache.org for [email protected]