Classycle is a very nice analyzer and dependency checker for class and package dependencies.
It lets you define package groups (components, layers) and express unwanted dependencies such as cycles, or dependencies between particular packages. For example you can specify that you want no package cycles and no dependencies from com.foo.domain.* on com.foo.api.*. All using a very human-friendly, concise format.
Then you kick off the analyzer (it comes with an Ant task and a standalone command line tool) and it produces a report with violations.
There is a number of other tools out there: JDepend, Sonar, JArchitect and so on. So why Classycle?
- It’s free (BSD license).
- It’s fast.
- It’s powerful and expressive. The rules take just a few lines of easily readable text.
- It integrates with build tools very well. We have it running as part of the build script, for every build. It’s really just another automated test. Thanks to that the project structure is probably the cleanest one I’ve worked with so far.
Gradle Plugin
Thanks to having an Ant task Classycle is very easy to integrate with Gradle, with one caveat: The official build is not in Maven Central, and the only build that is there does not include the Ant task.
Gradle itself uses Classycle via a script plugin, buried somewhere in project structure. They published Classycle on their own repository, but it’s the older version that doesn’t support Java 8.
Inspired by that, we wrote our own plugin and made it available for everyone with minimum effort. It’s available on Gradle Plugin Portal and on GitHub.
In order to use it, all you need is:
- Add the plugin to your project:
plugins { id "pl.squirrel.classycle" version "1.1" }
-
Create Classycle definition file for each source set you want to have covered in src/test/resources/classycle-${sourceSet.name}.txt:
show allResults {package} = com.example check absenceOfPackageCycles > 1 in ${package}.*
- Congratulations, that’s all it takes to integrate Classycle with your Gradle build! Now you have the following tasks:
# For each source set that has the dependency definition file: classycleMain, classycleTest, ... # Analyze all source steps in one hit: classycle # Also part of the check task: check
See Plugin Portal and GitHub for more information. Happy validating!