如何列出Maven项目中的活动子模块?

Emi*_*Sit 21 maven-2

我有一个复杂的项目,其中有许多目录有POM文件,但只有一些是特定父项目的子模块(可能是传递).

显然,Maven知道相关文件的列表,因为它解析所有<module>标签以找到它们.但是,我只看到<name>[INFO]注释中的s 列表,而不是这些模块的路径.

有没有办法让Maven输出所有POM文件的列表,这些文件提供对作为给定项目的reactor构建的一部分的项目的引用?

Bon*_*rte 23

这很简单,但它只从根(或父)模块获取artifactId:

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

如果你想要目录

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


his*_*ner 11

以下脚本打印所有子模块的 artifactId:

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
...
Run Code Online (Sandbox Code Playgroud)

  • 这太慢了,我们有 40 个模块,需要 30 秒才能获得该列表。这就是为什么我在CI/CD方面非常不喜欢maven。 (5认同)

Lau*_*uet 8

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
Run Code Online (Sandbox Code Playgroud)


Emi*_*Sit 6

下面是在 Maven 之外的 Linux 上使用 strace 执行此操作的方法。

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

第一行在 strace 下运行,要求 strace 将所有对系统调用的调用mvn dependency:tree输出到文件中,跟随任何分支(因为 Java 是线程化的)。该文件看起来像:opens.txtopen(2)

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
Run Code Online (Sandbox Code Playgroud)

第二行要求 Perl 打印引号内恰好以 pom.xml 结尾的任何文本。(该-l标志处理打印换行符,将-n代码单引号包装在一个循环中,该循环仅读取命令行上的任何文件,并且-e处理脚本本身,它使用正则表达式来查找要打开的有趣调用。)

如果有一种 Maven 原生的方式来做到这一点那就太好了:-)


小智 5

我发现的解决方案非常简单:

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 '\['
Run Code Online (Sandbox Code Playgroud)

这有点棘手,因为需要 grep 出 [INFO|WARNING|ERROR] 行并使其可用于脚本编写,但因为您可以在那里放置任何表达式,所以节省了我很多时间。

  • 好东西,我需要那个。它可以稍微简化一些,如果您在 echo 参数中添加一个特殊字符串,然后 grep 查找它,那就不是那么棘手: `mvn -B exec:exec -Dexec.executable=echo -Dexec.args='## #MODULE_GAV### ${project.groupId}:${project.artifactId}:${project.version}' | grep '###MODULE_GAV### ' | 剪切-f2-d''` (3认同)