JavaInspect - Utility to visualize java software
+Table of Contents
+ ++
-
+
- download latest snapshot + + +
- This program is free software; you can redistribute it and/or modify +it under the terms of version 3 of the GNU Lesser General Public +License or later as published by the Free Software Foundation. + + +
- Program author:
+
-
+
- Svjatoslav Agejenko + +
- Homepage: http://svjatoslav.eu + +
- Email: mailto://svjatoslav@svjatoslav.eu + +
+
+ - other applications hosted at svjatoslav.eu + +
1 General
++Goal: simplify/speed up understanding the computer program code by +automatically visualizing its structure. +
+ ++JavaInspect is a Java library that primarily uses Java reflection to +discover and visualize any part of Java program provided that +classes to be visualised are available in the classpath. +
+ ++JavaInspect currently has no GUI, configuration files, embedded +scripting support, direct Maven or Ant integration. The only way to +instuct Javainspect what to do is by using its Java API. +
+ ++To get JavaInspect into same classpath with your projecs I so far came +up with 2 solutions: +
+ +-
+
- Add JavaInspect library in your project as a dependency. + +
- Create new Java project for the purpose visualizing your other +projects and include JavaInspect and your projecs binary artifacts +(Jar's) into new project classpath. Built binary Jar's (with no +source code) are sufficient because JavaInspect operates via +reflection. + +
+After discovering application structure and optionally filtering out +unimportant parts, JavaInspect produces GraphViz dot file that +describes data to be visualized. Then launches GraphViz to generate +bitmap graph in PNG format. By default on your Desktop directory. +
+ ++Note: GraphViz is developed and tested so far only on GNU Linux. +
+2 Example graphs
+-
+
- A very simple example:
+
+
+
+
+
+Graph legend: +
+ + ++++
+
+
+ - Example visualization of Sixth project: architecture graphs. + +
3 Usage
++Currently the only way to control JavaInspect is by using Java +API. Simple Java based control/configuration code needs to be written +for each project. I usually put such code into directories devoted for +JUnit tests. Because it needs not to be compiled/embedded into final +product or project artifact I'm just willing to visualize. +
+ ++Control code in general does the following: +
+-
+
- Create graph object. + +
- Java reflection/classloaders does not provide mechanism for
+discovering all classes under given package. Therefore you need to
+declare at least some classes to be added to the graph by:
+
-
+
- Manually adding individual classes to the graph. + +
- and/or: Let GraphViz recursively scan and parse specified +directories with Java source code files to discover class names. + +
- For every class added to the graph, GraphViz will recursively +inspect it and add all referecned classes to the graph as well. + +
+ - Graphs easilly get very big and complex so optionally we filter +important code using classname wildcards patterns based blacklist +and/or whitelist. + +
- Optionally we can tune some rendering parameters like:
+
-
+
- Possibility to remove orphaned classes (classes with no +references) from the graph. + +
- Specify target directory for generated visualization +files. (Default is user desktop directory) + +
- Keep intermediate GraphViz dot file for later inspection. + +
+ - Render graph. + +
3.1 example 1: individually picked objects
++This example demonstrates generating of class graph from hand picked +classes and visualizing GraphViz itself. +
+ +// Create graph +final ClassGraph graph = new ClassGraph(); + +// Add some random object to the graph. GraphViz will detect Class from +// the object. +graph.add(graph); + +// Also add some random class to the graph. +graph.add(Utils.class); + +// Keep intermediary GraphViz DOT file for reference. +graph.setKeepDotFile(true); + +// Produce bitmap image titled "JavaInspect.png" to the user Desktop +// directory +graph.generateGraph("JavaInspect"); ++
+Note: if desired, more compact version of the above: +
+new ClassGraph().add(randomObject, RandomClass.class) + .setKeepDotFile(true).generateGraph("JavaInspect"); ++
+Result: +
+-
+
- Generated DOT file: JavaInspect.dot + +
- Generated PNG image: JavaInspect.png + +
3.2 example 2: scan java code, apply filters
+// Create graph +final ClassGraph graph = new ClassGraph(); + +// Recursively scan current directory for Java source code and attempt +// to detect class names from there to be added to the graph. +graph.addProject("."); + +// Blacklist example classes from being shown on the graph +graph.blacklistClassPattern("eu.svjatoslav.inspector.java.structure.example.*"); + +// do not show single classes with no relationships on the graph +graph.hideOrphanedClasses(); + +// Produce bitmap image titled "JavaInspect full project.png" to the +// user Desktop directory. +graph.generateGraph("JavaInspect full project"); ++
+Result: +
+-
+
- Generated PNG image: JavaInspect full project.png + +
3.3 example 3: GraphViz embedded in another project
+-
+
- Download project Sixth code snapshot. + +
- Inspect and run DataGraph.java. + +
4 Embedding JavaInspect in your Maven project
++Declare JavaInspect as dependency: +
+<dependencies> + ... + <dependency> + <groupId>eu.svjatoslav</groupId> + <artifactId>javainspect</artifactId> + <version>1.5-SNAPSHOT</version> + </dependency> + ... +</dependencies> ++
+Add Maven repository to retrieve artifact from: +
+<repositories> + ... + <repository> + <id>svjatoslav.eu</id> + <name>Svjatoslav repository</name> + <url>http://www2.svjatoslav.eu/maven/</url> + </repository> + ... +</repositories> ++
5 Requirements
++GraphViz - shall be installed on the computer. +
+ ++On Ubuntu/Debian use: +
+sudo apt-get install graphviz ++
6 TODO
+-
+
- BUG: Should not hide references if there are too many of them to +classes if referring classes are not visible anyway because of +blacklist/whitelist rules. Basically reference counting should +exclude not visible classes. + +
- FEATURE: add dark theme + +
- FEATURE: sort Class fields by alphabet + +
- FEATURE: visualize also concrete field values so it could be used as +ultra cool runtime logging framework + +
- FEATURE: possibility to visualize structure and data from JVM +snapshot + +
- FEATURE: possibility to attach to remote process to visualize +data/structure using JVM debug port and mechanism. + +
- FEATURE: possibility to attach to JVM using JVM agent + +
- FEATURE: possibility to script javainspect behavior + +
- FEATURE: possibility to select classes/fields/values to be +visualized in SQL like syntax + +
- FEATURE: configurable maven plugin to generate graphs as part of the +project build/release process + +