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())
List<File> jarFiles = configuration.jarFiles.getValue();
URLClassLoader classLoader = new URLClassLoader(
- getFileUrls(jarFiles),
+ getClasspathUrls(jarFiles, configuration.classPaths.getValue()),
configuration.getClass().getClassLoader());
ClassGraph classGraph = new ClassGraph();
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);
return classGraph;
}
- private static URL[] getFileUrls(List<File> jarFiles) {
+ private static URL[] getClasspathUrls(List<File> jarFiles, List<File> classpathDirectories) {
List<URL> 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());
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);
+ 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("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.
}
}