+ getFileUrls(jarFiles),
+ configuration.getClass().getClassLoader());
+
+ ClassGraph classGraph = new ClassGraph();
+
+ classGraph.setTargetDirectory(getTargetDirectory(configuration));
+
+ if (configuration.targetImageType.isSpecified())
+ classGraph.setTargetImageType(configuration.targetImageType.getValue());
+
+ classGraph.setKeepDotFile(configuration.keepDotFile.getValue());
+
+ for (File jarFile : jarFiles)
+ addJarToGraph(jarFile, classLoader, classGraph, configuration);
+
+ configuration.blacklistGlob.getValue().forEach(classGraph::blacklistClassGlob);
+ configuration.whitelistGlob.getValue().forEach(classGraph::whitelistClassGlob);
+
+ if (configuration.hideOrphanedClasses.getValue())
+ classGraph.hideOrphanedClasses();
+
+ return classGraph;
+ }
+
+ private static File getTargetDirectory(CommandlineConfiguration configuration) {
+ if (configuration.targetDirectory.isSpecified())
+ return configuration.targetDirectory.getValue();
+
+ // default to current directory
+ return new File(getProperty("user.dir") + separator);
+ }
+
+ private static URL[] getFileUrls(List<File> jarFiles) {
+ List<URL> urls = new ArrayList<>();
+ jarFiles.forEach((File file) -> {
+ try {
+ urls.add(file.toURI().toURL());
+ } catch (MalformedURLException e) {
+ throw new RuntimeException(e);
+ }
+ });
+
+ return urls.toArray(new URL[urls.size()]);
+ }
+
+ private static void addJarToGraph(
+ File jarFile, URLClassLoader classLoader, ClassGraph classGraph, CommandlineConfiguration configuration)
+ throws IOException, ClassNotFoundException {
+
+ for (String className : getClassNamesFromJar(jarFile)) {
+ if (configuration.isDebug())
+ System.out.println("Adding class to graph: " + className);
+
+ classGraph.add(loadClassByName(classLoader, className));
+ }
+ }
+
+ private static Class loadClassByName(URLClassLoader classLoader, String className) throws ClassNotFoundException {
+ return Class.forName(className, true, classLoader);
+ }
+
+ public static List<String> getClassNamesFromJar(File jarFile) throws IOException {
+ List<String> result = new ArrayList<>();
+ try (
+ JarInputStream jarInputStream = new JarInputStream(new FileInputStream(jarFile))
+ ) {
+ while (true) {
+ JarEntry jarEntry = jarInputStream.getNextJarEntry();
+ if (jarEntry == null)
+ break;