How to list active sub-modules in a Maven project?

2020-02-23 07:17发布

I have a complex project where there are many directories that have POM files, but only some of which are sub-modules (possibly transitively) of a particular parent project.

Obviously, Maven knows the list of relevant files because it parses all the <module> tags to find them. But, I only see a list of the <name>s in the [INFO] comments, not the paths to those modules.

Is there a way to have Maven output a list of all the POM files that provided references to projects that are part of the reactor build for a given project?

标签: maven-2
8条回答
太酷不给撩
2楼-- · 2020-02-23 07:33

This is quite simple but it only gets the artifactId, from the root (or parent) module:

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

If you want the directories

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

查看更多
Summer. ? 凉城
3楼-- · 2020-02-23 07:36
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楼-- · 2020-02-23 07:36

The following script prints artifactId's of all sub-modules:

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

Example output:

build-tools
aws-sdk-java-pom
core
annotations
utils
http-client-spi
http-client-tests
http-clients
apache-client
test-utils
sdk-core
...
查看更多
Summer. ? 凉城
5楼-- · 2020-02-23 07:42

Here's a way to do this on Linux outside of Maven, by using strace.

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

The first line runs mvn dependency:tree under strace, asking strace to output to the file opens.txt all the calls to the open(2) system call, following any forks (because Java is threaded). This file looks something like:

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

The second line asks Perl to print any text inside quotes that happens to end in pom.xml. (The -l flag handles printing newlines, the -n wraps the code single quotes in a loop that simply reads any files on the command line, and the -e handles the script itself which uses a regex to find interesting calls to open.)

It'd be nice to have a maven-native way of doing this :-)

查看更多
女痞
6楼-- · 2020-02-23 07:44

This is the command I use for listing all pom.xml files inside a project at the root of the project.

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

What the command do :

find -name pom.xml what I search

grep -v target avoid to list pom.xml inside target/ directory

sort list the result in alphabetical order

查看更多
放荡不羁爱自由
7楼-- · 2020-02-23 07:47

I had the same problem but solved it without strace. The mvn exec:exec plugin is used to touch pom.xml in every project, and then find the recently modified pom.xml files:

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"

And you have your projects list in the maven_projects_list.txt file.

查看更多
登录 后发表回答