Maven Dependency Tree
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