2010-09-07 13 views
13

Tengo un proyecto complejo en el que hay muchos directorios que tienen archivos POM, pero solo algunos de ellos son submódulos (posiblemente de forma transitiva) de un proyecto primario particular.¿Cómo se enumeran los submódulos activos en un proyecto de Maven?

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 hacer que Maven muestre una lista de todos los archivos POM que proporcionaron referencias a proyectos que son parte de la construcción del reactor para un proyecto determinado?

Respuesta

2

Aquí hay una manera de hacer esto en Linux fuera de Maven, mediante el uso de 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 se ejecuta bajo mvn dependency:tree strace, pidiendo a strace salida al archivo opens.txt todas las llamadas a la llamada open(2) sistema, siguiendo las horquillas (porque Java es roscado). 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 pide Perl para imprimir cualquier texto entre comillas que le sucede a terminar en pom.xml. (La bandera -l maneja las nuevas líneas de impresión, la -n contenga el código de comillas simples en un bucle que simplemente lee los archivos en la línea de comandos, y la -e maneja el propio script que utiliza una expresión regular para encontrar las llamadas interesantes para abrir.)

Sería bueno tener una forma nativa de maven de hacer esto :-)

0

No tengo una respuesta directa a la pregunta. Pero el uso de algún tipo de "ruta de módulo" como convención de nomenclatura para el <name> de mis módulos funciona para mí. Como verá, esta convención es auto explicativa.

Dada la siguiente estructura del 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 acumulación del 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 da mi humilde opinión, una visión muy decente de lo que está sucediendo, escalas correctamente, y es es bastante fácil encontrar cualquier módulo en el sistema de archivos en caso de problemas.

No estoy seguro si esto responde a todas sus necesidades.

+0

Es cierto que algunos mejores denominación sería ayudar a visualizar la estructura. Sin embargo, en este caso, quiero construir una lista de nombres de archivos que pueda pasar como una restricción a 'git grep', así que realmente necesito las rutas a los POM. –

+0

@Emil Oh, ya veo. Esa es otra historia :) –

1

Tuve el mismo problema pero lo resolví sin strace. El plug-in mvn exec:exec se utiliza para touch pom.xml en cada proyecto, y luego find la recién modificada pom.xml archivos:

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 usted tiene su lista de proyectos en el archivo maven_projects_list.txt.

2

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 a cabo las [INFO dejar un mensaje aqui ERROR] líneas y que sea utilizable para secuencias de comandos, pero me salvó mucho tiempo ya que puedes poner cualquier expresión allí.

+1

Bueno, necesitaba eso. Puede ser un poco simplificado, y no es tan complicado si agrega una cadena especial en el argumento echo, y luego grep para eso: 'mvn -B exec: exec -Dexec.executable = echo -Dexec.args = '## #MODULE_GAV ### $ {project.groupId}: $ {project.artifactId}: $ {project.version} '| grep '### MODULE_GAV ###' | corte -f2 -d '' ' –

10

Esta es bastante simple, pero que sólo se pone el artifactId, de la raíz (o el padre) Módulo:

mvn --also-make dependency:tree | grep maven-dependency-plugin | awk '{ print $(NF-1) }'

Si desea que los directorios

mvn -q --also-make exec:exec -Dexec.executable="pwd"

3
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 
-1

Este es el comando que uso para enumerar todos pom .xml archivos dentro de un proyecto en la raíz del proyecto.

find -name pom.xml | grep -v target | sort

Lo que el comando DO:

find -name pom.xmllo que busco

grep -v targetevitar a la lista pom.xml el interior de destino/directorio

lista

sortel resultado en orden alfabético

Cuestiones relacionadas