Les plugins
Sur cette page
En plus de tous les plugins chargés par défaut, il est possible de personnaliser leur configuration et d’en ajouter d’autres
Déclaration d’un plugin
Exemple : le plugin de compilation
par défaut dans le “super pom” :
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<executions>
<execution>
<id>default-compile</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>default-testCompile</id>
<phase>test-compile</phase>
<goals>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>On le configure de façon “cachée” via la propriété <maven.compiler.release>17</maven.compiler.release> mais on peut également à la place surcharger la déclaration du plugin via :
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<release>17<release>
</configuration>
</plugin>
</plugins>
</build>Ce qui donnera dans le pom effectif
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<release>17</release>
</configuration>
<executions>
<execution>
<id>compile</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
...
</executions>
</plugin>
</plugins>
</build>Utilisation d’un plugin
- Directement par le goal voulu
mvn compile:compile
- En le liant à une des phase du cycle de vie par execution
<executions>
<execution>
<id>compile</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
...
</executions>RAPPEL des mappings par défaut : http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html#Built-in_Lifecycle_Bindings
Quelques plugins à ajouter dans son projet
Avoir un code bien formatté
Spotless plugin : formatter son code
https://github.com/diffplug/spotless
exemple de déclaration :
<plugin>
<groupId>com.diffplug.spotless</groupId>
<artifactId>spotless-maven-plugin</artifactId>
<version>${spotless.version}</version>
<configuration>
<formats>
<format>
<indent>
<spaces>true</spaces>
<spacesPerTab>4</spacesPerTab>
</indent>
</format>
</formats>
<java>
<googleJavaFormat>
<version>1.8</version>
<style>AOSP</style>
<reflowLongStrings>true</reflowLongStrings>
</googleJavaFormat>
</java>
</configuration>
<executions>
<execution>
<goals>
<goal>check</goal>
</goals>
<phase>validate</phase>
</execution>
</executions>
</plugin>ou d’exécution ponctuelle :
mvn spotless:applyTester et mesurer sa converture de test
Maven surefire plugin est intégré et exécuté d’office, il lance les tests unitaires selon une norme définie par le plugin (et personnalisable si besoin)
https://maven.apache.org/surefire/maven-surefire-plugin/usage.html
Maven failsafe plugin est à ajouter pour éxécuter des test d’intégration au sens Maven, c’est à dire des tests nécessitant un packaging de l’application.
Le plugin est très similaire au plugin surefire, les changements essentiels sont le nommage des classes par défaut et la position par défaut dans le cycke de vie.
https://maven.apache.org/surefire/maven-failsafe-plugin/usage.html
Remarque : sans que ce soit nécéessairement une mauvaise pratique, il est parfois utile de sauter l’éxécution des tests (tests longs, découpage du pipeline en taches élémentaires, …)
Les plugins surfire et failsafe prévoient de sauter simplement les phases de tests.
mvn package -DskipTestsJaCoCo va rajouter un agent java lors de l’éxécution des tests pour mesurer la couverture de test
https://www.eclemma.org/jacoco/trunk/doc/maven.html
Déployer vers les outils de qualimétrie
Sonar
https://docs.sonarqube.org/latest/analysis/scan/sonarscanner-for-maven/
Création avancée de livrable
Maven Assembly plugin : Définir un artifact personnalisé
http://maven.apache.org/plugins/maven-assembly-plugin/
Description xml du livrable, par exemple obtenir un zip contenant le jar + tous les jar de dépendances :
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.1.0 http://maven.apache.org/xsd/assembly-2.1.0.xsd">
<id>zip</id>
<formats>
<format>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<fileSet>
<directory>target</directory>
<outputDirectory />
<includes>
<include>*.jar</include>
</includes>
</fileSet>
</fileSets>
<dependencySets>
<dependencySet>
<outputDirectory>/lib</outputDirectory>
</dependencySet>
</dependencySets>
</assembly>A configurer à la phase package :
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<descriptors>
<descriptor>src/assembly/zip.xml</descriptor>
</descriptors>
<appendAssemblyId>false</appendAssemblyId>
<finalName>mon-batch-${project.version}</finalName>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>Exécutions avancées pour tests d’intégration
Maven Exec plugin Excution d’executable (par exemple avant un test d’intégration)
https://www.mojohaus.org/exec-maven-plugin/
Cargo plugin Lancer un tomcat avec votre war (par exemple avant un test d’intégration)
https://codehaus-cargo.github.io/cargo/Home.html
Sécurité des dépendances
Dependency check Controler les CVE des librairies
https://jeremylong.github.io/DependencyCheck/dependency-check-maven/
–
Exemple de déclaration :
<project>
...
<build>
...
<plugins>
...
<plugin>
<groupId>org.owasp</groupId>
<artifactId>dependency-check-maven</artifactId>
<version>6.1.5</version>
<executions>
<execution>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>
...
</plugins>
...
</build>
...
</project>Ca marche parce que par défaut le goal “check” de dependency check s’éxécute à la phase “verify”
Divers
Maven Versions plugin : c’est celui qu’on a utilisé pour changer toutes les versions d’un projet multimodule d’un coup