Как вывести список активных субмодулей в проекте Maven? - PullRequest
20 голосов
/ 08 сентября 2010

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

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

Ответы [ 8 ]

23 голосов
/ 09 апреля 2016

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

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

Если вы хотите каталоги

mvn -q --also-make exec:exec -Dexec.executable="pwd"
7 голосов
/ 05 сентября 2016
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 голосов
/ 08 сентября 2010

Вот способ сделать это в 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 обрабатывает сам скрипт, который использует регулярное выражение для поиска интересных вызовов открыт.)

Было бы неплохо, если бы у меня был такой способ: -)

3 голосов
/ 13 августа 2018

Следующий скрипт печатает идентификаторы артефактов всех подмодулей:

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

Пример вывода:

build-tools
aws-sdk-java-pom
core
annotations
utils
http-client-spi
http-client-tests
http-clients
apache-client
test-utils
sdk-core
...
3 голосов
/ 28 января 2016

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

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] и сделать его пригодным для использования в сценариях, но сэкономило мне много времени, так как вы можете поместить туда любое выражение.

1 голос
/ 07 февраля 2013

У меня была такая же проблема, но я решил ее без 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.

0 голосов
/ 20 января 2017

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

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

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

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

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

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

0 голосов
/ 08 сентября 2010

У меня нет прямого ответа на вопрос. Но использование какого-то «пути к модулю» в качестве соглашения по именованию для <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 очень хороший обзор того, что происходит, корректно масштабируется, и довольно легко найти любой модуль в файловой системе в случае проблем.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...