maven 2 - paso - ¿Cómo listar los submódulos activos en un proyecto de Maven?
java maven paso a paso (8)
Tengo un proyecto complejo donde hay muchos directorios que tienen archivos POM, pero solo algunos de los cuales son sub-módulos (posiblemente de forma transitoria) de un proyecto principal en particular.
Obviamente, Maven conoce la lista de archivos relevantes porque analiza todas las etiquetas <module>
para encontrarlas. Pero, solo veo una lista de los <name>
en los comentarios de [INFO], no las rutas a esos módulos.
¿Hay alguna manera de que Maven genere una lista de todos los archivos POM que proporcionaron referencias a proyectos que forman parte de la construcción del reactor para un proyecto determinado?
Aquí hay una manera de hacer esto en Linux fuera de Maven, usando strace.
$ strace -o opens.txt -f -e open mvn dependency:tree > /dev/null
$ perl -lne ''print $1 if /"(.*pom/.xml)"/'' opens.txt
La primera línea ejecuta la mvn dependency:tree
bajo strace, pidiéndole a strace que envíe al archivo opens.txt
todas las llamadas al sistema open(2)
llamada, siguiendo cualquier bifurcación (porque Java está enlazado). Este archivo se ve algo como:
9690 open("/etc/ld.so.cache", O_RDONLY) = 3
9690 open("/lib/libncurses.so.5", O_RDONLY) = 3
9690 open("/lib/libdl.so.2", O_RDONLY) = 3
La segunda línea le pide a Perl que imprima cualquier texto entre comillas que termine en pom.xml. (La marca -l
maneja las nuevas líneas de impresión, la -n
envuelve las comillas simples del código en un bucle que simplemente lee cualquier archivo en la línea de comando, y la -e
maneja el script que usa una expresión regular para encontrar llamadas interesantes para abrir).
Sería bueno tener una forma nativa de hacer esto :-)
Este es el comando que uso para listar todos los archivos pom.xml dentro de un proyecto en la raíz del proyecto.
find -name pom.xml | grep -v target | sort
Lo que el comando hace:
find -name pom.xml
lo que busco
grep -v target
evite enumerar pom.xml dentro de target / directory
sort
listado el resultado en orden alfabético
Esto es bastante simple pero solo obtiene el artifactId, desde el módulo raíz (o padre):
mvn --also-make dependency:tree | grep maven-dependency-plugin | awk ''{ print $(NF-1) }''
Si quieres los directorios
mvn -q --also-make exec:exec -Dexec.executable="pwd"
La siguiente secuencia de comandos imprime artefactos de todos los submódulos:
mvn -Dexec.executable=''echo'' -Dexec.args=''${project.artifactId}'' exec:exec -q
Ejemplo de salida:
build-tools
aws-sdk-java-pom
core
annotations
utils
http-client-spi
http-client-tests
http-clients
apache-client
test-utils
sdk-core
...
La solución que encontré es bastante simple:
mvn -B -f "$pom_file" org.codehaus.mojo:exec-maven-plugin:1.4.0:exec /
-Dexec.executable=/usr/bin/echo /
-Dexec.args=''${basedir}/pom.xml''| /
grep -v ''/[''
Esto es un poco complicado debido a la necesidad de grep en las líneas [INFO | WARNING | ERROR] y hacer que sea utilizable para secuencias de comandos, pero me ahorró mucho tiempo ya que puede poner cualquier expresión allí.
No tengo una respuesta directa a la pregunta. Pero usar algún tipo de "ruta de módulo" como convención de denominación para el <name>
de mis módulos funciona para mí. Como verás, esta convención es autoexplicativa.
Dada la siguiente estructura de proyecto:
. ├── pom │ ├── pom.xml │ └── release.properties ├── pom.xml ├── samples │ ├── ejb-cargo-sample │ │ ├── functests │ │ │ ├── pom.xml │ │ │ └── src │ │ ├── pom.xml │ │ └── services │ │ ├── pom.xml │ │ └── src │ └── pom.xml └── tools ├── pom.xml └── verification-resources ├── pom.xml └── src
Aquí está la salida de una construcción de reactor:
$ mvn compile [INFO] Scanning for projects... [INFO] Reactor build order: [INFO] Personal Sandbox - Samples - Parent POM [INFO] Personal Sandbox - Samples - EJB3 and Cargo Sample [INFO] Personal Sandbox - Tools - Parent POM [INFO] Personal Sandbox - Tools - Shared Verification Resources [INFO] Personal Sandbox - Samples - EJB3 and Cargo Sample - Services [INFO] Personal Sandbox - Samples - EJB3 and Cargo Sample - Functests [INFO] Sandbox Externals POM ...
Esto le da a IMHO una visión general muy decente de lo que está sucediendo, se escala correctamente y es bastante fácil encontrar cualquier módulo en el sistema de archivos en caso de problemas.
Aunque no estoy seguro de que esto responda a todas tus necesidades.
Tuve el mismo problema pero lo resolví sin strace
. El mvn exec:exec
se utiliza para touch pom.xml
en todos los proyectos y luego find
los archivos pom.xml
modificados recientemente:
ctimeref=`mktemp`
mvn --quiet exec:exec -Dexec.executable=/usr/bin/touch -Dexec.args=pom.xml
find . -mindepth 2 -type f -name pom.xml -cnewer "$ctimeref" > maven_projects_list.txt
rm "$ctimeref"
Y tienes tu lista de proyectos en el archivo maven_projects_list.txt
.
mvn help:evaluate -Dexpression=project.modules
mvn help:evaluate -Dexpression=project.modules[0]
mvn help:evaluate -Dexpression=project.modules[1]
IFS=$''/n''
modules=($(mvn help:evaluate -Dexpression=project.modules | grep -v "^/[" | grep -v "<//*strings>" | sed ''s/<//*string>//g'' | sed ''s/[[:space:]]//''))
for module in "${modules[@]}"
do
echo "$module"
done