Dependency plugin Maven

De EjnTricks
Révision de 26 juin 2018 à 12:52 par Etienne (discussion | contributions)

(diff) ← Version précédente | Voir la version courante (diff) | Version suivante → (diff)

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


Hand-icon.png Votre avis

Nobody voted on this yet

 You need to enable JavaScript to vote


Study icon.png 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>


Multiples-icon.png Listing

Command-icon.png 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.

Icon Personnalisation.png 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


File-find-icon.png Analyse

Command-icon.png 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.

Mimetypes-html-icon.png 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.


XML format icon.png 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.


Folder inspection icon.png 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.


Viewer icon.png 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