Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[ICO-XXX] Add class loader handler for quarkus 1.13.3 #532

Merged
merged 2 commits into from Jul 1, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion pom.xml
Expand Up @@ -3,7 +3,7 @@

<groupId>io.github.classgraph</groupId>
<artifactId>classgraph</artifactId>
<version>4.8.109-SNAPSHOT</version>
<version>4.8.108-itm</version>
<name>ClassGraph</name>

<description>The uber-fast, ultra-lightweight classpath and module scanner for JVM languages.</description>
Expand Down
Expand Up @@ -28,15 +28,16 @@
*/
package nonapi.io.github.classgraph.classloaderhandler;

import java.nio.file.Path;
import java.util.Collection;

import nonapi.io.github.classgraph.classpath.ClassLoaderOrder;
import nonapi.io.github.classgraph.classpath.ClasspathOrder;
import nonapi.io.github.classgraph.scanspec.ScanSpec;
import nonapi.io.github.classgraph.utils.LogNode;
import nonapi.io.github.classgraph.utils.ReflectionUtils;

import java.nio.file.Path;
import java.util.Collection;
import java.util.Map;

/**
* Extract classpath entries from the Quarkus ClassLoader.
*/
Expand All @@ -47,6 +48,9 @@ class QuarkusClassLoaderHandler implements ClassLoaderHandler {
// Classloader since Quarkus 1.3
private static final String QUARKUS_CLASSLOADER = "io.quarkus.bootstrap.classloading.QuarkusClassLoader";

// Classloader since Quarkus 1.13
private static final String RUNNER_CLASSLOADER = "io.quarkus.bootstrap.runner.RunnerClassLoader";

/**
* Class cannot be constructed.
*/
Expand All @@ -64,7 +68,8 @@ private QuarkusClassLoaderHandler() {
*/
public static boolean canHandle(final Class<?> classLoaderClass, final LogNode log) {
return RUNTIME_CLASSLOADER.equals(classLoaderClass.getName())
|| QUARKUS_CLASSLOADER.equals(classLoaderClass.getName());
|| QUARKUS_CLASSLOADER.equals(classLoaderClass.getName())
|| RUNNER_CLASSLOADER.equals(classLoaderClass.getName());
}

/**
Expand Down Expand Up @@ -103,6 +108,8 @@ public static void findClasspathOrder(final ClassLoader classLoader, final Class
findClasspathOrderForRuntimeClassloader(classLoader, classpathOrder, scanSpec, log);
} else if (QUARKUS_CLASSLOADER.equals(classLoaderName)) {
findClasspathOrderForQuarkusClassloader(classLoader, classpathOrder, scanSpec, log);
} else if (RUNNER_CLASSLOADER.equals(classLoaderName)) {
findClasspathOrderForRunnerClassloader(classLoader, classpathOrder, scanSpec, log);
}
}

Expand Down Expand Up @@ -133,4 +140,19 @@ private static void findClasspathOrderForRuntimeClassloader(final ClassLoader cl
}
}
}

@SuppressWarnings("unchecked")
private static void findClasspathOrderForRunnerClassloader(final ClassLoader classLoader,
final ClasspathOrder classpathOrder, final ScanSpec scanSpec, final LogNode log) {
for (final Object[] elementArray : ((Map<String, Object[]>) ReflectionUtils.getFieldVal(classLoader,
"resourceDirectoryMap", false)).values()) {
for (Object element : elementArray) {
final String elementClassName = element.getClass().getName();
if ("io.quarkus.bootstrap.runner.JarResource".equals(elementClassName)) {
classpathOrder.addClasspathEntry(ReflectionUtils.getFieldVal(element, "jarPath", false),
classLoader, scanSpec, log);
}
}
}
}
}