package eu.svjatoslav.inspector.java.commandline;
-import eu.svjatoslav.inspector.java.commandline.CommandlineConfiguration;
import eu.svjatoslav.inspector.java.structure.ClassGraph;
import java.io.File;
import java.util.jar.JarEntry;
import java.util.jar.JarInputStream;
-import static java.io.File.separator;
-import static java.lang.System.getProperty;
-
/**
* This class acts as a commandline interface for JavaInspect.
*/
ClassGraph classGraph = new ClassGraph();
- classGraph.setTargetDirectory(getTargetDirectory(configuration));
+ if (configuration.targetDirectory.isSpecified())
+ classGraph.setTargetDirectory(configuration.targetDirectory.getValue());
if (configuration.targetImageType.isSpecified())
classGraph.setTargetImageType(configuration.targetImageType.getValue());
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 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) -> {
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.
}
}