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.
++-
1 General
++--
+
- This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. -
- Program author: +
- Program authors:
- Svjatoslav Agejenko - + +
+
+ - Tony Bargnesi
+
-
+
- GitHub fork for the project: +https://github.com/abargnesi/javainspect + +
- other applications hosted at svjatoslav.eu +
++1.1 Source code
+++-
+
- Download latest snapshot in TAR GZ format + + +
- Browse Git repository online + + +
- Clone Git repository using command:
+
+git clone http://www2.svjatoslav.eu/git/javainspect.git +
-1 General
-++-2 Goal and operating principle
+Goal: simplify/speed up understanding the computer program code by automatically visualizing its structure.
-JavaInspect is a Java library that you can embed into your Java -project with a few lines of Maven configuration and then visualize any -part of your Java program structure with few simple JavaInspect API -calls at application runtime. +See example produced graphs for Sixth 3D - 3D engine project.
-JavaInspect uses Java reflection to discover class relations and -structure and produces GraphViz dot file that describes your -application. Then launches GraphViz to generate bitmap graph in PNG -format on your Desktop directory. +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 GUI, configuration files, embedded +scripting support, direct Maven 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. +
+ ++By default on your Desktop directory when operated in library mode or +current working directory when operated as standalone commandline +application.
--2 Current status
--This is simple utility, quickly written. Tested on GNU Linux (can be -relatively simply ported to other operating systems too). So far I -used it for my own needs. There might be bugs and missing -features. Feedback and code contributions are welcome. +Notes:
+-
+
- JavaInspect is developed and tested so far only on GNU/Linux. + +
- See: Madge - similar tool for JavaScript + +
3 Example graphs
-+-Example visualization of Sixth project: architecture graphs. +
-
+
- A very simple example:
+
+
+
-A very simple example: +Graph legend:
-
+4 Usage
++++JavaInspect can be controlled in 2 different ways: +
+ ++4.1 usage as commandline utility
+-Graph legend: +To enable commandline support, (study and) execute script:
++commandline launcher/install +
++Warning: It was tested only on Debian Stretch linux. +
--+
+Available commandline arguments: +
++-j (existing files)…
+ JAR file(s) to render.
+
+-n (mandatory, string)
+ Graph name.
+
+–debug
+ Show debug info.
+
+-k
+ Keep dot file.
+
+-h
+ Hide orphaned classes.
+
+-w (one to many strings)…
+ Whitelist glob(s).
+
+-b (one to many strings)…
+ Blacklist glob(s).
+
+-d (existingdirectory)
+ Target directory. Default is current directory.
+
+-t (options: png, svg)
+ Target image type. Default is: svg.
+4.2 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. + +
- 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. + +
-4 Usage example 1
-+ ++-4.2.1 example 1: individually picked objects
+This example demonstrates generating of class graph from hand picked -classes. +classes and visualizing GraphViz itself.
-+// Create graph -final ClassGraph graph = new ClassGraph(); +
// Create graph +final ClassGraph graph = new ClassGraph(); -// While classes and objects can be immediately passed to ClassGraph -// constructor as arguments, it is also possible to add them one by -// one as in the following example. +// Add some random object to the graph. GraphViz will detect Class from +// the object. +graph.add(graph); -// Add some object to the graph. -graph.addObject(graph); +// Also add some random class to the graph. +graph.add(Utils.class); -// Add some class to the graph. -graph.addClass(Utils.class); +// Keep intermediary GraphViz DOT file for reference. +graph.setKeepDotFile(true); -// Produce bitmap image titled "JavaInspect.png" to the user Desktop -// directory and keep intermediary GraphViz DOT file for reference. -graph.generateGraph("JavaInspect", 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"); +
+@@ -288,28 +516,27 @@ Result:
-5 Usage example 2
---Recursively scan current directory for Java source code and attempt to -detect class names from there to be added to the graph. -
- ++-4.2.2 example 2: scan java code, apply filters
+-graph.addProject("."); +
// 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.getFilter().blacklistClassPattern( - "eu.svjatoslav.inspector.java.structure.example.*"); +// 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 +// 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"); +// Produce bitmap image titled "JavaInspect full project.png" to the +// user Desktop directory. +graph.generateGraph("JavaInspect full project");
@@ -322,23 +549,35 @@ Result:
--6 Embedding JavaInspect in your Maven project
-++++ +4.2.3 example 3: GraphViz embedded in another project
+++-
+
- Download project Sixth code snapshot. + +
- Inspect and run *DataGraph.java*. + +
++4.2.4 Embedding JavaInspect in your Maven project
+Declare JavaInspect as dependency:
-@@ -348,23 +587,25 @@ Add Maven repository to retrieve artifact from:<dependencies> +
<dependencies> ... - <dependency> - <groupId>eu.svjatoslav</groupId> - <artifactId>javainspect</artifactId> - <version>1.3</version> - </dependency> + <dependency> + <groupId>eu.svjatoslav</groupId> + <artifactId>javainspect</artifactId> + <version>1.6</version> + </dependency> ... -</dependencies> +</dependencies>
-<repositories> +
<repositories> ... - <repository> - <id>svjatoslav.eu</id> - <name>Svjatoslav repository</name> - <url>http://www2.svjatoslav.eu/maven/</url> - </repository> + <repository> + <id>svjatoslav.eu</id> + <name>Svjatoslav repository</name> + <url>http://www2.svjatoslav.eu/maven/</url> + </repository> ... -</repositories> +</repositories>
-7 Requirements
-+++5 Requirements
+GraphViz - shall be installed on the computer.
@@ -372,56 +613,159 @@ Add Maven repository to retrieve artifact from:On Ubuntu/Debian use:
--sudo apt-get install graphviz +
+ +sudo apt-get install graphviz
-8 TODO
-++++6 TO DO
+++Note: Because this is side project (and I have many of them) I can +only contribute few hours per year at average. Any help is welcome. A +LOT of cool ideas could be implemented. For intstance: +
+- 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. -
- BUG: Current code is quite messy (because of lack of time) things -were implemented ad-hoc. Needs cleanup/refactoring for better -readability. + +
- BUG: Orphaned class removal does not work always. There are many +bugs and corner cases to find and fix still. -
- FEATURE: add dark theme + +
- BUG: Code is not very readable. Document and refactor for better +maintainability. -
- FEATURE: sort Class fields by alphabet + +
- FEATURE: Create installable DEB package.
+
-
+
- Submit it to some Debian developer for integration or become +Debian package maintainer. + +
+
+ - FEATURE: Make it modular. That is: central part, an application
+model could be standalone and serializable.
+
+
-
+
- There could be multiple ways to acquire model:
+
-
+
- By introspecting application via Java reflections (current mode +of operation). + +
- By parsing java source. (unfinished) + +
+
+ - There could be ways to manipulate model:
+
-
+
- Store/load/compare. -
- FEATURE: visualize also concrete field values so it could be used as -ultra cool runtime logging framework +
- Trim uninteresting parts. -
- FEATURE: possibility to visualize structure and data from JVM -snapshot +
- Highlight important parts. + +
+
+ - There could be multiple ways to render model:
+
-
+
- PNG/SVG (currently implemented) + +
- PlantUML (TODO) + +
- Interactive 3D visualization (TODO) + +
+
- - There could be multiple ways to acquire model:
+
- FEATURE: possibility to attach to remote process to visualize + +
- FEATURE: Replace internal java parser in package +eu.svjatoslav.inspector.java.methods with: https://javaparser.org/ + + +
- FEATURE: Integarte with PlantUML. + + +
- FEATURE: Add dark theme for generated graphs. + + +
- FEATURE: Sort Class fields by alphabet. + + +
- FEATURE: Visualize also concrete field values so it could be used as +ultra cool runtime logging/debugging 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 attach to JVM using JVM agent. + + +
- FEATURE: Possibility to inspect graphs in 3D using Sixth 3D engine. -
- FEATURE: possibility to script javainspect behavior + +
- FEATURE: Possibility to select classes/fields/values to be +visualized in some graph query language. For greater flexibility in +comparison to currently supported glob syntax. -
- FEATURE: possibility to select classes/fields/values to be -visualized in SQL like syntax + +
- FEATURE: Add option to control JavaInspect via JSON or XML config +file. For example different graphs for given project could be +defined once in plain text config, possibly with the aid of some +interactive utility. Then defined graphs could be updated as part of +project build or release process. -
- FEATURE: configurable maven plugin to generate graphs as part of the -project build/release process + +
- FEATURE: Configurable maven plugin to generate graphs as part of the +project build/release process.