With Degraph you control and visualize class and package dependencies in your JVM application.
The JUnit5 team uses Degraph to ensure JUnit5 does not get any package cycles
You can analyse class files and jars using Degraph and get a graphml file as result. This can be rendered using yed.
What makes Degraph different from other tools is that it supports nested graphs. Inner classes are visualy contained in their containing class; Classes are contained inside packages and if you want you can group packages to modules, layers and so on. These ways of grouping classes are referred to slices in Degraph.
If you do a hierarchic layout in yed of the resulting graphml file you can easily see which classes you can move to different packages, layer or modules without creating circular dependencies or which you have to move in order to break cycles.
Ever wanted to establish a rule in a project like “stuff from the presentation layer must not access stuff from the persistence layer!”? Now you can. Based on a simple DSL you can write tests that check rules like this and fail with a list of the violations found.
Since these are normal tests based on mainstream test frameworks they are easily integrated into Continuous Integration builds.