diff --git a/core/src/main/java/org/restheart/plugins/PluginsClassloader.java b/core/src/main/java/org/restheart/plugins/PluginsClassloader.java index 5de36688a3..ff0e5d0e68 100644 --- a/core/src/main/java/org/restheart/plugins/PluginsClassloader.java +++ b/core/src/main/java/org/restheart/plugins/PluginsClassloader.java @@ -33,7 +33,7 @@ * in a plugin JAR file, necessitating a comprehensive search to locate and load the class correctly. *

*/ -public class PluginsClassloader extends ClassLoader { +public class PluginsClassloader extends URLClassLoader { private static PluginsClassloader SINGLETON = null; /** @@ -56,10 +56,8 @@ public static boolean isInitialized() { return SINGLETON != null; } - private final URLClassLoader pluginsClassLoader; - private PluginsClassloader(URL[] jars) throws IOException { - this.pluginsClassLoader = new URLClassLoader(jars); + super(jars); } public static PluginsClassloader getInstance() { @@ -73,11 +71,11 @@ public static PluginsClassloader getInstance() { @Override public Class loadClass(String name) throws ClassNotFoundException { try { - // use the current classloader - return this.getClass().getClassLoader().loadClass(name); + // first try to load the class with the PluginsScanner's classloader + return PluginsScanner.class.getClassLoader().loadClass(name); } catch (ClassNotFoundException cnfe) { - // look in the plugins jars - return this.pluginsClassLoader.loadClass(name); + // then use the URLClassLoader to try loading the class from the plugins jars + return super.loadClass(name); } } } \ No newline at end of file diff --git a/core/src/main/java/org/restheart/plugins/PluginsScanner.java b/core/src/main/java/org/restheart/plugins/PluginsScanner.java index b1f86a4961..f38f5afd76 100644 --- a/core/src/main/java/org/restheart/plugins/PluginsScanner.java +++ b/core/src/main/java/org/restheart/plugins/PluginsScanner.java @@ -30,7 +30,6 @@ import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URL; -import java.net.URLClassLoader; import java.net.URLDecoder; import java.nio.charset.StandardCharsets; import java.nio.file.DirectoryStream.Filter; @@ -83,8 +82,6 @@ public class PluginsScanner { private static final ArrayList SERVICES = new ArrayList<>(); private static final ArrayList PROVIDERS = new ArrayList<>(); - static URL[] jars = null; - // ClassGraph.scan() at class initialization time to support native image // generation with GraalVM // see https://github.com/SoftInstigate/classgraph-on-graalvm @@ -105,7 +102,6 @@ public class PluginsScanner { } else { rtcg = new RuntimeClassGraph(); classGraph = rtcg.get(); - jars = rtcg.jars; // apply plugins-scanning-verbose configuration option classGraph = classGraph.verbose(Bootstrapper.getConfiguration().coreModule().pluginsScanningVerbose()); // apply plugins-packages configuration option @@ -341,19 +337,12 @@ public RuntimeClassGraph() { var pdir = getPluginsDirectory(); this.jars = findPluginsJars(pdir); - if (jars != null && jars.length != 0) { - PluginsClassloader.init(jars); + PluginsClassloader.init(jars); - this.classGraph = new ClassGraph().disableModuleScanning().disableDirScanning() - .disableNestedJarScanning().disableRuntimeInvisibleAnnotations() - .addClassLoader(new URLClassLoader(jars)).addClassLoader(ClassLoader.getSystemClassLoader()) - .enableAnnotationInfo().enableMethodInfo().enableFieldInfo().ignoreFieldVisibility().initializeLoadedClasses(); - } else { - this.classGraph = new ClassGraph().disableModuleScanning().disableDirScanning() - .disableNestedJarScanning().disableRuntimeInvisibleAnnotations() - .addClassLoader(ClassLoader.getSystemClassLoader()).enableAnnotationInfo().ignoreFieldVisibility().enableMethodInfo().enableFieldInfo() - .initializeLoadedClasses(); - } + this.classGraph = new ClassGraph().disableModuleScanning().disableDirScanning() + .disableNestedJarScanning().disableRuntimeInvisibleAnnotations() + .addClassLoader(PluginsClassloader.getInstance()).addClassLoader(ClassLoader.getSystemClassLoader()) + .enableAnnotationInfo().enableMethodInfo().enableFieldInfo().ignoreFieldVisibility().initializeLoadedClasses(); } private long starScanTime = 0; @@ -445,7 +434,7 @@ private URL[] _findPluginsJars(Path dir, int depth) { for (Path subdir : ds) { if (Files.isReadable(subdir)) { var subjars = _findPluginsJars(subdir, depth + 1); - if (subjars != null) { + if (subjars != null && subjars.length > 0) { Arrays.stream(subjars).forEach(jar -> urls.add(jar)); } } else { @@ -457,7 +446,7 @@ private URL[] _findPluginsJars(Path dir, int depth) { } } - return urls.isEmpty() ? null : urls.toArray(URL[]::new); + return urls.toArray(URL[]::new); } private void checkPluginDirectory(Path pluginsDirectory) {