que proyecto paso mvn importar gestor estructura dependencias crear clean maven-2

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