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) {