]> source.dussan.org Git - pf4j.git/commitdiff
fix for #53
authorDecebal Suiu <decebal.suiu@gmail.com>
Mon, 20 Jul 2015 13:09:54 +0000 (16:09 +0300)
committerDecebal Suiu <decebal.suiu@gmail.com>
Mon, 20 Jul 2015 13:09:54 +0000 (16:09 +0300)
pf4j/src/main/java/ro/fortsoft/pf4j/PluginClassLoader.java

index efa759c662d69fe9175d792a0935e2bfb2a7fc47..995091423dff0f3952455d02bfd77f97e863859d 100644 (file)
@@ -55,52 +55,54 @@ public class PluginClassLoader extends URLClassLoader {
      */
        @Override
     public Class<?> loadClass(String className) throws ClassNotFoundException {
-        log.debug("Received request to load class '{}'", className);
-        // if the class it's a part of the plugin engine use parent class loader
-        if (className.startsWith(PLUGIN_PACKAGE_PREFIX)) {
-            log.debug("Delegate the loading of class '{}' to parent", className);
+        synchronized (getClassLoadingLock(className)) {
+            log.debug("Received request to load class '{}'", className);
+            // if the class it's a part of the plugin engine use parent class loader
+            if (className.startsWith(PLUGIN_PACKAGE_PREFIX)) {
+                log.debug("Delegate the loading of class '{}' to parent", className);
+                try {
+                    return getClass().getClassLoader().loadClass(className);
+                } catch (ClassNotFoundException e) {
+                    // try next step
+                    // TODO if I uncomment below lines (the correct approach) I received ClassNotFoundException for demo (ro.fortsoft.pf4j.demo)
+                    //                log.error(e.getMessage(), e);
+                    //                throw e;
+                }
+            }
+
+            // second check whether it's already been loaded
+            Class<?> clazz = findLoadedClass(className);
+            if (clazz != null) {
+                log.debug("Found loaded class '{}'", className);
+                return clazz;
+            }
+
+            // nope, try to load locally
             try {
-                return getClass().getClassLoader().loadClass(className);
+                clazz = findClass(className);
+                log.debug("Found class '{}' in plugin classpath", className);
+                return clazz;
             } catch (ClassNotFoundException e) {
                 // try next step
-                // TODO if I uncomment below lines (the correct approach) I received ClassNotFoundException for demo (ro.fortsoft.pf4j.demo)
-//                log.error(e.getMessage(), e);
-//                throw e;
             }
-        }
 
-        // second check whether it's already been loaded
-        Class<?> clazz = findLoadedClass(className);
-        if (clazz != null) {
-            log.debug("Found loaded class '{}'", className);
-               return clazz;
-        }
+            // look in dependencies
+            log.debug("Look in dependencies for class '{}'", className);
+            List<PluginDependency> dependencies = pluginDescriptor.getDependencies();
+            for (PluginDependency dependency : dependencies) {
+                PluginClassLoader classLoader = pluginManager.getPluginClassLoader(dependency.getPluginId());
+                try {
+                    return classLoader.loadClass(className);
+                } catch (ClassNotFoundException e) {
+                    // try next dependency
+                }
+            }
 
-        // nope, try to load locally
-        try {
-            clazz = findClass(className);
-            log.debug("Found class '{}' in plugin classpath", className);
-            return clazz;
-        } catch (ClassNotFoundException e) {
-               // try next step
-        }
+            log.debug("Couldn't find class '{}' in plugin classpath. Delegating to parent");
 
-        // look in dependencies
-        log.debug("Look in dependencies for class '{}'", className);
-        List<PluginDependency> dependencies = pluginDescriptor.getDependencies();
-        for (PluginDependency dependency : dependencies) {
-               PluginClassLoader classLoader = pluginManager.getPluginClassLoader(dependency.getPluginId());
-               try {
-                       return classLoader.loadClass(className);
-               } catch (ClassNotFoundException e) {
-                       // try next dependency
-               }
+            // use the standard URLClassLoader (which follows normal parent delegation)
+            return super.loadClass(className);
         }
-
-        log.debug("Couldn't find class '{}' in plugin classpath. Delegating to parent");
-
-        // use the standard URLClassLoader (which follows normal parent delegation)
-        return super.loadClass(className);
     }
 
     /**