1 package eu.svjatoslav.inspector.java.commandline;
3 import eu.svjatoslav.inspector.java.commandline.CommandlineConfiguration;
4 import eu.svjatoslav.inspector.java.structure.ClassGraph;
7 import java.io.FileInputStream;
8 import java.io.IOException;
9 import java.net.MalformedURLException;
11 import java.net.URLClassLoader;
12 import java.util.ArrayList;
13 import java.util.List;
14 import java.util.jar.JarEntry;
15 import java.util.jar.JarInputStream;
17 import static java.io.File.separator;
18 import static java.lang.System.getProperty;
21 * This class acts as a commandline interface for JavaInspect.
24 public static void main(String[] args) throws IOException, ClassNotFoundException {
25 CommandlineConfiguration configuration = new CommandlineConfiguration(args);
26 if (!configuration.configurationOk)
29 getClassGraph(configuration).generateGraph(configuration.graphName.getValue());
31 if (configuration.isDebug())
32 System.out.println("Graph ready.");
35 private static ClassGraph getClassGraph(CommandlineConfiguration configuration) throws IOException, ClassNotFoundException {
36 List<File> jarFiles = configuration.jarFiles.getValue();
38 URLClassLoader classLoader = new URLClassLoader(
39 getFileUrls(jarFiles),
40 configuration.getClass().getClassLoader());
42 ClassGraph classGraph = new ClassGraph();
44 classGraph.setTargetDirectory(getTargetDirectory(configuration));
46 if (configuration.targetImageType.isSpecified())
47 classGraph.setTargetImageType(configuration.targetImageType.getValue());
49 classGraph.setKeepDotFile(configuration.keepDotFile.getValue());
51 for (File jarFile : jarFiles)
52 addJarToGraph(jarFile, classLoader, classGraph, configuration);
54 configuration.blacklistGlob.getValue().forEach(classGraph::blacklistClassGlob);
55 configuration.whitelistGlob.getValue().forEach(classGraph::whitelistClassGlob);
57 if (configuration.hideOrphanedClasses.getValue())
58 classGraph.hideOrphanedClasses();
63 private static File getTargetDirectory(CommandlineConfiguration configuration) {
64 if (configuration.targetDirectory.isSpecified())
65 return configuration.targetDirectory.getValue();
67 // default to current directory
68 return new File(getProperty("user.dir") + separator);
71 private static URL[] getFileUrls(List<File> jarFiles) {
72 List<URL> urls = new ArrayList<>();
73 jarFiles.forEach((File file) -> {
75 urls.add(file.toURI().toURL());
76 } catch (MalformedURLException e) {
77 throw new RuntimeException(e);
81 return urls.toArray(new URL[urls.size()]);
84 private static void addJarToGraph(
85 File jarFile, URLClassLoader classLoader, ClassGraph classGraph, CommandlineConfiguration configuration)
86 throws IOException, ClassNotFoundException {
88 for (String className : getClassNamesFromJar(jarFile)) {
89 if (configuration.isDebug())
90 System.out.println("Adding class to graph: " + className);
92 classGraph.add(loadClassByName(classLoader, className));
96 private static Class loadClassByName(URLClassLoader classLoader, String className) throws ClassNotFoundException {
97 return Class.forName(className, true, classLoader);
100 public static List<String> getClassNamesFromJar(File jarFile) throws IOException {
101 List<String> result = new ArrayList<>();
103 JarInputStream jarInputStream = new JarInputStream(new FileInputStream(jarFile))
106 JarEntry jarEntry = jarInputStream.getNextJarEntry();
107 if (jarEntry == null)
110 if (isClassFile(jarEntry))
111 result.add(getClassNameFromFileName(jarEntry));
118 private static boolean isClassFile(JarEntry jarEntry) {
119 return jarEntry.getName().endsWith(".class");
122 private static String getClassNameFromFileName(JarEntry jarEntry) {
123 String result = jarEntry.getName().replaceAll("/", "\\.");
124 return result.substring(0, result.lastIndexOf('.'));