JavaInspect - Utility to visualize java software
Table of Contents
1. Introduction
JavaInspect utility simplifies understanding the computer program code by automatically visualizing its structure.
See example produced graphs for Sixth 3D - 3D engine project.
JavaInspect can be used as a standalone commandline utility as well as java library. JavaInspect uses primarily Java built-in reflection to discover and visualize any part of Java program.
JavaInspect currently has no graphical user interface, configuration files, embedded scripting support, direct Maven, Gradle or Ant integration. See usage to learn how to instuct Javainspect what to do.
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 or SVG format.
Notes:
- JavaInspect is developed and tested so far only on GNU/Linux.
A very simple example:
Graph legend:
1.1. See also
Similar or alternative solutions:
2. Installation
GraphViz - shall be installed on the computer.
On Ubuntu/Debian GraphViz can be installed using:
sudo apt-get install graphviz
To use JavaInspect via Java API, no further installation is needed. JavaInspect will be embedded into your project as dependency. This is described in usage via Java API. It will expect GraphViz to be available in the system.
To use JavaInspect as a commandline tool, JavaInspect source repository has to be cloned locally. See: Getting the source code.
Then study and execute installation script:
cd commandline\ launcher ./install
After installation, new commandline tool should be available
javainspect
Quick commandline usage help can be viewed by issuing
javainspect --help
3. Usage
JavaInspect utility can be used in 2 different ways:
3.1. Usage via Java API
Requires that classes to be visualised are available in the classpath.
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.
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. 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 glob 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 current directory)
- Keep intermediate GraphViz dot file for later inspection.
- Render graph.
3.1.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.1.2. Example 2: GraphViz embedded in another project
- Download project Sixth code snapshot.
- Inspect and run DataGraph.java.
3.1.3. Embedding JavaInspect in your Maven project
Declare JavaInspect as dependency:
<dependencies> ... <dependency> <groupId>eu.svjatoslav</groupId> <artifactId>javainspect</artifactId> <version>1.7</version> </dependency> ... </dependencies>
Add Maven repository to retrieve artifact from:
<repositories> ... <repository> <id>svjatoslav.eu</id> <name>Svjatoslav repository</name> <url>https://www3.svjatoslav.eu/maven/</url> </repository> ... </repositories>
4. Source code
This program is free software: released under Creative Commons Zero (CC0) license
Program author:
- Svjatoslav Agejenko
- Homepage: https://svjatoslav.eu
- Email: mailto://svjatoslav@svjatoslav.eu
- See also: Other software projects hosted at svjatoslav.eu
Getting the source code:
- Download latest source code snapshot in TAR GZ format
- Browse Git repository online
You can clone Git repository using git:
git clone https://www3.svjatoslav.eu/git/javainspect.git