Подтвердить что ты не робот

Как перечислить активные подмодули в проекте Maven?

У меня сложный проект, в котором есть много каталогов, в которых есть файлы POM, но только некоторые из них являются подмодулями (возможно, транзитивно) определенного родительского проекта.

Очевидно, Maven знает список соответствующих файлов, потому что он анализирует все теги <module>, чтобы найти их. Но я вижу только список <name> в комментариях [INFO], а не пути к этим модулям.

Есть ли способ, чтобы Maven выводил список всех файлов POM, содержащих ссылки на проекты, которые являются частью сборки реактора для данного проекта?

4b9b3361

Ответ 1

Вот способ сделать это на Linux за пределами Maven, используя strace.

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

Первая строка запускает mvn dependency:tree в strace, запрашивая strace для вывода в файл opens.txt всех вызовов системного вызова open(2), следующих за любыми вилками (потому что Java поточно). Этот файл выглядит примерно так:

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

Вторая строка просит Perl распечатать любой текст внутри кавычек, который заканчивается в pom.xml. (Флаг -l обрабатывает новые строки, -n обертывает одинарные кавычки кода в цикле, который просто считывает любые файлы в командной строке, а -e обрабатывает сам script, который использует регулярное выражение для поиска интересных вызовы для открытия.)

Было бы неплохо иметь способ maven-native: 1)

Ответ 2

Это довольно просто, но он получает только файл artifactId из корневого (или родительского) модуля:

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

Если вам нужны каталоги

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

Ответ 4

Решение, которое я нашел, довольно просто:

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

Это немного сложно из-за необходимости вырезать строки [INFO | WARNING | ERROR] и сделать их пригодными для написания сценариев, но сэкономило мне много времени, так как вы можете разместить там какое-либо выражение.

Ответ 5

У меня была такая же проблема, но она была решена без strace. Плагин mvn exec:exec используется для touch pom.xml в каждом проекте, а затем find недавно измененные файлы pom.xml:

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"

И у вас есть список ваших проектов в файле maven_projects_list.txt.

Ответ 6

У меня нет прямого ответа на вопрос. Но для меня работает какой-то "путь к модулю", как соглашение об именах для <name> моих модулей. Как вы увидите, это соглашение объясняет сам.

Учитывая следующую структуру проекта:

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

Вот результат сборки реактора:

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

Это дает IMHO очень приличный обзор того, что происходит, масштабируется правильно, и довольно легко найти любой модуль в файловой системе в случае возникновения проблем.

Не уверен, что это действительно отвечает всем вашим потребностям.

Ответ 7

Это команда , используемая для перечисления всех файлов pom.xml внутри проекта в корне проекта.

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

Что делает команда:

find -name pom.xml что я ищу

grep -v target избегать перечисления pom.xml внутри target/directory

sort отобразить результат в алфавитном порядке