This Maven Enforcer Rule checks your project for package cycles. It fails the build if any package cycle is found, showing you the packages and classes involved in the cycle.
Add the following plugin to your POM:
<plugin>
<artifactId>maven-enforcer-plugin</artifactId>
<version>3.0.0-M2</version>
<dependencies>
<dependency>
<groupId>de.andrena.tools.nopackagecycles</groupId>
<artifactId>no-package-cycles-enforcer-rule</artifactId>
<version>1.0.9</version>
</dependency>
</dependencies>
<executions>
<execution>
<id>enforce-no-package-cycles</id>
<goals>
<goal>enforce</goal>
</goals>
<phase>test</phase>
<configuration>
<rules>
<NoPackageCyclesRule implementation="de.andrena.tools.nopackagecycles.NoPackageCyclesRule" />
</rules>
</configuration>
</execution>
</executions>
</plugin>
If you want to exclude tests from cycle checking, you can use the parameter includeTests
which is set to true by default:
...
<rules>
<NoPackageCyclesRule implementation="de.andrena.tools.nopackagecycles.NoPackageCyclesRule">
<includeTests>false</includeTests>
</NoPackageCyclesRule>
</rules>
...
If you want to exclude packages or restrict check to certain packages only, you can use includedPackages
or excludedPackages
(although you really should not!):
...
<rules>
<NoPackageCyclesRule implementation="de.andrena.tools.nopackagecycles.NoPackageCyclesRule">
<includedPackages>
<includedPackage>myapp.code.good</includedPackage>
</includedPackages>
</NoPackageCyclesRule>
</rules>
...
...
<rules>
<NoPackageCyclesRule implementation="de.andrena.tools.nopackagecycles.NoPackageCyclesRule">
<excludedPackages>
<excludedPackage>myapp.code.bad</excludedPackage>
</excludedPackages>
</NoPackageCyclesRule>
</rules>
...
- The original version by Daniel Seidewitz on Stackoverflow. Improved by showing all packages afflicted with cycles and the corresponding classes importing the conflicting packages.
- JDepend, the library being used to detect package cycles.
- For more information about package cycles, see "The Acyclic Dependencies Principle" by Robert C. Martin (Page 6).
- The Maven Enforcer Plugin