### 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]

Reply via email to