X-Git-Url: http://www2.svjatoslav.eu/gitweb/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Feu%2Fsvjatoslav%2Finspector%2Fjava%2Fcommandline%2FMain.java;h=0c63a551c7d86c96c5f2aa2e137cd3fd7440a7ec;hb=6df8ead7c2fdfe12e2b71d25edcab0abf4b93c89;hp=6a6358893cb2469b75ff6bca3f54c342fda86381;hpb=f9689015962218747805ab58f27dae307cd7ab89;p=javainspect.git diff --git a/src/main/java/eu/svjatoslav/inspector/java/commandline/Main.java b/src/main/java/eu/svjatoslav/inspector/java/commandline/Main.java index 6a63588..0c63a55 100644 --- a/src/main/java/eu/svjatoslav/inspector/java/commandline/Main.java +++ b/src/main/java/eu/svjatoslav/inspector/java/commandline/Main.java @@ -19,9 +19,13 @@ import java.util.jar.JarInputStream; public class Main { public static void main(String[] args) throws IOException, ClassNotFoundException { CommandlineConfiguration configuration = new CommandlineConfiguration(args); - if (!configuration.configurationOk) + if (!configuration.configurationOk) { + configuration.parser.showHelp(); System.exit(1); - + } + + if (configuration.showHelp.isSpecified()) configuration.parser.showHelp(); + getClassGraph(configuration).generateGraph(configuration.graphName.getValue()); if (configuration.isDebug()) @@ -32,7 +36,7 @@ public class Main { List jarFiles = configuration.jarFiles.getValue(); URLClassLoader classLoader = new URLClassLoader( - getFileUrls(jarFiles), + getClasspathUrls(jarFiles, configuration.classPaths.getValue()), configuration.getClass().getClassLoader()); ClassGraph classGraph = new ClassGraph(); @@ -45,9 +49,16 @@ public class Main { classGraph.setKeepDotFile(configuration.keepDotFile.getValue()); - for (File jarFile : jarFiles) - addJarToGraph(jarFile, classLoader, classGraph, configuration); + if (configuration.rootClasses.isSpecified()) { + // add only selected root classes + for (String rootClass : configuration.rootClasses.getValue()) + attemptClassAdditionByName(classLoader, classGraph, configuration, rootClass); + } else { + // add all classes in the jar files to graph + for (File jarFile : jarFiles) + addJarToGraph(jarFile, classLoader, classGraph, configuration); + } configuration.blacklistGlob.getValue().forEach(classGraph::blacklistClassGlob); configuration.whitelistGlob.getValue().forEach(classGraph::whitelistClassGlob); @@ -57,8 +68,17 @@ public class Main { return classGraph; } - private static URL[] getFileUrls(List jarFiles) { + private static URL[] getClasspathUrls(List jarFiles, List classpathDirectories) { List urls = new ArrayList<>(); + + classpathDirectories.forEach(classpathDirectory -> { + try { + urls.add(classpathDirectory.toURI().toURL()); + } catch (MalformedURLException e) { + throw new RuntimeException(e); + } + }); + jarFiles.forEach((File file) -> { try { urls.add(file.toURI().toURL()); @@ -74,17 +94,20 @@ public class Main { File jarFile, URLClassLoader classLoader, ClassGraph classGraph, CommandlineConfiguration configuration) throws IOException, ClassNotFoundException { - for (String className : getClassNamesFromJar(jarFile)) { + for (String className : getClassNamesFromJar(jarFile)) + attemptClassAdditionByName(classLoader, classGraph, configuration, className); + } + + private static void attemptClassAdditionByName(URLClassLoader classLoader, ClassGraph classGraph, CommandlineConfiguration configuration, String className) throws ClassNotFoundException { + if (configuration.isDebug()) + System.out.println("Adding class to graph: " + className); + try { + classGraph.add(loadClassByName(classLoader, className)); + } catch (NoClassDefFoundError e) { if (configuration.isDebug()) - System.out.println("Adding class to graph: " + className); - try { - classGraph.add(loadClassByName(classLoader, className)); - } catch (NoClassDefFoundError e){ - if (configuration.isDebug()) - System.out.println("Class definition was not found."); - // Sometimes referenced classes are not found in the same Jar. - // Let's ignore this and proceed with the classes that we have. - } + System.out.println("Class definition was not found."); + // Sometimes referenced classes are not found in the same Jar. + // Let's ignore this and proceed with the classes that we have. } }