Dependency plugin Maven
Cet article présente l'utilisation du plugin maven-dependency-plugin
permettant d'analyser les dépendances déclarées sur un projet.
Les exemples décrits sont disponibles sous ce lien : http://www.svn.jouvinio.net/study/trunk/maven/maven-dependency-plugin
Sommaire
Votre avis
Nobody voted on this yet
|
|
Etude
Il est facile de se laisser déborder dans les dépendances déclarées dans les projets. Le plugin maven-dependency-plugin
offre quelques commandes pour analyer ces dépendances.
Dans le projet exemple, les dépendances sont déclarées dans la section dependencyManagement
, en sorte de prendre en compte les exemples d'exécution.
Le plugin est ajouté dans la section build
du fichier pom.xml
avec la déclaration suivante.
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.0.2</version>
</plugin>
</plugins>
</build>
Listing
Commande
La commande dependency:list
va permettre de lister l'ensemble des dépendances directes ou indirectes.
#mvn dependency:list . . . [INFO] --- maven-dependency-plugin:3.0.2:list (default-cli) @ maven-assembly-plugin --- [INFO] [INFO] The following files have been resolved: [INFO] org.apache.commons:commons-lang3:jar:3.7:compile [INFO] org.apache.commons:commons-collections4:jar:4.1:compile [INFO] org.apache.commons:commons-email:jar:1.3.2:compile [INFO] javax.mail:mail:jar:1.4.5:compile [INFO] javax.activation:activation:jar:1.1.1:compile [INFO] org.slf4j:slf4j-api:jar:1.7.25:compile [INFO] org.slf4j:slf4j-simple:jar:1.7.25:provided . . .
Une alternative à cette commande va permettre d'effectuer un listing mais avec une représentation arborescente, rendant l'analyse des dépendances indirectes beaucoup plus facile.
#mvn dependency:tree . . . [INFO] --- maven-dependency-plugin:3.0.2:tree (default-cli) @ maven-assembly-plugin --- [INFO] fr.ejn.tutorial.maven:maven-assembly-plugin:jar:0.0.1-SNAPSHOT [INFO] +- org.apache.commons:commons-lang3:jar:3.7:compile [INFO] +- org.apache.commons:commons-collections4:jar:4.1:compile [INFO] +- org.apache.commons:commons-email:jar:1.3.2:compile [INFO] | +- javax.mail:mail:jar:1.4.5:compile [INFO] | \- javax.activation:activation:jar:1.1.1:compile [INFO] +- org.slf4j:slf4j-api:jar:1.7.25:compile [INFO] \- org.slf4j:slf4j-simple:jar:1.7.25:provided . . .
Cette représentation est très utile afin d'identifier la provenance d'une dépendance indirecte.
Sortie fichier
Les commandes de listing possèdes des options permettant de rediriger la sortie vers un fichier.
-
outputFile
pour indiquer l'emplacement du fichier de sortie; -
outputType
pour indiquer le type de format,text
/dot
/graphml
/tgf
; -
appendOutput
pour écraser (par défaut) ou ajouter au fichier existant.
L'exemple suivant permet de générer un fichier graphml
dans le fichier c:/temp/analyze_graph.graphml
.
#mvn dependency:tree -DoutputFile=c:/temp/analyze_graph.graphml -DoutputType=graphml
Analyse
Commande
Pour rappel, la déclarations des dépendances est la suivante.
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.7</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.1</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-email</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.25</version>
<scope>provided</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-email</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
</dependency>
</dependencies>
Au fil de la réalisation d'un projet, les dépendances utilisées peuvent devenir inutiles. La commande dependency:analyze
permet d'effectuer une analyse de celles-ci afin d'identifier celles qui ne sont pas exploitées, et donc elligible à la suppression dans le fichier pom.xml
, ou celles utilisées mais non déclarées, ce qui se produit quand une dépendance indirecte est exploitée.
#mvn dependency:analyze . . . [INFO] --- maven-dependency-plugin:3.0.2:analyze (default-cli) @ maven-assembly-plugin --- [WARNING] Used undeclared dependencies found: [WARNING] javax.mail:mail:jar:1.4.5:compile [WARNING] Unused declared dependencies found: [WARNING] org.apache.commons:commons-collections4:jar:4.1:compile [WARNING] org.apache.commons:commons-email:jar:1.3.2:compile [WARNING] org.slf4j:slf4j-simple:jar:1.7.25:provided . . .
A noter le niveau des messages est WARNING
.
Dans le cadre de ce projet, la libraire javax.mail:mail
est utilisée, dans la classe Tutorial
à travers l'import de com.sun.mail.util.PropUtil
. N'étant pas déclarée explicitement dans le fichier fichier pom.xml
, mais est une dépendance de org.apache.commons:commons-email
, elle est indiquée dans la section Used undeclared dependencies found
.
La seconde section, Unused declared dependencies found
, indique les dépendances déclarées mais non utilisées explicitement dans le code. Dans le cadre de cette exemple, les trois librairies suivantes sont mentionnées.
- org.apache.commons:commons-collections4
- org.apache.commons:commons-email
- org.slf4j:slf4j-simple
Attention, cette analyse retourne les librairies qui ne sont pas explicitement utilisées dans la code Java. Or, il se peut que les librairies sont quand même nécessaires. La librairie slf4j-simple
en est un exemple dans ce cas. C'est l'implémentation utilisée de SLF4J mais n'est pas directement référencées dans le code, ce qui est le principe de ce framework.
Il faut donc être prudent avant de supprimer les dépendances mentionnées qui non utilisées.
Rapport analyse
Dans le précédent paragraphe, le rapport et généré dans la sortie de la ligne de commande. Or il est possible de générer le rapport au format HTML
à l'aide de la commande dependency:analyze-report
.
#mvn dependency:analyze-report . . . [INFO] --- maven-dependency-plugin:3.0.2:analyze-report (default-cli) @ maven-assembly-plugin --- [INFO] C:\workspaces\studyMaven\maven-dependency-plugin\target . . .
Un fichier dependency-analysis.html
est généré dans le répertoire target
du projet, donnant une représentation un peu plus lisible des dépendances.
Génération déclarations
Sur l'exemple présédent, il est montré comment identiier les dépendances manquantes. Dans le cadre de projet, il est facile de compléter le fichier pom.xml
car une seule dépendance est manqaunte. Cependant, la commande dependency:analyze
offre l'argument outputXML
pour générer la déclaration XML de celle-ci, qui suffit de copier dans le fichier.
#mvn dependency:analyze -DoutputXML=true . . . [INFO] --- maven-dependency-plugin:3.0.2:analyze (default-cli) @ maven-assembly-plugin --- [WARNING] Used undeclared dependencies found: [WARNING] javax.mail:mail:jar:1.4.5:compile [WARNING] Unused declared dependencies found: [WARNING] org.apache.commons:commons-collections4:jar:4.1:compile [WARNING] org.apache.commons:commons-email:jar:1.3.2:compile [WARNING] org.slf4j:slf4j-simple:jar:1.7.25:provided [INFO] Add the following to your pom to correct the missing dependencies: [INFO] <dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4.5</version> </dependency> . . .
Dans le cadre de gros projet, ceci peut être très utile.
Recherche dépendances
Parfois, il est nécessaire de retrouver l'origine d'une librairie, afin d'identifier quelle dépendance entraîne son importation. Les editeurs de code proposent une visualisation arborescente, mais il existe l'argument includes
de la commande dependency:tree
qui va permettre cette recherche. Dans le cas de cet exemple, la librairie javax.activation:activation
est recherchée.
#mvn dependency:tree -Dincludes=javax.activation:activation . . . [INFO] --- maven-dependency-plugin:3.0.2:tree (default-cli) @ maven-assembly-plugin --- [INFO] fr.ejn.tutorial.maven:maven-assembly-plugin:jar:0.0.1-SNAPSHOT [INFO] \- org.apache.commons:commons-email:jar:1.3.2:compile [INFO] \- javax.activation:activation:jar:1.1.1:compile . . .
Sur le résultat produit, il est donc indiqué que la librairie est importé avec la dépendance de commons-email
. A noter que ce n'est pas une dépendance directe.
Voir aussi
Documentation officielle: http://maven.apache.org/plugins/maven-dependency-plugin/
Toutes les commandes: http://maven.apache.org/plugins/maven-dependency-plugin/usage.html