Skip to content

Commit

Permalink
🐛 Fix PluginsScanner and PluginsClassloader to support Uber jar builds
Browse files Browse the repository at this point in the history
  • Loading branch information
ujibang committed Feb 19, 2024
1 parent f551d2b commit 2dfb240
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 26 deletions.
14 changes: 6 additions & 8 deletions core/src/main/java/org/restheart/plugins/PluginsClassloader.java
Expand Up @@ -33,7 +33,7 @@
* in a plugin JAR file, necessitating a comprehensive search to locate and load the class correctly.
* </p>
*/
public class PluginsClassloader extends ClassLoader {
public class PluginsClassloader extends URLClassLoader {
private static PluginsClassloader SINGLETON = null;

/**
Expand All @@ -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() {
Expand All @@ -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);
}
}
}
25 changes: 7 additions & 18 deletions core/src/main/java/org/restheart/plugins/PluginsScanner.java
Expand Up @@ -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;
Expand Down Expand Up @@ -83,8 +82,6 @@ public class PluginsScanner {
private static final ArrayList<PluginDescriptor> SERVICES = new ArrayList<>();
private static final ArrayList<PluginDescriptor> 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
Expand All @@ -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
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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 {
Expand All @@ -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) {
Expand Down

0 comments on commit 2dfb240

Please sign in to comment.