JavaInspect - Utility to visualize java software
+JavaInspect - Utility to visualize java software
+Table of Contents
+1 General
+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. - +License, or (at your option) any later version.
- Program authors:
- Svjatoslav Agejenko
-
-
- Homepage: https://svjatoslav.eu - -
- Email: mailto://svjatoslav@svjatoslav.eu - -
- Other software projects hosted at svjatoslav.eu - -
+ - Homepage: https://svjatoslav.eu +
- Email: mailto://svjatoslav@svjatoslav.eu +
- Other software projects hosted at svjatoslav.eu +
- Svjatoslav Agejenko
- Tony Bargnesi
- GitHub fork for the project: -https://github.com/abargnesi/javainspect - -
-
1.1 Source code
+1.1 Source code
-
-
- Download latest snapshot in TAR GZ format - +
- Download latest snapshot in TAR GZ format -
- Browse Git repository online - +
- Browse Git repository online -
- Clone Git repository using command: +
+Clone Git repository using command: +
git clone https://www2.svjatoslav.eu/git/javainspect.git - -
-
+
2 Goal and operating principle
+2 Goal and operating principle
Goal: simplify/speed up understanding the computer program code by @@ -266,15 +321,15 @@ automatically visualizing its structure.
-JavaInspect can be used as a standalone commandline utility as well as -java library. JavaInspect uses primarily Java built-in reflection to +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. +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.
@@ -288,111 +343,207 @@ bitmap graph in PNG or SVG format. Notes:
-
-
- JavaInspect is developed and tested so far only on GNU/Linux. - -
- See: Madge - similar tool for JavaScript - +
- JavaInspect is developed and tested so far only on GNU/Linux.
3 Example graphs
+3 Example graphs
-
-
- A very simple example: +
+A very simple example: +
-
4 Usage
+4 Installation
-JavaInspect can be controlled in 2 different ways: +GraphViz - shall be installed on the computer.
- + ++On Ubuntu/Debian GraphViz can be installed using: +
+sudo apt-get install graphviz +
4.1 usage as commandline utility
--To enable commandline support, (study and) execute script: +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 Source code. +
+ ++Then study and execute installation script:
commandline launcher/install ++ +
+After installation, new commandline tool should be available +
++javainspect+
-Warning: It was tested only on Debian Stretch linux. +Quick commandline usage help can be viewed by issuing
++javainspect --help ++
5 Usage
+-Available commandline arguments: +JavaInspect can be controlled in 2 different ways:
+ +5.1 Usage as commandline utility
+5.1.1 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
-+ JAR file(s) to render.
+
+-c (existing directories)…
+ Classpath directories
+
+-n (string)
+ Graph name. (default: "graph")
+
+–debug
+ Show debug info.
+
+-h, –help
+ Show commandline usage help.
+
+-k
+ Keep dot file.
+
+-ho
+ Hide orphaned classes.
+
+-w (one to many strings)…
+ Whitelist glob(s).
+
+-b (one to many strings)…
+ Blacklist glob(s).
+
+-r (one to many strings)…
+ root class(es).
+
+-d (existing directory)
+ Target directory. Default is current directory.
+
+-t (options: png, svg)
+ Target image type. Default is: svg.
+ +
5.1.2 Specifying classes to render
++Normal Java application has immense complexity. In addition to code +that was directly written by particular project developers, lots of +functionality is typically added as frameworks or libraries to the +project. In addition there is significant Java standard library. +
+ ++Because JavaInspect uses reflection, it does not easily distinguish +between those. In normal situation you would rather want to visualize +only code that was developed specifically for your project and leave +frameworks like Spring etc. out. If you visualize all classes that are +possibly reachable from you project, you will easily get huge and +incomprehensible graph. +
+ ++JavaInspect can digest compiled Java classes in 2 modes: +
+-
+
- Provide list of Jar files. Use -j option. +
- Provide list of filesystem directories that can be used as +classpath root. Use -c option. +
+Currently JavaInspect uses following algorithm to add classes to +rendered graph: +
+ +-
+
- All classes that were found in Jar files are added to graph by default. +
- None of the classes that were found in filesystem directories are +added to the graph by default (unless explicitly referenced). (TODO: +for consistency it would be better to add them too by default) +
- If whitelist is specified (-w option) everything that is not +matched by whitelist pattern(s) will be removed from the graph. +
- If blacklist is specified (-b option) everything that is matched +by blacklist pattern(s) will be removed from the graph. +
- Root classes can be specified using -r option. Root classes will +be added to the graph. JavaInspect will then try to recursively +discover all classes that were referenced by root class and add +those also to the graph. +
5.2 Usage via Java API
+Requires that classes to be visualised are available in the classpath.
@@ -403,15 +554,13 @@ up with 2 solutions:-
-
- Add JavaInspect library in your project as a dependency. - +
- 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. - +reflection.
@@ -425,48 +574,40 @@ product or project artifact I'm just willing to visualize. Control code in general does the following:
-
-
- Create graph object. - +
- 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. - +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. - +whitelist.
- Optionally we can tune some rendering parameters like:
- Possibility to remove orphaned classes (classes with no -references) from the graph. - +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. - +files. (Default is current directory) +
- Keep intermediate GraphViz dot file for later inspection. + +
- Render graph.
4.2.1 example 1: individually picked objects
-5.2.1 Example 1: individually picked objects
+This example demonstrates generating of class graph from hand picked classes and visualizing GraphViz itself.
// Create graph ++// Create graph final ClassGraph graph = new ClassGraph(); // Add some random object to the graph. GraphViz will detect Class from @@ -490,7 +631,6 @@ graph.generateGraph("JavaInspect"); Note: if desired, more compact version of the above:-new ClassGraph().add(randomObject, RandomClass.class) .setKeepDotFile(true).generateGraph("JavaInspect");@@ -501,34 +641,29 @@ Note: if desired, more compact version of the above: Result:-
- Generated DOT file: JavaInspect.dot -
-- Generated PNG image: JavaInspect.png -
+- Generated DOT file: JavaInspect.dot
+- Generated PNG image: JavaInspect.png
4.2.2 example 2: GraphViz embedded in another project
-5.2.2 Example 2: GraphViz embedded in another project
+-
-
- Download project Sixth code snapshot. - -
- Inspect and run DataGraph.java. - +
- Download project Sixth code snapshot. +
- Inspect and run DataGraph.java.
4.2.3 Embedding JavaInspect in your Maven project
-5.2.3 Embedding JavaInspect in your Maven project
+Declare JavaInspect as dependency:
<dependencies> ... <dependency> @@ -546,7 +681,6 @@ Declare JavaInspect as dependency: Add Maven repository to retrieve artifact from:-<repositories> ... <repository> @@ -563,25 +697,8 @@ Add Maven repository to retrieve artifact from:
5 Requirements
--GraphViz - shall be installed on the computer. -
- --On Ubuntu/Debian use: -
-sudo apt-get install graphviz --
6 TO DO
+6 TO DO
Note: Because this is side project (and I have many of them) I can @@ -593,24 +710,19 @@ LOT of cool ideas could be implemented. For intstance:
- Submit it to some Debian developer for integration or become -Debian package maintainer. - -
- By introspecting application via Java reflections (current mode -of operation). - -
- By parsing java source. (unfinished) - -
-
-
- Store/load/compare. - -
- Trim uninteresting parts. - -
- Highlight important parts. - -
-
-
- PNG/SVG (currently implemented) - -
- PlantUML (TODO) - -
- Interactive 3D visualization (TODO) - -
7 See also
+7 See also
Similar or alternative solutions: