2010-09-07 7 views
13

Ich habe ein komplexes Projekt, in dem es viele Verzeichnisse gibt, die POM-Dateien enthalten, aber nur einige davon sind Untermodule (möglicherweise transitiv) eines bestimmten übergeordneten Projekts.Wie listet man aktive Submodule in einem Maven-Projekt auf?

Offensichtlich kennt Maven die Liste der relevanten Dateien, weil es alle Tags analysiert, um sie zu finden. Aber ich sehe nur eine Liste der <name> s in den Kommentaren [INFO], nicht die Pfade zu diesen Modulen.

Gibt es eine Möglichkeit, Maven eine Liste aller POM-Dateien ausgeben zu lassen, die Verweise auf Projekte enthalten, die Teil des Reaktorbaus für ein bestimmtes Projekt sind?

Antwort

2

Hier ist eine Möglichkeit, dies unter Linux außerhalb von Maven zu tun, indem Sie strace verwenden.

$ strace -o opens.txt -f -e open mvn dependency:tree > /dev/null 
$ perl -lne 'print $1 if /"(.*pom\.xml)"/' opens.txt 

Die erste Zeile läuft mvn dependency:tree unter strace, strace zur Ausgabe in die Datei zu fragen opens.txt alle Anrufe an den open(2) Systemaufruf, nach irgendwelchen Gabeln (weil Java Gewinde versehen ist). Diese Datei sieht ungefähr so ​​aus:

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 

Die zweite Zeile Perl einen beliebigen Text in Anführungszeichen drucken fragt, die in pom.xml Ende passiert. (Die -l Flagge Griffe Druckzeilenumbrüche, die -n wickelt den Code einfache Anführungszeichen in einer Schleife, die alle Dateien auf der Kommandozeile einfach liest, und die -e behandelt das Skript selbst, die einen regulären Ausdruck verwendet interessante Gespräche zu finden, zu öffnen.)

Es wäre schön, eine maven-native Art zu haben, dies zu tun :-)

0

Ich habe keine direkte Antwort auf die Frage. Aber die Verwendung einer Art "Modulpfad" als Namenskonvention für die <name>10 meiner Module funktioniert für mich. Wie Sie sehen werden, ist diese Konvention selbsterklärend.

die folgende Projektstruktur Gegeben:

 
. 
├── 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 

Hier ist der Ausgang eines Reaktors Baujahr:

 
$ 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 
... 

Das gibt meiner Meinung nach ein sehr anständiger Überblick darüber, was passiert ist, richtig skaliert, und es ist ziemlich einfach, irgendein Modul im Dateisystem zu finden, wenn Probleme auftreten.

Nicht sicher, dass dies jedoch alle Ihre Bedürfnisse beantwortet.

+0

Es stimmt, dass einige besser Namensgebung die Struktur visualisieren würde helfen. In diesem Fall möchte ich jedoch eine Liste von Dateinamen erstellen, die ich als Einschränkung an 'git grep' weitergeben kann, damit ich die Pfade zu den POMs brauche. –

+0

@Emil Oh, ich verstehe. Das ist eine andere Geschichte :) –

1

Ich hatte das gleiche Problem, aber löste es ohne strace. Die mvn exec:exec Plugin wird touch pom.xml in jedem Projekt verwendet wird, und dann find die kürzlich pom.xml Dateien geändert:

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" 

Und Sie haben Ihre Projekte-Liste in der maven_projects_list.txt Datei.

2

Die Lösung, die ich ist ganz einfach gefunden:

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 '\[' 

Dies ist ein wenig kompliziert wegen der Notwendigkeit, die [INFO | WARNUNG | ERROR] grep aus Linien und es für das Skripting nutzbar zu machen, aber mich gerettet eine Menge Zeit, da Sie dort einen Ausdruck setzen können.

+1

Gut, ich brauchte das. Es kann ein bisschen vereinfacht sein, und es ist nicht so schwierig, wenn Sie eine spezielle Zeichenfolge in das Echo-Argument hinzufügen, und dann grep dafür: 'mvn -B exec: exec -Dexec.executable = echo -Dexec.args = '## #MODULE_GAV ### $ {project.groupId}: $ {project.artifactId}: $ {project.version} ' grep '### MODUL_GAV ###' | schneiden -f2 -d '' ' –

10

Das ist ganz einfach, aber es wird nur die artifactId, von der Wurzel (oder Eltern) Modul:

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

Wenn Sie die Verzeichnisse wollen

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

Dies ist der Befehl Ich verwende für die Auflistung aller Pom .xml Dateien in einem Projekt im Stammverzeichnis des Projekts.

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

Was der Befehl tun:

find -name pom.xmlwas ich

grep -v targetvermeiden suchen pom.xml innerhalb Ziel/Verzeichnis

01 zur Liste

sortListe das Ergebnis in alphabetischer Reihenfolge

Verwandte Themen