Maven Dependency Tree

De ChuWiki


Qué es Maven Dependency Plugin[editar]

Apache maven dependency plugin es un plugin de maven que nos ayuda a revisar las dependencias de nuestro proyecto maven. Entre otras muchas, las utilidades principales de este plugin son

  • dependency:tree. Muestra un árbol con todas las dependencias de nuestro proyecto
  • dependency:analyze. Revisa las dependencias de nuestro proyecto y nos indica cuales se usan, cuales sobran, etc.
  • dependency:copy-dependencies. Copia todas las dependencias de nuestro proyecto en un directorio.
  • dependency:go-offline. Copia todo lo que necesite nuestro proyecto en local para que podamos trabajar offline.
  • dependency:purge-local-repository. Borra las dependencias del repositorio local.

Tienes un listado completo de comandos en la página oficial de Apache

maven-dependency-plugin viene por defecto con Maven, por lo que no tenemos que configuarlo de ninguna manera. Basta con usarlo cuando lo necesitemos.

Veamos con detalle algunos de los comandos comentados.

Maven dependency tree[editar]

Muestra un listado en forma de árbol de todas las dependencias de nuestro proyecto Maven. El siguiente es un ejemplo

C:\MiProyectoMaven> mvn dependency:tree
...
[INFO] com.chuidiang.examples:java-se-examples:jar:0.0.1-SNAPSHOT
[INFO] +- commons-codec:commons-codec:jar:1.10:compile
[INFO] +- net.sourceforge.htmlunit:htmlunit:jar:2.20:compile
[INFO] |  +- xalan:xalan:jar:2.7.2:compile
[INFO] |  |  \- xalan:serializer:jar:2.7.2:compile
[INFO] |  +- org.apache.commons:commons-lang3:jar:3.4:compile
[INFO] |  +- org.apache.httpcomponents:httpclient:jar:4.5.2:compile
[INFO] |  |  \- org.apache.httpcomponents:httpcore:jar:4.4.4:compile
[INFO] |  +- org.apache.httpcomponents:httpmime:jar:4.5.2:compile
[INFO] |  +- net.sourceforge.htmlunit:htmlunit-core-js:jar:2.17:compile
[INFO] |  +- xerces:xercesImpl:jar:2.11.0:compile
[INFO] |  |  \- xml-apis:xml-apis:jar:1.4.01:compile
[INFO] |  +- net.sourceforge.nekohtml:nekohtml:jar:1.9.22:compile
[INFO] |  +- net.sourceforge.cssparser:cssparser:jar:0.9.18:compile
[INFO] |  |  \- org.w3c.css:sac:jar:1.3:compile
[INFO] |  +- commons-io:commons-io:jar:2.4:compile
[INFO] |  +- commons-logging:commons-logging:jar:1.2:compile
[INFO] |  \- org.eclipse.jetty.websocket:websocket-client:jar:9.2.15.v20160210:compile
[INFO] |     +- org.eclipse.jetty:jetty-util:jar:9.2.15.v20160210:compile
[INFO] |     +- org.eclipse.jetty:jetty-io:jar:9.2.15.v20160210:compile
[INFO] |     \- org.eclipse.jetty.websocket:websocket-common:jar:9.2.15.v20160210:compile
[INFO] |        \- org.eclipse.jetty.websocket:websocket-api:jar:9.2.15.v20160210:compile
[INFO] +- com.google.code.gson:gson:jar:2.8.9:compile
[INFO] +- com.opencsv:opencsv:jar:3.7:compile
[INFO] +- ch.qos.logback:logback-classic:jar:1.2.10:compile
[INFO] |  +- ch.qos.logback:logback-core:jar:1.2.10:compile
[INFO] |  \- org.slf4j:slf4j-api:jar:1.7.32:compile
[INFO] +- com.fasterxml.jackson.core:jackson-databind:jar:2.8.3:compile
[INFO] |  +- com.fasterxml.jackson.core:jackson-annotations:jar:2.8.0:compile
[INFO] |  \- com.fasterxml.jackson.core:jackson-core:jar:2.8.3:compile
[INFO] +- org.projectlombok:lombok:jar:1.18.22:provided
[INFO] +- junit:junit:jar:4.13.2:test
[INFO] |  \- org.hamcrest:hamcrest-core:jar:1.3:test
[INFO] \- nl.jqno.equalsverifier:equalsverifier:jar:3.8.1:test
...

En este ejemplo, mi proyecto se llama com.chuidiang.examples:java-se-examples:jar:0.0.1-SNAPSHOT y se puede ver qué dependencias tiene y las dependencias transitivas (dependencias de las dependencias). Para cada una de ellas viene el groupId, artifactId, version, packaging, classifier si lo hubiera y scope

Volcar dependency tree a fichero[editar]

En un proyecto complejo la salida del comando puede ser larga. Podemos volcar el árbol de dependencias a fichero con la opción -DoutputFile=dependency-tree.txt. El formato de salida por defecto es texto plano.

Maven dependency analyze[editar]

Clasifica las dependencias en tres bloques y nos muestra el resultado en pantalla

  • used and declared. Son dependencias que hemos puesto en el fichero pom.xml y que nuestro código usa.
  • used and undeclared. Son dependencias transitivas que nuestro código usa, pero que no hemos puesto explícitamente en el pom.xml.
  • unused and declared. Son dependencias que hemos puesto, pero no usamos.

