From: Svjatoslav Agejenko Date: Sun, 24 Dec 2017 11:51:49 +0000 (+0200) Subject: Merge branch 'master' of ssh://svjatoslav.eu/home/git/repositories/javainspect X-Git-Tag: javainspect-1.7~30 X-Git-Url: http://www2.svjatoslav.eu/gitweb/?p=javainspect.git;a=commitdiff_plain;h=9720b6ec40d9b10e5a2df8fad848b82f36451c1b;hp=6ef10da2e0c5083df6f2fbf8cc2dc784a8347329 Merge branch 'master' of ssh://svjatoslav.eu/home/git/repositories/javainspect --- diff --git a/.gitignore b/.gitignore index d8ed27d..a47ec35 100755 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,5 @@ /.classpath /target/ /.idea/ +dependency-reduced-pom.xml +/example/target diff --git a/README.md b/README.md new file mode 100644 index 0000000..5ffec69 --- /dev/null +++ b/README.md @@ -0,0 +1,47 @@ +# JavaInspect + +Visualize java class relationships as Graphviz. + +Forked from the original work from [Svjatoslav Agejenko](http://www.svjatoslav.eu/). +This repository only provides minor improvements. + +Original [git repository](http://www2.svjatoslav.eu/repositories/javainspect.git) + +Original [documentation](http://www2.svjatoslav.eu/gitbrowse/javainspect/doc/index.html) + +Minor enhancements: + +- Provides java main to run as CLI tool. +- Produces single executable with dependencies. +- Default to render SVG. +- Default to output to `user.dir` (i.e. working directory). + +### Building + +1. Install [Maven](http://maven.apache.org/). +2. Package JAR: + + `mvn clean package` + +### Running + +1. You will need to add the classes would like to visualize to your classpath. +2. Provide a package glob pattern to identify the classes you want to visualize. +3. Name your output. + +```bash +java \ + -cp .:./example/target/myproject-0.0.jar:./target/javainspect-1.6-SNAPSHOT.jar \ + eu.svjatoslav.inspector.java.methods.Main \ + ./example/src/main/java/ com.myproject.* myproject +``` + +Here we want to visualize _com.myproject.*_ classes found in +*./example/src/main/java/*. The resulting *dot* and *svg* +file will be prefixed with *myproject*. + +### Output example + +![MyProject output](https://github.com/abargnesi/javainspect/raw/master/myproject.png) + +The [dot](https://github.com/abargnesi/javainspect/raw/master/myproject.dot) file is also saved. diff --git a/example/pom.xml b/example/pom.xml new file mode 100644 index 0000000..e3d0312 --- /dev/null +++ b/example/pom.xml @@ -0,0 +1,24 @@ + + 4.0.0 + com.myproject + myproject + 0.0 + jar + MyProject + MyProject + + + + + org.apache.maven.plugins + maven-compiler-plugin + 2.3.2 + + 1.8 + 1.8 + UTF-8 + + + + + diff --git a/example/src/main/java/com/myproject/Behavior.java b/example/src/main/java/com/myproject/Behavior.java new file mode 100644 index 0000000..d35ce27 --- /dev/null +++ b/example/src/main/java/com/myproject/Behavior.java @@ -0,0 +1,10 @@ +package com.myproject; + +public interface Behavior { + + String translate(Object obj); + + default String serialize(Object obj) { + return obj.toString(); + } +} diff --git a/example/src/main/java/com/myproject/NumberTranslator.java b/example/src/main/java/com/myproject/NumberTranslator.java new file mode 100644 index 0000000..b0cb6c4 --- /dev/null +++ b/example/src/main/java/com/myproject/NumberTranslator.java @@ -0,0 +1,8 @@ +package com.myproject; + +public class NumberTranslator implements Behavior { + + public String translate(Object obj) { + return serialize(obj); + } +} diff --git a/myproject.dot b/myproject.dot new file mode 100644 index 0000000..068b68c --- /dev/null +++ b/myproject.dot @@ -0,0 +1,34 @@ +digraph Java { +graph [rankdir=LR, overlap = false, concentrate=true]; + +// Class: com.myproject.NumberTranslator + class_com_myproject_NumberTranslator[label=< + + // class descriptor header + + + // methods: + // translate + +
com.myproject
NumberTranslator
Stringtranslate
>, shape="none"]; + + // method references to other classes + + // interfaces implemented by class: com.myproject.NumberTranslator + class_com_myproject_Behavior -> class_com_myproject_NumberTranslator[style="dotted", color="antiquewhite4", penwidth=10, dir="forward"]; + +// Class: com.myproject.Behavior + class_com_myproject_Behavior[label=< + + // class descriptor header + + + // methods: + // serialize + + // translate + +
com.myproject
Behavior
Stringserialize
Stringtranslate
>, shape="none"]; + + // method references to other classes +} diff --git a/myproject.png b/myproject.png new file mode 100644 index 0000000..268779f Binary files /dev/null and b/myproject.png differ diff --git a/myproject.svg b/myproject.svg new file mode 100644 index 0000000..afec2ba --- /dev/null +++ b/myproject.svg @@ -0,0 +1,45 @@ + + + + + + +Java + + +class_com_myproject_NumberTranslator + +com.myproject +NumberTranslator + +String + +translate + + + +class_com_myproject_Behavior + + +com.myproject +Behavior + +String + +serialize + +String + +translate + + + +class_com_myproject_Behavior->class_com_myproject_NumberTranslator + + + + + diff --git a/pom.xml b/pom.xml index 0026b6e..fbdb534 100644 --- a/pom.xml +++ b/pom.xml @@ -72,6 +72,26 @@ + + org.apache.maven.plugins + maven-shade-plugin + 2.4.3 + + + package + + shade + + + + + eu.svjatoslav.inspector.java.methods.Main + + + + + + @@ -118,4 +138,4 @@ scm:git:ssh://git@svjatoslav.eu/home/git/repositories/javainspect.git - \ No newline at end of file + diff --git a/src/main/java/eu/svjatoslav/inspector/java/methods/Main.java b/src/main/java/eu/svjatoslav/inspector/java/methods/Main.java new file mode 100644 index 0000000..7450c99 --- /dev/null +++ b/src/main/java/eu/svjatoslav/inspector/java/methods/Main.java @@ -0,0 +1,30 @@ +package eu.svjatoslav.inspector.java.methods; + +import eu.svjatoslav.inspector.java.structure.ClassGraph; + +import java.io.File; + +import static java.lang.System.getProperty; + +public class Main { + public static void main(String[] args) { + if (args.length == 0) { + System.err.println("usage: javainspect [PROJECT_DIR] [PACKAGE_GLOB] [GRAPH_NAME]"); + System.exit(1); + } + + String projectDir = args[0]; + String packageGlob = args[1]; + String graphName = args[2]; + + ClassGraph cg = new ClassGraph(); + cg.setTargetDirectory(getProperty("user.dir") + File.separator); + + cg.addProject(projectDir); + cg.whitelistClassPattern(packageGlob); + cg.setKeepDotFile(true); + cg.generateGraph(graphName); + + System.exit(0); + } +} diff --git a/src/main/java/eu/svjatoslav/inspector/java/structure/ClassGraph.java b/src/main/java/eu/svjatoslav/inspector/java/structure/ClassGraph.java index 1488b1c..c6b6cbf 100755 --- a/src/main/java/eu/svjatoslav/inspector/java/structure/ClassGraph.java +++ b/src/main/java/eu/svjatoslav/inspector/java/structure/ClassGraph.java @@ -93,7 +93,7 @@ public class ClassGraph { public void generateGraph(final String resultFileName) { final String dotFilePath = targetDirectory + resultFileName + ".dot"; - final String imageFilePath = targetDirectory + resultFileName + ".png"; + final String imageFilePath = targetDirectory + resultFileName + ".svg"; System.out.println("Dot file path:" + dotFilePath); @@ -106,7 +106,7 @@ public class ClassGraph { // execute GraphViz to visualize graph try { Runtime.getRuntime() - .exec(new String[]{"dot", "-Tpng", dotFilePath, "-o", + .exec(new String[]{"dot", "-Tsvg", dotFilePath, "-o", imageFilePath}).waitFor(); } catch (final InterruptedException ignored) { }