2010-09-07 9 views
13

Mam złożony projekt, w którym istnieje wiele katalogów, które mają pliki POM, ale tylko niektóre z nich są podmodułami (prawdopodobnie przechodnie) danego projektu nadrzędnego.Jak wyświetlić aktywne pod-moduły w projekcie Maven?

Oczywiście, Maven zna listę odpowiednich plików, ponieważ analizuje wszystkie znaczniki <module>, aby je znaleźć. Ale widzę tylko listę <name> s w komentarzach [INFO], a nie ścieżki do tych modułów.

Czy istnieje sposób, aby Maven wypisał listę wszystkich plików POM, które zawierały odniesienia do projektów, które są częścią budowy reaktora dla danego projektu?

Odpowiedz

2

Oto sposób, aby zrobić to na Linuksie poza Maven, używając strace.

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

Pierwsza linia biegnie mvn dependency:tree pod strace, prosząc strace na wyjście do pliku opens.txt wszystkie połączenia do wywołania systemowego open(2), następujące żadnych widełek (ponieważ Java jest gwintowany). Ten plik wygląda mniej więcej tak:

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 

Druga linia pyta Perl wydrukować dowolny tekst wewnątrz cudzysłowów, co dzieje się zakończyć w pom.xml. (The -l flag obsługuje nowe linie druku, -n owija Kodeksu apostrofów w pętli, które po prostu czyta plików w linii poleceń, a -e obsługuje skrypt sam, który używa regex aby znaleźć interesujące rozmowy, aby otworzyć).

Byłoby miło mieć to na swój sposób :-)

0

Nie mam bezpośredniej odpowiedzi na to pytanie. Ale używa mnie pewnego rodzaju "ścieżka modułu", jak nazywanie konwencji dla moich modułów. Jak się przekonacie, ta konwencja sama się wyjaśni.

Biorąc pod uwagę następującą strukturę projektu:

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

Oto wyjściowy budowie reaktora:

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

Daje IMHO bardzo przyzwoity przegląd tego, co się dzieje, skaluje się poprawnie, a to dość łatwo znaleźć dowolny moduł w systemie plików w przypadku problemów.

Nie jestem pewien, czy to odpowiada na wszystkie Twoje potrzeby.

+0

To prawda, że ​​niektóre lepsze nazewnictwa pomoże zobrazować strukturę. Jednak w tym przypadku chcę utworzyć listę nazw plików, które mogę przekazać jako ograniczenie do 'git grep', tak naprawdę potrzebuję ścieżek do POM. –

+0

@Emil Oh, rozumiem. To inna historia :) –

1

Miałem ten sam problem, ale rozwiązałem go bez strace. Wtyczka mvn exec:exec służy do touch pom.xml w każdym projekcie, a następnie find ostatnio zmodyfikowano pom.xml pliki:

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" 

I masz swoją listę projektów w pliku maven_projects_list.txt.

2

Rozwiązanie znalazłem jest dość prosta:

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

To jest trochę trudne ze względu na konieczność grep zewnątrz [info Ostrzeżenie o | ERROR] linie i sprawiają, że nadające się do skryptów, ale uratował mnie dużo czasu, ponieważ możesz tam umieścić dowolne wyrażenie.

+1

Dobra, potrzebowałem tego. Może być nieco uproszczony i nie jest tak trudne, jeśli dodasz specjalny ciąg do argumentu echa, a następnie grep do tego: 'mvn -B exec: exec -Dexec.executable = echo -Dexec.args = '## #MODULE_GAV ### $ {project.groupId}: $ {project.artifactId}: $ {project.version} '| grep '### MODULE_GAV ###' | cut -f2 -d "" –

10

Jest to dość proste, ale robi się tylko artifactId, od korzenia (lub rodzic) Moduł:

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

Jeśli chcesz katalogi

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

To jest polecenie Używam do umieszczenia na liście wszystkich pom pom .xml pliki wewnątrz projektu w katalogu głównym projektu.

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

Co zrobić komenda:

find -name pom.xmlco mam szukać

grep -v targetunikać Sprzedawców pom.xml wewnątrz docelowego katalogu/

sortlista wynik w kolejności alfabetycznej

Powiązane problemy