Veamos un ejemplo con algo más de detalle. En el proyecto anterior, ejecutamos el comando mvn dependency:analyze

C:\MiProyectoMaven> mvn dependency:analyze
...
[WARNING] Used undeclared dependencies found:
[WARNING]    com.fasterxml.jackson.core:jackson-core:jar:2.8.3:compile
[WARNING]    com.fasterxml.jackson.core:jackson-annotations:jar:2.8.0:compile
[WARNING]    org.slf4j:slf4j-api:jar:1.7.32:compile
[WARNING] Unused declared dependencies found:
[WARNING]    ch.qos.logback:logback-classic:jar:1.2.10:compile
[WARNING]    org.projectlombok:lombok:jar:1.18.22:provided
...

Used and declared dependencies[editar]

Por defecto no las saca. Si declaramos una dependencia y la usamos, está todo correcto. Si quisieramos el listado, tendríamo que ejecutar el comando con la opción verbose

mvn dependency:analyze -Dverbose=true
...
[INFO] Used declared dependencies found:
[INFO]    commons-codec:commons-codec:jar:1.10:compile
[INFO]    net.sourceforge.htmlunit:htmlunit:jar:2.20:compile
[INFO]    com.google.code.gson:gson:jar:2.8.9:compile
[INFO]    com.opencsv:opencsv:jar:3.7:compile
[INFO]    com.fasterxml.jackson.core:jackson-databind:jar:2.8.3:compile
[INFO]    junit:junit:jar:4.13.2:test
[INFO]    nl.jqno.equalsverifier:equalsverifier:jar:3.8.1:test
...

Used undeclared dependencies[editar]

Del segundo bloque, Used undeclared dependencies, cogemos por ejemplo la de org.slf4j:slf4j-api:jar:1.7.32:compile. El código está usando esta librería, pero no hemos puesto la dependencia explícitamente en el fichero pom.xml. Si vas al árbol anterior donde salía esta dependencias verás lo siguiente

[INFO] +- ch.qos.logback:logback-classic:jar:1.2.10:compile
[INFO] |  +- ch.qos.logback:logback-core:jar:1.2.10:compile
[INFO] |  \- org.slf4j:slf4j-api:jar:1.7.32:compile

Tenemos y podemos usar la dependencia org.slf4j:slf4j-api:jar:1.7.32:compile porque en el fichero pom.xml hemos puesto la dependencia de ch.qos.logback:logback-classic:jar:1.2.10:compile que acaba trayendo la de slf4j.

Esto no es una buena costumbre y se marca como WARNING. Si en algún momento logback-classic decide cambiar sus dependencias, nuestro código dejará de compilar. La buena constumbre es poner explícitamente en el fichero pom.xml las que necesitemos.

Unused and declared dependencies[editar]

Dependencias que hemos puesto en el fichero pom.xml pero que no usamos. Deberíamos borrarlas, aunque siempre con cudidado y aquí tienes un par de ejemplos

No usamos logback-classic, pero si slf4j como hemos visto antes. Si borramos logback-classic, el proyecto dejará de compilarnos. Aquí la solución correcta sería reemplazar logback-classic por slf4j

lombok es una librería especial. No se usa en código, pero al compilar genera código por nostros. Es típico usar lombok para no poner los setter y getter de nuestras clases. lombok los genera por nosotros y los mete en los ficheros .class resultado de la compilación. No podemos quitar la dependencia, o bien podemos quitarla, pero tendremos que poner el código que genera lombok de forma manual o con ayuda del IDE.

Maven dependency copy dependencies[editar]

Este comando copia todas las dependencias en el directorio target/dependency. Puede ser útil si queremos hacer un zip con todas las dependencias necesarias o bajárnoslas por algún motivo.

C:\MiProyectoMaven> mvn dependency:copy-dependencies
...
C:\MiProyectoMaven> dir target\dependency
...
31/10/2020  14:02           284.184 commons-codec-1.10.jar
06/10/2019  09:37           185.140 commons-io-2.4.jar
19/01/2020  12:25           434.678 commons-lang3-3.4.jar
31/10/2020  14:02            61.829 commons-logging-1.2.jar
31/10/2020  14:02           372.937 cssparser-0.9.18.jar
19/12/2021  12:57         3.293.189 equalsverifier-3.8.1.jar
...

Maven dependency go offline[editar]

Este comando copia en nuestro repositorio maven local todas las dependencias que necesitamos, incluidas de plugins. Suele utilizarse si vas a trabajar sin conexión a internet. Antes de desconectarte, ejecutas el comando. Por supuesto, mientras estás off-line no podrás añadir nuevas dependencias ni plugins.

Maven dependency purge local repository[editar]

Si tenemos sospechas de que nuestro repositorio local de maven contiene alguna de nuestras dependencias corrupta porque no se ha descargado correctamente o simplemente queremos forzar a volver a bajarnos las dependencias, podemos ejecutar el comando

mvn dependency:purge-local-repository 

Borrará todas las dependencias de nuestro proyecto del repositorio local y las volverá a bajar. Un detalle a tener en cuenta, para obtener nuevas versiones de las depedencias -SNAPSHOT no es necesario ejecutar este comando, que es un poco drástico. Nos bastaría con ejecutar cualquier comando de compilado de Maven con la opción -U

mvn -U compile