46 Stimmen

Wie kann man aktive Untermodule in einem Maven-Projekt auflisten?

Ich habe ein komplexes Projekt, in dem es viele Verzeichnisse gibt, die POM-Dateien enthalten, von denen jedoch nur einige (möglicherweise vorübergehend) Untermodule eines bestimmten übergeordneten Projekts sind.

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

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

35voto

Bonaparte Punkte 389

Dies ist recht einfach, aber es erhält nur die artifactId vom Root (oder parent) Modul:

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

Wenn Sie die Verzeichnisse

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

24voto

hisener Punkte 1244

Der folgende Befehl gibt die Artefakt-IDs aller Untermodule aus:

mvn -Dexec.executable='echo' -Dexec.args='${project.artifactId}' exec:exec -q

Beispielhafte Ausgabe:

build-tools
aws-sdk-java-pom
core
annotations
utils
http-client-spi
http-client-tests
http-clients
apache-client
test-utils
sdk-core
...

16voto

Laurent Picquet Punkte 1049
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

6voto

Emil Sit Punkte 21922

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

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

Die erste Zeile lautet mvn dependency:tree unter strace, um strace zur Ausgabe in die Datei opens.txt alle Aufrufe der open(2) Systemaufruf, nach allen Gabelungen (da Java threaded ist). Diese Datei sieht in etwa 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 fordert Perl auf, jeden Text in Anführungszeichen auszugeben, der zufällig auf pom.xml endet. (Die -l Flag das Drucken von Zeilenumbrüchen, das -n wickelt den Code in einfachen Anführungszeichen in eine Schleife ein, die einfach alle Dateien in der Befehlszeile liest, und die -e behandelt das Skript selbst, das einen Regex verwendet, um interessante Aufrufe zu finden).

Es wäre schön, eine Maven-native Möglichkeit zu haben, dies zu tun :-)

5voto

teoincontatto Punkte 1125

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

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

Das ist ein bisschen schwierig, weil man die [INFO|WARNING|ERROR]-Zeilen herausfischen muss, um sie für Skripte nutzbar zu machen, aber es hat mir viel Zeit gespart, da man dort jeden beliebigen Ausdruck eingeben kann.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X