jiangyunpeng opened a new issue #2507: Dubbo 's ExtensionLoader may be can't 
find custom Extension  
URL: https://github.com/apache/incubator-dubbo/issues/2507
 
 
   
   ### 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;
   

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
[email protected]


With regards,
Apache Git Services

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to