Skip to content

Commit

Permalink
Also scan classpath if override classloader is AppClassLoader (#639)
Browse files Browse the repository at this point in the history
  • Loading branch information
lukehutch committed Feb 11, 2022
1 parent d0c5055 commit df45ffa
Showing 1 changed file with 13 additions and 12 deletions.
Expand Up @@ -117,6 +117,9 @@ public ClassGraphClassLoader getDelegateClassGraphClassLoader() {
public ClasspathFinder(final ScanSpec scanSpec, final LogNode log) {
final LogNode classpathFinderLog = log == null ? null : log.log("Finding classpath and modules");

// Require scanning traditional classpath if an override classloader is AppClassLoader (#639)
boolean forceScanJavaClassPath = false;

// If classloaders are overridden, check if the override classloader(s) is/are JPMS classloaders.
// If so, need to enable non-system module scanning.
boolean scanNonSystemModules;
Expand All @@ -132,23 +135,21 @@ public ClasspathFinder(final ScanSpec scanSpec, final LogNode log) {
// It's not possible to instantiate AppClassLoader or PlatformClassLoader, so if these are
// passed in as override classloaders, they must have been obtained using
// Thread.currentThread().getContextClassLoader() [.getParent()] or similar
if (classLoaderClassName.equals("jdk.internal.loader.ClassLoaders$AppClassLoader")) {
if (classLoaderClassName.equals("jdk.internal.loader.ClassLoaders$AppClassLoader")
|| classLoaderClassName.equals("jdk.internal.loader.ClassLoaders$PlatformClassLoader")) {
if (!scanSpec.enableSystemJarsAndModules) {
if (classpathFinderLog != null) {
classpathFinderLog.log("overrideClassLoaders() was called with an instance of "
+ "jdk.internal.loader.ClassLoaders$AppClassLoader, which is a system "
+ "classloader, so enableSystemJarsAndModules() was called automatically");
+ classLoaderClassName + ", which is a system classloader, so "
+ "enableSystemJarsAndModules() was called automatically");
}
scanSpec.enableSystemJarsAndModules = true;
}
} else if (classLoaderClassName.equals("jdk.internal.loader.ClassLoaders$PlatformClassLoader")) {
if (!scanSpec.enableSystemJarsAndModules) {
if (classpathFinderLog != null) {
classpathFinderLog.log("overrideClassLoaders() was called with an instance of "
+ "jdk.internal.loader.ClassLoaders$PlatformClassLoader, which is a system "
+ "classloader, so enableSystemJarsAndModules() was called automatically");
}
scanSpec.enableSystemJarsAndModules = true;
forceScanJavaClassPath = true;
if (classpathFinderLog != null) {
classpathFinderLog.log("overrideClassLoaders() was called with an instance of "
+ classLoaderClassName + ", which is a system classloader, so the "
+ "`java.lang.path` classpath will also be scanned");
}
}
}
Expand Down Expand Up @@ -291,7 +292,7 @@ public ClasspathFinder(final ScanSpec scanSpec, final LogNode log) {
// and the classpath is not overridden, unless only module scanning was enabled, and an unnamed module
// layer was encountered -- in this case, have to forcibly scan java.class.path, since the ModuleLayer
// API doesn't allow for the opening of unnamed modules.
if ((!scanSpec.ignoreParentClassLoaders && scanSpec.overrideClassLoaders == null
if ((!scanSpec.ignoreParentClassLoaders && (scanSpec.overrideClassLoaders == null || forceScanJavaClassPath)
&& scanSpec.overrideClasspath == null)
|| (moduleFinder != null && moduleFinder.forceScanJavaClassPath())) {
final String[] pathElements = JarUtils.smartPathSplit(System.getProperty("java.class.path"), scanSpec);
Expand Down

0 comments on commit df45ffa

Please sign in to comment.