Abhängigkeiten verbannen mit maven-enforcer-plugin

Wenn mehrere Entwickler an einem maven-(multimodul-)Projekt arbeiten, ist es ja normal, dass neue Bibliotheken (mit oder ohne Absprache) über maven angebunden werden. Falls aber bestimmte Bibliotheken unerwünscht sind, ist es möglich solche Abhängigkeiten in einer Art “Schwarzen Liste” festzuhalten. Beim Bauen der Anwendung prüft maven, ob die Abhängigkeit verwendet werden darf. Falls nicht, wird der Compile-Vorgang mit einer Fehlermeldung abgebrochen.

Abhängigkeit verbannen

Nehmen wir mal als Beispiel die Bibliothek Lombok. Um Lombok unternehmensweit zu verbannen, muss in jeder pom.xml maven-enforcer-plugin wie folgt konfiguriert werden:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>1.4.1</version>
<executions>
<execution>
<id>enforce-banned-dependencies</id>
<goals>
<goal>enforce</goal>
</goals>
<configuration>
<rules>
<bannedDependencies>
<!-- hier koennen mehrere angegeben werden -->
<excludes>
<exclude>org.projectlombok:lombok</exclude>
</excludes>
</bannedDependencies>
</rules>
<fail>true</fail>
</configuration>
</execution>
</executions>
</plugin>

Nur bestimmte Version zulassen

Es ist außerdem möglich das Plugin so zu konfigurieren, dass nur eine bestimmte Version einer Bibliothek zugelassen wird. Nehmen wir an, es soll nur die Version 2.4.1 des Jackson-Mappers verwendet werden. Es ändert sich dabei im Vergleich zum obigen Beispiel nur der configuration-Knoten:

[...]
<configuration>
<rules>
<bannedDependencies>
<excludes>
<exclude>com.fasterxml.jackson.core:jackson-core</exclude>
</excludes>
<includes>
<include>com.fasterxml.jackson.core:jackson-core:[2.4.1]</include>
</includes>
</bannedDependencies>
</rules>
<fail>true</fail>
</configuration>
[...]

Hierbei wird nur exakt die definierte Version 2.4.1 zugelassen. Man könnte auch ein Intervall angeben, sodass man insgesamt folgende Möglichkeiten hat:

  • [2.4.1] - exakt diese Version
  • (2.4.1] - diese sowie ältere Versionen
  • [2.4.1,) - nicht älter als 2.4.1 - (!) Komma ist wichtig.

Falls beispielsweise die letzte Regel [2.4.1,) definiert ist, und man trotzdem eine ältere Version verwendet, kommt es zu folgendem Fehler, wenn man mvn clean install ausführt:

[...]
[INFO] --- maven-enforcer-plugin:1.4.1:enforce (enforce-banned-dependencies) @ jawb-tools-util ---
[WARNING] Rule 0: org.apache.maven.plugins.enforcer.BannedDependencies failed with message:
Found Banned Dependency: com.fasterxml.jackson.core:jackson-core:2.4.0
Use \'mvn dependency:tree\' to locate the source of the banned dependencies.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] ...

P.S. Weitere Prüfregeln sind möglich

Nun ja, das Plugin kann deutlich mehr. Es können beispielsweise folgende Regeln definiert werden:

Die ganze Liste mit Standardregeln findet man auf der Maven-Projekt-Seite