From: Svjatoslav Agejenko Date: Sun, 27 Sep 2026 15:04:10 +0000 (+0300) Subject: build: upgrade to Java 21 and reorganize documentation X-Git-Url: http://www2.svjatoslav.eu/gitweb/?a=commitdiff_plain;h=HEAD;p=javainspect.git build: upgrade to Java 21 and reorganize documentation Bump java.version, maven.compiler source/target and the compiler plugin configuration from 1.8 to 21. Rename doc/ to Documentation/ following the house convention, updating .gitignore, Tools/Update web site and AGENTS.md accordingly. Reorganize the Documentation pages into prerequisite reading order: the overview page leads with Introduction and Usage before Installation and Source code; the CLI page explains class selection concepts before the argument reference; the Java API page covers Maven embedding before the examples. Fix stale content: retarget sixth-3d links to the renamed Aukio 3D project site, update CLI examples to aukio-3d artifacts and packages, and mark the embedded-project example as outdated. Align with the shared doc-set conventions: add the canonical style.css, link it from every page via HTML_HEAD, give every heading a CUSTOM_ID, use anchor-form back-links on sub-pages, and record the conventions in AGENTS.md. --- diff --git a/.gitignore b/.gitignore index 6c235d2..f532c33 100755 --- a/.gitignore +++ b/.gitignore @@ -9,5 +9,5 @@ dependency-reduced-pom.xml /JavaInspect.dot /JavaInspect.svg *.html -/doc/graphs/ -/doc/apidocs/ +/Documentation/graphs/ +/Documentation/apidocs/ diff --git a/AGENTS.md b/AGENTS.md index 93ead91..ee1a7ba 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -228,8 +228,27 @@ mvn exec:java -Dexec.mainClass="eu.svjatoslav.inspector.java.RenderJavaInspect" # Documentation -| Path | Topic | -|-----------------|-------------------------------------------------------| -| `doc/index.org` | Main documentation, usage examples, Maven integration | -| `doc/apidocs/` | Generated Javadoc | -| `COPYING` | CC0 license full text | \ No newline at end of file +| Path | Topic | +|-----------------------------------|-------------------------------------------------------| +| `Documentation/index.org` | Main documentation, usage examples, Maven integration | +| `Documentation/apidocs/` | Generated Javadoc | +| `COPYING` | CC0 license full text | + +## Documentation conventions + +- Every heading carries a `:PROPERTIES:` drawer with `:CUSTOM_ID: + ` immediately after the heading line — without it + org-html export emits `org` anchors. Sub-pages also carry a + file-level drawer (before `#+SETUPFILE:`) as identity marker. +- Every page links the shared stylesheet via `#+HTML_HEAD: + ` (`../style.css` in + subdirectories); `Documentation/style.css` is copied verbatim from + sibling projects. +- Sub-page back-links use the anchor form + `[[file:../index.html#outline-container-
][<- Back to index]]`. +- Verify with `emacs --batch -l ~/.emacs --visit=.org + --funcall=org-html-export-to-html --kill` — no "Unable to resolve + link" output and no `outline-container-org` ids in the HTML. + The darksun theme renders top-level sections as tabs; screenshot + each tab via its `#` anchor URL with headless Chrome + (`--virtual-time-budget=8000`). \ No newline at end of file diff --git a/Documentation/JavaInspect full project.png b/Documentation/JavaInspect full project.png new file mode 100644 index 0000000..4d5ebba Binary files /dev/null and b/Documentation/JavaInspect full project.png differ diff --git a/Documentation/JavaInspect.dot b/Documentation/JavaInspect.dot new file mode 100644 index 0000000..660c81c --- /dev/null +++ b/Documentation/JavaInspect.dot @@ -0,0 +1,316 @@ +digraph Java { +graph [rankdir=LR, overlap = false, concentrate=true]; + +// Class: eu.svjatoslav.inspector.java.structure.Filter + class_eu_svjatoslav_inspector_java_structure_Filter[label=< + + // class descriptor header + + + // fields: + // blacklistClassPatterns + + // whitelistClassPatterns + + + // methods: + // blacklistClassPattern + + // isClassShown + + // whitelistClassPattern + +
eu.svjatoslav.inspector.java.structure
Filter
ListblacklistClassPatterns
ListwhitelistClassPatterns
voidblacklistClassPattern
booleanisClassShown
voidwhitelistClassPattern
>, shape="none"]; + + // field references to other classes + + // method references to other classes + +// Class: eu.svjatoslav.inspector.java.structure.FieldDescriptor + class_eu_svjatoslav_inspector_java_structure_FieldDescriptor[label=< + + // class descriptor header + + + // fields: + // name + + // parent + + // type + + // typeArguments + + + // methods: + // getDot + + // getEmbeddedDot + + // getGraphId + + // getOutsideVisibleReferencesCount + + // isVisible + +
eu.svjatoslav.inspector.java.structure
FieldDescriptor
Stringname
ClassDescriptorparent
ClassDescriptortype
ListtypeArguments
StringgetDot
StringgetEmbeddedDot
StringgetGraphId
intgetOutsideVisibleReferencesCount
booleanisVisible
>, shape="none"]; + + // field references to other classes + + // method references to other classes + + // interfaces implemented by class: eu.svjatoslav.inspector.java.structure.FieldDescriptor + class_eu_svjatoslav_inspector_java_structure_GraphElement -> class_eu_svjatoslav_inspector_java_structure_FieldDescriptor[style="dotted, tapered", color="olivedrab2", penwidth=20, dir="forward"]; + +// Class: eu.svjatoslav.inspector.java.structure.MethodDescriptor + class_eu_svjatoslav_inspector_java_structure_MethodDescriptor[label=< + + // class descriptor header + + + // fields: + // name + + // parent + + // returnType + + // typeArguments + + + // methods: + // compareTo + + // compareTo + + // getDot + + // getEmbeddedDot + + // getGraphId + + // getMethodLabel + + // getOutsideVisibleReferencesCount + + // isVisible + +
eu.svjatoslav.inspector.java.structure
MethodDescriptor
Stringname
ClassDescriptorparent
ClassDescriptorreturnType
ListtypeArguments
intcompareTo
intcompareTo
StringgetDot
StringgetEmbeddedDot
StringgetGraphId
StringgetMethodLabel
intgetOutsideVisibleReferencesCount
booleanisVisible
>, shape="none"]; + + // field references to other classes + + // method references to other classes + + // interfaces implemented by class: eu.svjatoslav.inspector.java.structure.MethodDescriptor + class_eu_svjatoslav_inspector_java_structure_GraphElement -> class_eu_svjatoslav_inspector_java_structure_MethodDescriptor[style="dotted, tapered", color="olivedrab2", penwidth=20, dir="forward"]; + +// Class: eu.svjatoslav.inspector.java.structure.Utils + class_eu_svjatoslav_inspector_java_structure_Utils[label=< + + // class descriptor header + + + // fields: + // darkColors + + // enumMethods + + // lastChosenDarkColor + + // lastChosenLightColor + + // lightColors + + // systemDataTypes + + // systemMethods + + // systemPackages + + + // methods: + // getNextDarkColor + + // getNextLightColor + + // initDarkColors + + // initEnumMethods + + // initLightColors + + // initSystemDataTypes + + // initSystemMethods + + // initSystemPackages + + // isEnumMethod + + // isSystemDataType + + // isSystemMethod + + // isSystemPackage + +
eu.svjatoslav.inspector.java.structure
Utils
ListdarkColors
ListenumMethods
intlastChosenDarkColor
intlastChosenLightColor
ListlightColors
ListsystemDataTypes
ListsystemMethods
ListsystemPackages
StringgetNextDarkColor
StringgetNextLightColor
voidinitDarkColors
voidinitEnumMethods
voidinitLightColors
voidinitSystemDataTypes
voidinitSystemMethods
voidinitSystemPackages
booleanisEnumMethod
booleanisSystemDataType
booleanisSystemMethod
booleanisSystemPackage
>, shape="none"]; + + // field references to other classes + + // method references to other classes + +// Class: eu.svjatoslav.inspector.java.structure.GraphElement + class_eu_svjatoslav_inspector_java_structure_GraphElement[label=< + + // class descriptor header + + + // methods: + // getDot + + // getEmbeddedDot + + // getGraphId + + // isVisible + +
eu.svjatoslav.inspector.java.structure
GraphElement
StringgetDot
StringgetEmbeddedDot
StringgetGraphId
booleanisVisible
>, shape="none"]; + + // method references to other classes + +// Class: eu.svjatoslav.inspector.java.structure.ClassGraph + class_eu_svjatoslav_inspector_java_structure_ClassGraph[label=< + + // class descriptor header + + + // fields: + // filter + + // nameToClassMap + + + // methods: + // addClass + + // addObject + + // addProject + + // generateGraph + + // generateGraph + + // hideOrphanedClasses + + // render + +
eu.svjatoslav.inspector.java.structure
ClassGraph
Filterfilter
MapnameToClassMap
ClassDescriptoraddClass
ClassDescriptoraddObject
voidaddProject
voidgenerateGraph
voidgenerateGraph
voidhideOrphanedClasses
voidrender
>, shape="none"]; + + // field references to other classes + class_eu_svjatoslav_inspector_java_structure_ClassGraph:filter -> class_eu_svjatoslav_inspector_java_structure_Filter[label="filter", color="antiquewhite4", style="bold"]; + + // method references to other classes + +// Class: eu.svjatoslav.inspector.java.structure.ClassDescriptor + class_eu_svjatoslav_inspector_java_structure_ClassDescriptor[label=< + + // class descriptor header + + + // fields: + // MAX_REFERECNES_COUNT + + // classGraph + + // distinctiveReferenceColor + + // fullyQualifiedName + + // incomingReferencesCount + + // interfaceColor + + // interfaces + + // isArray + + // isEnum + + // isInterface + + // isShown + + // methods + + // nameToFieldMap + + // superClass + + // superClassColor + + + // methods: + // areReferencesShown + + // enlistFieldReferences + + // enlistFields + + // enlistImplementedInterfaces + + // enlistMethodReferences + + // enlistMethods + + // enlistSuperClass + + // generateDotHeader + + // getAllFields + + // getBackgroundColor + + // getBorderWidth + + // getClassName + + // getColor + + // getDistinctiveColor + + // getDot + + // getEmbeddedDot + + // getGraphId + + // getPackageName + + // getParentClassesName + + // hide + + // hideClassIfNoReferences + + // indexFields + + // isVisible + + // registerReference + + // setDistinctiveColor + +
eu.svjatoslav.inspector.java.structure
ClassDescriptor
intMAX_REFERECNES_COUNT
ClassGraphclassGraph
StringdistinctiveReferenceColor
StringfullyQualifiedName
intincomingReferencesCount
StringinterfaceColor
Listinterfaces
booleanisArray
booleanisEnum
booleanisInterface
booleanisShown
SortedSetmethods
MapnameToFieldMap
ClassDescriptorsuperClass
StringsuperClassColor
booleanareReferencesShown
voidenlistFieldReferences
voidenlistFields
voidenlistImplementedInterfaces
voidenlistMethodReferences
voidenlistMethods
voidenlistSuperClass
voidgenerateDotHeader
ListgetAllFields
StringgetBackgroundColor
StringgetBorderWidth
StringgetClassName
StringgetColor
StringgetDistinctiveColor
StringgetDot
StringgetEmbeddedDot
StringgetGraphId
StringgetPackageName
StringgetParentClassesName
voidhide
booleanhideClassIfNoReferences
voidindexFields
booleanisVisible
voidregisterReference
voidsetDistinctiveColor
>, shape="none"]; + + // field references to other classes + class_eu_svjatoslav_inspector_java_structure_ClassDescriptor:classGraph -> class_eu_svjatoslav_inspector_java_structure_ClassGraph[label="classGraph", color="blueviolet", style="bold"]; + class_eu_svjatoslav_inspector_java_structure_ClassDescriptor:methods -> class_eu_svjatoslav_inspector_java_structure_MethodDescriptor[label="methods", color="brown4", style="bold"]; + class_eu_svjatoslav_inspector_java_structure_ClassDescriptor:nameToFieldMap -> class_eu_svjatoslav_inspector_java_structure_FieldDescriptor[label="nameToFieldMap", color="chartreuse4", style="bold"]; + + // method references to other classes + class_eu_svjatoslav_inspector_java_structure_ClassDescriptor:getAllFields -> class_eu_svjatoslav_inspector_java_structure_FieldDescriptor[label="getAllFields", color="chartreuse4", style="dotted, bold"]; + + // interfaces implemented by class: eu.svjatoslav.inspector.java.structure.ClassDescriptor + class_eu_svjatoslav_inspector_java_structure_GraphElement -> class_eu_svjatoslav_inspector_java_structure_ClassDescriptor[style="dotted, tapered", color="olivedrab2", penwidth=20, dir="forward"]; +} diff --git a/Documentation/JavaInspect.png b/Documentation/JavaInspect.png new file mode 100644 index 0000000..625a2da Binary files /dev/null and b/Documentation/JavaInspect.png differ diff --git a/Documentation/Usage from CLI/index.org b/Documentation/Usage from CLI/index.org new file mode 100644 index 0000000..32764bc --- /dev/null +++ b/Documentation/Usage from CLI/index.org @@ -0,0 +1,107 @@ +:PROPERTIES: +:CUSTOM_ID: usage-from-cli +:END: +#+SETUPFILE: ~/.emacs.d/org-styles/html/darksun.theme +#+TITLE: JavaInspect - usage from commandline +#+LANGUAGE: en +#+LATEX_HEADER: \usepackage[margin=1.0in]{geometry} +#+LATEX_HEADER: \usepackage{parskip} +#+LATEX_HEADER: \usepackage[none]{hyphenat} + +#+OPTIONS: H:20 num:20 +#+OPTIONS: author:nil + +#+HTML_HEAD: + +[[file:../index.html#outline-container-usage][<- Back to index]] + +* Specifying classes to render +:PROPERTIES: +:CUSTOM_ID: specifying-classes-to-render +:END: + +A typical Java application has immense complexity. Beyond code written +by the project's developers, there are typically many frameworks, +libraries, and the Java standard library. + +Since JavaInspect uses reflection, it cannot easily distinguish between +these sources. Usually you want to visualize only the code developed +for your project, excluding frameworks like Spring. If you visualize +all classes reachable from your project, the graph becomes huge and +incomprehensible. + +JavaInspect can analyze compiled Java classes in two modes: +1. Provide JAR files using the *-j* option. +2. Provide filesystem directories as classpath roots using the *-c* option. + +JavaInspect uses the following algorithm to add classes to the graph: + +- All classes found in JAR files are added to the graph by default. +- Classes found in filesystem directories are not added by default + unless explicitly referenced. (TODO: for consistency, these should + also be added by default) +- If a whitelist is specified (*-w* option), classes not matching the + whitelist patterns are removed from the graph. +- If a blacklist is specified (*-b* option), classes matching the + blacklist patterns are removed from the graph. +- Root classes can be specified using the *-r* option. JavaInspect + recursively discovers all classes referenced by root classes and + adds them to the graph. + +* Commandline arguments +:PROPERTIES: +:CUSTOM_ID: available-commandline-arguments +:END: + + +- -j (existing files)... :: 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. + +* Examples +:PROPERTIES: +:CUSTOM_ID: examples +:END: + +Visualize a Java JAR file with all classes, hiding orphaned classes: + +#+begin_src sh + javainspect \ + -j target/aukio-3d-*-SNAPSHOT.jar \ + -d Documentation/graphs/ \ + -n "All classes" \ + -t png -ho +#+end_src + +Visualize a Java JAR file with a whitelist filter, hiding orphaned classes: + +#+begin_src sh + javainspect \ + -j target/aukio-3d-*-SNAPSHOT.jar \ + -d Documentation/graphs/ \ + -n "GUI" \ + -t png \ + -w "eu.svjatoslav.aukio.e3d.gui.*" \ + -ho +#+end_src diff --git a/Documentation/Usage via Java API/index.org b/Documentation/Usage via Java API/index.org new file mode 100644 index 0000000..7e19641 --- /dev/null +++ b/Documentation/Usage via Java API/index.org @@ -0,0 +1,134 @@ +:PROPERTIES: +:CUSTOM_ID: usage-via-java-api +:END: +#+SETUPFILE: ~/.emacs.d/org-styles/html/darksun.theme +#+TITLE: JavaInspect - Usage via Java API +#+LANGUAGE: en +#+LATEX_HEADER: \usepackage[margin=1.0in]{geometry} +#+LATEX_HEADER: \usepackage{parskip} +#+LATEX_HEADER: \usepackage[none]{hyphenat} + +#+OPTIONS: H:20 num:20 +#+OPTIONS: author:nil + +#+HTML_HEAD: + +[[file:../index.html#outline-container-usage][<- Back to index]] + +* Overview +:PROPERTIES: +:CUSTOM_ID: overview +:END: +Classes to be visualized must be available in the classpath. + +To include JavaInspect in the same classpath as your projects, there are +two approaches: + +1. Add JavaInspect as a dependency in your project. + +2. Create a new Java project specifically for visualizing other + projects, and include both JavaInspect and your project's binary + artifacts (JARs) in the classpath. Binary JARs (without source code) + are sufficient since JavaInspect operates via reflection. + +Write simple control/configuration code for each project. I typically +place this code in JUnit test directories since it doesn't need to be +compiled into the final product or artifact. + +The control code generally does the following: +1. Create a graph object. +2. Java reflection/classloaders do not provide a mechanism to discover + all classes under a package. Therefore, manually add at least some + classes to the graph. For each class added, JavaInspect recursively + inspects it and adds all referenced classes. +3. Graphs can easily become very large and complex, so optionally filter + important code using classname [[https://en.wikipedia.org/wiki/Glob_(programming)][glob]] pattern blacklists and/or + whitelists. +4. Optionally tune rendering parameters: + + Remove orphaned classes (classes with no references) from the graph. + + Specify target directory for generated files (default: current directory). + + Keep intermediate GraphViz DOT file for later inspection. +5. Render the graph. + +* Embedding JavaInspect in your Maven project +:PROPERTIES: +:CUSTOM_ID: embedding-javainspect-in-your-maven-project +:END: + +Declare JavaInspect as dependency: +#+BEGIN_SRC xml + + ... + + eu.svjatoslav + javainspect + 1.8 + + ... + +#+END_SRC + + +Add Maven repository to retrieve artifact from: +#+BEGIN_SRC xml + + ... + + svjatoslav.eu + Svjatoslav repository + https://www3.svjatoslav.eu/maven/ + + ... + +#+END_SRC + +* Examples +:PROPERTIES: +:CUSTOM_ID: examples +:END: +** Example 1: Hand-picked objects +:PROPERTIES: +:CUSTOM_ID: example-1-individually-picked-objects +:END: +This example generates a class graph from hand-picked classes, visualizing +JavaInspect itself. + +#+BEGIN_SRC java + +// Create graph +final ClassGraph graph = new ClassGraph(); + +// Add an object to the graph. JavaInspect detects the class from the object. +graph.add(graph); + +// Also add a class directly. +graph.add(Utils.class); + +// Keep the intermediate GraphViz DOT file for reference. +graph.setKeepDotFile(true); + +// Generate an image named "JavaInspect.png" in the current directory +graph.generateGraph("JavaInspect"); + +#+END_SRC + +Compact version: +#+BEGIN_SRC java +new ClassGraph().add(randomObject, RandomClass.class) + .setKeepDotFile(true).generateGraph("JavaInspect"); +#+END_SRC + +Result: +- Generated DOT file: [[file:../JavaInspect.dot][JavaInspect.dot]] +- Generated PNG image: [[file:../JavaInspect.png][JavaInspect.png]] + +** Example 2: Embedded in another project +:PROPERTIES: +:CUSTOM_ID: example-2-graphviz-embedded-in-another-project +:END: + +*Outdated:* this example refers to the old Sixth project (since renamed +Aukio); =DataGraph.java= no longer exists there. Kept for reference. + +1. Download a [[https://www2.svjatoslav.eu/gitweb/?p=sixth.git;a=snapshot;h=HEAD;sf=tgz][Sixth project snapshot]]. +2. Inspect and run *DataGraph.java*. diff --git a/Documentation/example-thumbnail.png b/Documentation/example-thumbnail.png new file mode 100644 index 0000000..04f4195 Binary files /dev/null and b/Documentation/example-thumbnail.png differ diff --git a/Documentation/example.png b/Documentation/example.png new file mode 100644 index 0000000..d773c31 Binary files /dev/null and b/Documentation/example.png differ diff --git a/Documentation/index.org b/Documentation/index.org new file mode 100644 index 0000000..6372754 --- /dev/null +++ b/Documentation/index.org @@ -0,0 +1,105 @@ +#+SETUPFILE: ~/.emacs.d/org-styles/html/darksun.theme +#+TITLE: JavaInspect - Utility to visualize java software +#+LANGUAGE: en +#+LATEX_HEADER: \usepackage[margin=1.0in]{geometry} +#+LATEX_HEADER: \usepackage{parskip} +#+LATEX_HEADER: \usepackage[none]{hyphenat} + +#+OPTIONS: H:20 num:20 +#+OPTIONS: author:nil + +#+HTML_HEAD: + +* Introduction +:PROPERTIES: +:CUSTOM_ID: overview +:END: + +*JavaInspect* simplifies understanding source code by automatically +visualizing program structure. See example graphs: + +- [[https://www3.svjatoslav.eu/projects/aukio-3d/graphs/][Diagrams]] for [[https://www3.svjatoslav.eu/projects/aukio-3d/][Aukio 3D engine project]]. ++ [[file:graphs/][Diagrams for JavaInspect project itself]]. + +*A very simple example:* +[[file:example.png][file:example-thumbnail.png]] + +Graph legend: +file:legend.png + +JavaInspect can be used as a [[file:Usage from CLI/][standalone commandline utility]] or as a +[[file:Usage via Java API/][Java library]]. It uses Java's built-in reflection to discover and +visualize any part of a Java program. + +After discovering application structure and optionally filtering out +unimportant parts, JavaInspect produces a GraphViz DOT file describing +the data to visualize. It then launches [[https://graphviz.org/][GraphViz]] to generate the +graph image in PNG or SVG format. + +** See also +:PROPERTIES: +:CUSTOM_ID: see-also +:END: + +Similar or alternative solutions: ++ http://www.class-visualizer.net/ ++ [[https://github.com/pahen/madge][Madge - similar tool for JavaScript]] + +* Usage +:PROPERTIES: +:CUSTOM_ID: usage +:END: +JavaInspect can be used in two ways: ++ [[file:Usage from CLI/][As a standalone commandline utility]] ++ [[file:Usage via Java API/][As a Java library embedded in your project]] + +* Installation +:PROPERTIES: +:CUSTOM_ID: installation +:END: +[[http://www.graphviz.org/][GraphViz]] must be installed on your system. + +On Ubuntu/Debian, install GraphViz using: +#+BEGIN_SRC sh +sudo apt-get install graphviz +#+END_SRC + +To use JavaInspect via Java API, no further installation is +needed. JavaInspect will be embedded into your project as dependency. +This is described in [[file:Usage via Java API/][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][Getting the source code]]. + +Then study and execute installation script: +#+begin_src sh + cd commandline\ launcher + ./install +#+end_src + +After installation, new commandline tool should be available +: javainspect + +Quick commandline usage help can be viewed by issuing +: javainspect --help + +* Source code +:PROPERTIES: +:CUSTOM_ID: getting-the-source-code +:END: + +*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: [[https://www.svjatoslav.eu/projects/][Other software projects hosted at svjatoslav.eu]] + +*Getting the source code:* +- [[https://www2.svjatoslav.eu/gitweb/?p=javainspect.git;a=snapshot;h=HEAD;sf=tgz][Download latest source code snapshot in TAR GZ format]] +- [[https://www2.svjatoslav.eu/gitweb/?p=javainspect.git;a=summary][Browse Git repository online]] +- You can clone Git repository using git: + : git clone https://www3.svjatoslav.eu/git/javainspect.git diff --git a/Documentation/legend.png b/Documentation/legend.png new file mode 100644 index 0000000..e206b4f Binary files /dev/null and b/Documentation/legend.png differ diff --git a/Documentation/style.css b/Documentation/style.css new file mode 100644 index 0000000..3403e0e --- /dev/null +++ b/Documentation/style.css @@ -0,0 +1,35 @@ +.flex-center { + display: flex; + justify-content: center; +} + +.flex-center video { + width: min(90%, 1000px); + height: auto; +} + +.responsive-img { + width: min(100%, 1000px); + height: auto; +} + +/* === SVG diagram theme === */ +svg > rect:first-child { + fill: #061018; +} + +svg text[fill="#666"], +svg text[fill="#999"] { + fill: #aaa !important; +} + +svg line[stroke="#ccc"] { + stroke: #445566 !important; +} + +svg { + background-color: #061018; + border-radius: 8px; + display: block; + margin: 0 auto; +} \ No newline at end of file diff --git a/Tools/Update web site b/Tools/Update web site index a58ff9c..c92c839 100755 --- a/Tools/Update web site +++ b/Tools/Update web site @@ -26,10 +26,10 @@ export_org_to_html() { } export_org_files_to_html() { - echo "🔍 Searching for .org files in doc/ ..." + echo "🔍 Searching for .org files in Documentation/ ..." echo "=======================================" - mapfile -t ORG_FILES < <(find doc -type f -name "*.org" | sort) + mapfile -t ORG_FILES < <(find Documentation -type f -name "*.org" | sort) if [ ${#ORG_FILES[@]} -eq 0 ]; then echo "❌ No .org files found!" @@ -61,21 +61,21 @@ export_org_files_to_html() { } build_visualization_graphs() { - rm -rf doc/graphs/ - mkdir -p doc/graphs/ + rm -rf Documentation/graphs/ + mkdir -p Documentation/graphs/ # Generate self-visualization of JavaInspect - javainspect -j target/javainspect.jar -d doc/graphs/ -n "All classes" -t png -w "eu.svjatoslav.inspector.java.*" -ho + javainspect -j target/javainspect.jar -d Documentation/graphs/ -n "All classes" -t png -w "eu.svjatoslav.inspector.java.*" -ho - meviz index -w doc/graphs/ -t "JavaInspect classes" + meviz index -w Documentation/graphs/ -t "JavaInspect classes" } # Build project jar file and JavaDocs mvn clean package # Put generated JavaDoc HTML files to documentation directory -rm -rf doc/apidocs/ -cp -r target/apidocs/ doc/ +rm -rf Documentation/apidocs/ +cp -r target/apidocs/ Documentation/ # Publish Emacs org-mode files into HTML format export_org_files_to_html @@ -86,7 +86,7 @@ build_visualization_graphs ## Upload assembled documentation to server echo "📤 Uploading to server..." -rsync -avz --delete -e 'ssh -p 10006' doc/ \ +rsync -avz --delete -e 'ssh -p 10006' Documentation/ \ n0@www3.svjatoslav.eu:/mnt/big/projects/javainspect/ if [ $? -eq 0 ]; then diff --git a/doc/JavaInspect full project.png b/doc/JavaInspect full project.png deleted file mode 100644 index 4d5ebba..0000000 Binary files a/doc/JavaInspect full project.png and /dev/null differ diff --git a/doc/JavaInspect.dot b/doc/JavaInspect.dot deleted file mode 100644 index 660c81c..0000000 --- a/doc/JavaInspect.dot +++ /dev/null @@ -1,316 +0,0 @@ -digraph Java { -graph [rankdir=LR, overlap = false, concentrate=true]; - -// Class: eu.svjatoslav.inspector.java.structure.Filter - class_eu_svjatoslav_inspector_java_structure_Filter[label=< - - // class descriptor header - - - // fields: - // blacklistClassPatterns - - // whitelistClassPatterns - - - // methods: - // blacklistClassPattern - - // isClassShown - - // whitelistClassPattern - -
eu.svjatoslav.inspector.java.structure
Filter
ListblacklistClassPatterns
ListwhitelistClassPatterns
voidblacklistClassPattern
booleanisClassShown
voidwhitelistClassPattern
>, shape="none"]; - - // field references to other classes - - // method references to other classes - -// Class: eu.svjatoslav.inspector.java.structure.FieldDescriptor - class_eu_svjatoslav_inspector_java_structure_FieldDescriptor[label=< - - // class descriptor header - - - // fields: - // name - - // parent - - // type - - // typeArguments - - - // methods: - // getDot - - // getEmbeddedDot - - // getGraphId - - // getOutsideVisibleReferencesCount - - // isVisible - -
eu.svjatoslav.inspector.java.structure
FieldDescriptor
Stringname
ClassDescriptorparent
ClassDescriptortype
ListtypeArguments
StringgetDot
StringgetEmbeddedDot
StringgetGraphId
intgetOutsideVisibleReferencesCount
booleanisVisible
>, shape="none"]; - - // field references to other classes - - // method references to other classes - - // interfaces implemented by class: eu.svjatoslav.inspector.java.structure.FieldDescriptor - class_eu_svjatoslav_inspector_java_structure_GraphElement -> class_eu_svjatoslav_inspector_java_structure_FieldDescriptor[style="dotted, tapered", color="olivedrab2", penwidth=20, dir="forward"]; - -// Class: eu.svjatoslav.inspector.java.structure.MethodDescriptor - class_eu_svjatoslav_inspector_java_structure_MethodDescriptor[label=< - - // class descriptor header - - - // fields: - // name - - // parent - - // returnType - - // typeArguments - - - // methods: - // compareTo - - // compareTo - - // getDot - - // getEmbeddedDot - - // getGraphId - - // getMethodLabel - - // getOutsideVisibleReferencesCount - - // isVisible - -
eu.svjatoslav.inspector.java.structure
MethodDescriptor
Stringname
ClassDescriptorparent
ClassDescriptorreturnType
ListtypeArguments
intcompareTo
intcompareTo
StringgetDot
StringgetEmbeddedDot
StringgetGraphId
StringgetMethodLabel
intgetOutsideVisibleReferencesCount
booleanisVisible
>, shape="none"]; - - // field references to other classes - - // method references to other classes - - // interfaces implemented by class: eu.svjatoslav.inspector.java.structure.MethodDescriptor - class_eu_svjatoslav_inspector_java_structure_GraphElement -> class_eu_svjatoslav_inspector_java_structure_MethodDescriptor[style="dotted, tapered", color="olivedrab2", penwidth=20, dir="forward"]; - -// Class: eu.svjatoslav.inspector.java.structure.Utils - class_eu_svjatoslav_inspector_java_structure_Utils[label=< - - // class descriptor header - - - // fields: - // darkColors - - // enumMethods - - // lastChosenDarkColor - - // lastChosenLightColor - - // lightColors - - // systemDataTypes - - // systemMethods - - // systemPackages - - - // methods: - // getNextDarkColor - - // getNextLightColor - - // initDarkColors - - // initEnumMethods - - // initLightColors - - // initSystemDataTypes - - // initSystemMethods - - // initSystemPackages - - // isEnumMethod - - // isSystemDataType - - // isSystemMethod - - // isSystemPackage - -
eu.svjatoslav.inspector.java.structure
Utils
ListdarkColors
ListenumMethods
intlastChosenDarkColor
intlastChosenLightColor
ListlightColors
ListsystemDataTypes
ListsystemMethods
ListsystemPackages
StringgetNextDarkColor
StringgetNextLightColor
voidinitDarkColors
voidinitEnumMethods
voidinitLightColors
voidinitSystemDataTypes
voidinitSystemMethods
voidinitSystemPackages
booleanisEnumMethod
booleanisSystemDataType
booleanisSystemMethod
booleanisSystemPackage
>, shape="none"]; - - // field references to other classes - - // method references to other classes - -// Class: eu.svjatoslav.inspector.java.structure.GraphElement - class_eu_svjatoslav_inspector_java_structure_GraphElement[label=< - - // class descriptor header - - - // methods: - // getDot - - // getEmbeddedDot - - // getGraphId - - // isVisible - -
eu.svjatoslav.inspector.java.structure
GraphElement
StringgetDot
StringgetEmbeddedDot
StringgetGraphId
booleanisVisible
>, shape="none"]; - - // method references to other classes - -// Class: eu.svjatoslav.inspector.java.structure.ClassGraph - class_eu_svjatoslav_inspector_java_structure_ClassGraph[label=< - - // class descriptor header - - - // fields: - // filter - - // nameToClassMap - - - // methods: - // addClass - - // addObject - - // addProject - - // generateGraph - - // generateGraph - - // hideOrphanedClasses - - // render - -
eu.svjatoslav.inspector.java.structure
ClassGraph
Filterfilter
MapnameToClassMap
ClassDescriptoraddClass
ClassDescriptoraddObject
voidaddProject
voidgenerateGraph
voidgenerateGraph
voidhideOrphanedClasses
voidrender
>, shape="none"]; - - // field references to other classes - class_eu_svjatoslav_inspector_java_structure_ClassGraph:filter -> class_eu_svjatoslav_inspector_java_structure_Filter[label="filter", color="antiquewhite4", style="bold"]; - - // method references to other classes - -// Class: eu.svjatoslav.inspector.java.structure.ClassDescriptor - class_eu_svjatoslav_inspector_java_structure_ClassDescriptor[label=< - - // class descriptor header - - - // fields: - // MAX_REFERECNES_COUNT - - // classGraph - - // distinctiveReferenceColor - - // fullyQualifiedName - - // incomingReferencesCount - - // interfaceColor - - // interfaces - - // isArray - - // isEnum - - // isInterface - - // isShown - - // methods - - // nameToFieldMap - - // superClass - - // superClassColor - - - // methods: - // areReferencesShown - - // enlistFieldReferences - - // enlistFields - - // enlistImplementedInterfaces - - // enlistMethodReferences - - // enlistMethods - - // enlistSuperClass - - // generateDotHeader - - // getAllFields - - // getBackgroundColor - - // getBorderWidth - - // getClassName - - // getColor - - // getDistinctiveColor - - // getDot - - // getEmbeddedDot - - // getGraphId - - // getPackageName - - // getParentClassesName - - // hide - - // hideClassIfNoReferences - - // indexFields - - // isVisible - - // registerReference - - // setDistinctiveColor - -
eu.svjatoslav.inspector.java.structure
ClassDescriptor
intMAX_REFERECNES_COUNT
ClassGraphclassGraph
StringdistinctiveReferenceColor
StringfullyQualifiedName
intincomingReferencesCount
StringinterfaceColor
Listinterfaces
booleanisArray
booleanisEnum
booleanisInterface
booleanisShown
SortedSetmethods
MapnameToFieldMap
ClassDescriptorsuperClass
StringsuperClassColor
booleanareReferencesShown
voidenlistFieldReferences
voidenlistFields
voidenlistImplementedInterfaces
voidenlistMethodReferences
voidenlistMethods
voidenlistSuperClass
voidgenerateDotHeader
ListgetAllFields
StringgetBackgroundColor
StringgetBorderWidth
StringgetClassName
StringgetColor
StringgetDistinctiveColor
StringgetDot
StringgetEmbeddedDot
StringgetGraphId
StringgetPackageName
StringgetParentClassesName
voidhide
booleanhideClassIfNoReferences
voidindexFields
booleanisVisible
voidregisterReference
voidsetDistinctiveColor
>, shape="none"]; - - // field references to other classes - class_eu_svjatoslav_inspector_java_structure_ClassDescriptor:classGraph -> class_eu_svjatoslav_inspector_java_structure_ClassGraph[label="classGraph", color="blueviolet", style="bold"]; - class_eu_svjatoslav_inspector_java_structure_ClassDescriptor:methods -> class_eu_svjatoslav_inspector_java_structure_MethodDescriptor[label="methods", color="brown4", style="bold"]; - class_eu_svjatoslav_inspector_java_structure_ClassDescriptor:nameToFieldMap -> class_eu_svjatoslav_inspector_java_structure_FieldDescriptor[label="nameToFieldMap", color="chartreuse4", style="bold"]; - - // method references to other classes - class_eu_svjatoslav_inspector_java_structure_ClassDescriptor:getAllFields -> class_eu_svjatoslav_inspector_java_structure_FieldDescriptor[label="getAllFields", color="chartreuse4", style="dotted, bold"]; - - // interfaces implemented by class: eu.svjatoslav.inspector.java.structure.ClassDescriptor - class_eu_svjatoslav_inspector_java_structure_GraphElement -> class_eu_svjatoslav_inspector_java_structure_ClassDescriptor[style="dotted, tapered", color="olivedrab2", penwidth=20, dir="forward"]; -} diff --git a/doc/JavaInspect.png b/doc/JavaInspect.png deleted file mode 100644 index 625a2da..0000000 Binary files a/doc/JavaInspect.png and /dev/null differ diff --git a/doc/Usage from CLI/index.org b/doc/Usage from CLI/index.org deleted file mode 100644 index 7311d6a..0000000 --- a/doc/Usage from CLI/index.org +++ /dev/null @@ -1,105 +0,0 @@ -:PROPERTIES: -:CUSTOM_ID: usage-from-cli -:END: -#+SETUPFILE: ~/.emacs.d/org-styles/html/darksun.theme -#+TITLE: JavaInspect - usage from commandline -#+LANGUAGE: en -#+LATEX_HEADER: \usepackage[margin=1.0in]{geometry} -#+LATEX_HEADER: \usepackage{parskip} -#+LATEX_HEADER: \usepackage[none]{hyphenat} - -#+OPTIONS: H:20 num:20 -#+OPTIONS: author:nil - -[[file:../index.org][Back to main documentation]] - -* Commandline arguments -:PROPERTIES: -:CUSTOM_ID: available-commandline-arguments -:END: - - -- -j (existing files)... :: 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. - -* Specifying classes to render -:PROPERTIES: -:CUSTOM_ID: specifying-classes-to-render -:END: - -A typical Java application has immense complexity. Beyond code written -by the project's developers, there are typically many frameworks, -libraries, and the Java standard library. - -Since JavaInspect uses reflection, it cannot easily distinguish between -these sources. Usually you want to visualize only the code developed -for your project, excluding frameworks like Spring. If you visualize -all classes reachable from your project, the graph becomes huge and -incomprehensible. - -JavaInspect can analyze compiled Java classes in two modes: -1. Provide JAR files using the *-j* option. -2. Provide filesystem directories as classpath roots using the *-c* option. - -JavaInspect uses the following algorithm to add classes to the graph: - -- All classes found in JAR files are added to the graph by default. -- Classes found in filesystem directories are not added by default - unless explicitly referenced. (TODO: for consistency, these should - also be added by default) -- If a whitelist is specified (*-w* option), classes not matching the - whitelist patterns are removed from the graph. -- If a blacklist is specified (*-b* option), classes matching the - blacklist patterns are removed from the graph. -- Root classes can be specified using the *-r* option. JavaInspect - recursively discovers all classes referenced by root classes and - adds them to the graph. - -* Examples -:PROPERTIES: -:CUSTOM_ID: examples -:END: - -Visualize a Java JAR file with all classes, hiding orphaned classes: - -#+begin_src sh - javainspect \ - -j target/sixth-3d-*-SNAPSHOT.jar \ - -d doc/graphs/ \ - -n "All classes" \ - -t png -ho -#+end_src - -Visualize a Java JAR file with a whitelist filter, hiding orphaned classes: - -#+begin_src sh - javainspect \ - -j target/sixth-3d-*-SNAPSHOT.jar \ - -d doc/graphs/ \ - -n "GUI" \ - -t png \ - -w "eu.svjatoslav.sixth.e3d.gui.*" \ - -ho -#+end_src diff --git a/doc/Usage via Java API/index.org b/doc/Usage via Java API/index.org deleted file mode 100644 index a44747b..0000000 --- a/doc/Usage via Java API/index.org +++ /dev/null @@ -1,126 +0,0 @@ -:PROPERTIES: -:CUSTOM_ID: usage-via-java-api -:END: -#+SETUPFILE: ~/.emacs.d/org-styles/html/darksun.theme -#+TITLE: JavaInspect - Usage via Java API -#+LANGUAGE: en -#+LATEX_HEADER: \usepackage[margin=1.0in]{geometry} -#+LATEX_HEADER: \usepackage{parskip} -#+LATEX_HEADER: \usepackage[none]{hyphenat} - -#+OPTIONS: H:20 num:20 -#+OPTIONS: author:nil - -[[file:../index.org][Back to main documentation]] - -* Overview -:PROPERTIES: -:CUSTOM_ID: overview -:END: -Classes to be visualized must be available in the classpath. - -To include JavaInspect in the same classpath as your projects, there are -two approaches: - -1. Add JavaInspect as a dependency in your project. - -2. Create a new Java project specifically for visualizing other - projects, and include both JavaInspect and your project's binary - artifacts (JARs) in the classpath. Binary JARs (without source code) - are sufficient since JavaInspect operates via reflection. - -Write simple control/configuration code for each project. I typically -place this code in JUnit test directories since it doesn't need to be -compiled into the final product or artifact. - -The control code generally does the following: -1. Create a graph object. -2. Java reflection/classloaders do not provide a mechanism to discover - all classes under a package. Therefore, manually add at least some - classes to the graph. For each class added, JavaInspect recursively - inspects it and adds all referenced classes. -3. Graphs can easily become very large and complex, so optionally filter - important code using classname [[https://en.wikipedia.org/wiki/Glob_(programming)][glob]] pattern blacklists and/or - whitelists. -4. Optionally tune rendering parameters: - + Remove orphaned classes (classes with no references) from the graph. - + Specify target directory for generated files (default: current directory). - + Keep intermediate GraphViz DOT file for later inspection. -5. Render the graph. - -* Examples -** Example 1: Hand-picked objects -:PROPERTIES: -:CUSTOM_ID: example-1-individually-picked-objects -:END: -This example generates a class graph from hand-picked classes, visualizing -JavaInspect itself. - -#+BEGIN_SRC java - -// Create graph -final ClassGraph graph = new ClassGraph(); - -// Add an object to the graph. JavaInspect detects the class from the object. -graph.add(graph); - -// Also add a class directly. -graph.add(Utils.class); - -// Keep the intermediate GraphViz DOT file for reference. -graph.setKeepDotFile(true); - -// Generate an image named "JavaInspect.png" in the current directory -graph.generateGraph("JavaInspect"); - -#+END_SRC - -Compact version: -#+BEGIN_SRC java -new ClassGraph().add(randomObject, RandomClass.class) - .setKeepDotFile(true).generateGraph("JavaInspect"); -#+END_SRC - -Result: -- Generated DOT file: [[file:../JavaInspect.dot][JavaInspect.dot]] -- Generated PNG image: [[file:../JavaInspect.png][JavaInspect.png]] - -** Example 2: Embedded in another project -:PROPERTIES: -:CUSTOM_ID: example-2-graphviz-embedded-in-another-project -:END: - -1. Download a [[https://www2.svjatoslav.eu/gitweb/?p=sixth.git;a=snapshot;h=HEAD;sf=tgz][Sixth project snapshot]]. -2. Inspect and run *DataGraph.java*. - -* Embedding JavaInspect in your Maven project -:PROPERTIES: -:CUSTOM_ID: embedding-javainspect-in-your-maven-project -:END: - -Declare JavaInspect as dependency: -#+BEGIN_SRC xml - - ... - - eu.svjatoslav - javainspect - 1.8 - - ... - -#+END_SRC - - -Add Maven repository to retrieve artifact from: -#+BEGIN_SRC xml - - ... - - svjatoslav.eu - Svjatoslav repository - https://www3.svjatoslav.eu/maven/ - - ... - -#+END_SRC diff --git a/doc/example-thumbnail.png b/doc/example-thumbnail.png deleted file mode 100644 index 04f4195..0000000 Binary files a/doc/example-thumbnail.png and /dev/null differ diff --git a/doc/example.png b/doc/example.png deleted file mode 100644 index d773c31..0000000 Binary files a/doc/example.png and /dev/null differ diff --git a/doc/index.org b/doc/index.org deleted file mode 100644 index 020b2b9..0000000 --- a/doc/index.org +++ /dev/null @@ -1,105 +0,0 @@ -#+SETUPFILE: ~/.emacs.d/org-styles/html/darksun.theme -#+TITLE: JavaInspect - Utility to visualize java software -#+LANGUAGE: en -#+LATEX_HEADER: \usepackage[margin=1.0in]{geometry} -#+LATEX_HEADER: \usepackage{parskip} -#+LATEX_HEADER: \usepackage[none]{hyphenat} - -#+OPTIONS: H:20 num:20 -#+OPTIONS: author:nil - -* Introduction -:PROPERTIES: -:CUSTOM_ID: overview -:END: - -*JavaInspect* simplifies understanding source code by automatically -visualizing program structure. See example graphs: - -- [[https://www3.svjatoslav.eu/projects/sixth-3d/graphs/][Diagrams]] for [[https://www3.svjatoslav.eu/projects/sixth-3d/][Sixth 3D engine project]]. -+ [[file:graphs/][Diagrams for JavaInspect project itself]]. - -*A very simple example:* -[[file:example.png][file:example-thumbnail.png]] - -Graph legend: -file:legend.png - -JavaInspect can be used as a [[file:Usage from CLI/][standalone commandline utility]] or as a -[[file:Usage via Java API/][Java library]]. It uses Java's built-in reflection to discover and -visualize any part of a Java program. - -See [[#usage][usage]] to learn how to use JavaInspect. - -After discovering application structure and optionally filtering out -unimportant parts, JavaInspect produces a GraphViz DOT file describing -the data to visualize. It then launches [[https://graphviz.org/][GraphViz]] to generate the -graph image in PNG or SVG format. - -** See also -:PROPERTIES: -:CUSTOM_ID: see-also -:END: - -Similar or alternative solutions: -+ http://www.class-visualizer.net/ -+ [[https://github.com/pahen/madge][Madge - similar tool for JavaScript]] - -* Installation -:PROPERTIES: -:CUSTOM_ID: installation -:END: -[[http://www.graphviz.org/][GraphViz]] must be installed on your system. - -On Ubuntu/Debian, install GraphViz using: -#+BEGIN_SRC sh -sudo apt-get install graphviz -#+END_SRC - -To use JavaInspect via Java API, no further installation is -needed. JavaInspect will be embedded into your project as dependency. -This is described in [[file:Usage via Java API/][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][Getting the source code]]. - -Then study and execute installation script: -#+begin_src sh - cd commandline\ launcher - ./install -#+end_src - -After installation, new commandline tool should be available -: javainspect - -Quick commandline usage help can be viewed by issuing -: javainspect --help - -* Usage -:PROPERTIES: -:CUSTOM_ID: usage -:END: -JavaInspect can be used in two ways: -+ [[file:Usage from CLI/][As a standalone commandline utility]] -+ [[file:Usage via Java API/][As a Java library embedded in your project]] - -* Source code -:PROPERTIES: -:CUSTOM_ID: getting-the-source-code -:END: - -*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: [[https://www.svjatoslav.eu/projects/][Other software projects hosted at svjatoslav.eu]] - -*Getting the source code:* -- [[https://www2.svjatoslav.eu/gitweb/?p=javainspect.git;a=snapshot;h=HEAD;sf=tgz][Download latest source code snapshot in TAR GZ format]] -- [[https://www2.svjatoslav.eu/gitweb/?p=javainspect.git;a=summary][Browse Git repository online]] -- You can clone Git repository using git: - : git clone https://www3.svjatoslav.eu/git/javainspect.git diff --git a/doc/legend.png b/doc/legend.png deleted file mode 100644 index e206b4f..0000000 Binary files a/doc/legend.png and /dev/null differ diff --git a/pom.xml b/pom.xml index e27daad..f253391 100644 --- a/pom.xml +++ b/pom.xml @@ -8,9 +8,9 @@ Utility to visualize Java code - 1.8 - 1.8 - 1.8 + 21 + 21 + 21 UTF-8 UTF-8 @@ -28,8 +28,8 @@ maven-compiler-plugin 3.8.1 - 1.8 - 1.8 + 21 + 21 true UTF-8 @@ -120,7 +120,7 @@ eu.svjatoslav svjatoslavcommons - 1.9 + 2.0.0 eu.svjatoslav