1 package eu.svjatoslav.inspector.java.commandline;
3 import eu.svjatoslav.inspector.java.structure.ClassGraph;
6 import java.io.FileInputStream;
7 import java.io.IOException;
8 import java.net.MalformedURLException;
10 import java.net.URLClassLoader;
11 import java.util.ArrayList;
12 import java.util.List;
13 import java.util.jar.JarEntry;
14 import java.util.jar.JarInputStream;
17 * This class acts as a commandline interface for JavaInspect.
20 public static void main(String[] args) throws IOException, ClassNotFoundException {
21 CommandlineConfiguration configuration = new CommandlineConfiguration(args);
22 if (!configuration.configurationOk)
25 getClassGraph(configuration).generateGraph(configuration.graphName.getValue());
27 if (configuration.isDebug())
28 System.out.println("Graph ready.");
31 private static ClassGraph getClassGraph(CommandlineConfiguration configuration) throws IOException, ClassNotFoundException {
32 List<File> jarFiles = configuration.jarFiles.getValue();
34 URLClassLoader classLoader = new URLClassLoader(
35 getFileUrls(jarFiles),
36 configuration.getClass().getClassLoader());
38 ClassGraph classGraph = new ClassGraph();
40 if (configuration.targetDirectory.isSpecified())
41 classGraph.setTargetDirectory(configuration.targetDirectory.getValue());
43 if (configuration.targetImageType.isSpecified())
44 classGraph.setTargetImageType(configuration.targetImageType.getValue());
46 classGraph.setKeepDotFile(configuration.keepDotFile.getValue());
48 for (File jarFile : jarFiles)
49 addJarToGraph(jarFile, classLoader, classGraph, configuration);
51 configuration.blacklistGlob.getValue().forEach(classGraph::blacklistClassGlob);
52 configuration.whitelistGlob.getValue().forEach(classGraph::whitelistClassGlob);
54 if (configuration.hideOrphanedClasses.getValue())
55 classGraph.hideOrphanedClasses();
60 private static URL[] getFileUrls(List<File> jarFiles) {
61 List<URL> urls = new ArrayList<>();
62 jarFiles.forEach((File file) -> {
64 urls.add(file.toURI().toURL());
65 } catch (MalformedURLException e) {
66 throw new RuntimeException(e);
70 return urls.toArray(new URL[urls.size()]);
73 private static void addJarToGraph(
74 File jarFile, URLClassLoader classLoader, ClassGraph classGraph, CommandlineConfiguration configuration)
75 throws IOException, ClassNotFoundException {
77 for (String className : getClassNamesFromJar(jarFile)) {
78 if (configuration.isDebug())
79 System.out.println("Adding class to graph: " + className);
81 classGraph.add(loadClassByName(classLoader, className));
85 private static Class loadClassByName(URLClassLoader classLoader, String className) throws ClassNotFoundException {
86 return Class.forName(className, true, classLoader);
89 public static List<String> getClassNamesFromJar(File jarFile) throws IOException {
90 List<String> result = new ArrayList<>();
92 JarInputStream jarInputStream = new JarInputStream(new FileInputStream(jarFile))
95 JarEntry jarEntry = jarInputStream.getNextJarEntry();
99 if (isClassFile(jarEntry))
100 result.add(getClassNameFromFileName(jarEntry));
107 private static boolean isClassFile(JarEntry jarEntry) {
108 return jarEntry.getName().endsWith(".class");
111 private static String getClassNameFromFileName(JarEntry jarEntry) {
112 String result = jarEntry.getName().replaceAll("/", "\\.");
113 return result.substring(0, result.lastIndexOf('.'));