Как перечислить активные подмодули в проекте Maven?
У меня сложный проект, в котором есть много каталогов, в которых есть файлы POM, но только некоторые из них являются подмодулями (возможно, транзитивно) определенного родительского проекта.
Очевидно, Maven знает список соответствующих файлов, потому что он анализирует все теги <module>
, чтобы найти их. Но я вижу только список <name>
в комментариях [INFO], а не пути к этим модулям.
Есть ли способ, чтобы Maven выводил список всех файлов POM, содержащих ссылки на проекты, которые являются частью сборки реактора для данного проекта?
Ответы
Ответ 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
отобразить результат в алфавитном порядке