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

Maven 2 如何列出Maven项目中的活动子模块?,maven-2,Maven 2,我有一个复杂的项目,其中有许多目录包含POM文件,但其中只有一些是特定父项目的子模块(可能是传递的) 显然,Maven知道相关文件的列表,因为它解析所有的标记来找到它们。但是,我在[INFO]注释中只看到了的列表,而没有这些模块的路径 有没有一种方法可以让Maven输出所有POM文件的列表,这些文件提供了对作为给定项目反应堆构建一部分的项目的引用?这里有一种方法可以在Maven之外的Linux上使用strace实现这一点 $ strace -o opens.txt -f -e open mvn

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

显然,Maven知道相关文件的列表,因为它解析所有的
标记来找到它们。但是,我在[INFO]注释中只看到了
的列表,而没有这些模块的路径


有没有一种方法可以让Maven输出所有POM文件的列表,这些文件提供了对作为给定项目反应堆构建一部分的项目的引用?

这里有一种方法可以在Maven之外的Linux上使用strace实现这一点

$ strace -o opens.txt -f -e open mvn dependency:tree > /dev/null
$ perl -lne 'print $1 if /"(.*pom\.xml)"/' opens.txt 
第一行在strace下运行
mvn dependency:tree
,要求strace在任何fork之后将对
open(2)
系统调用的所有调用输出到文件
opens.txt
(因为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
处理脚本本身,该脚本使用正则表达式查找要打开的有趣调用。)


如果有一个专业的方法来做这件事,那就太好了:-)

我对这个问题没有直接的答案。但是使用某种“模块路径”作为模块的
的命名约定对我来说是可行的。正如你将看到的,这个惯例是自我解释的

鉴于以下项目结构:

. ├── 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 . ├── 聚甲醛 │   ├── pom.xml │   └── 发布。属性 ├── pom.xml ├── 样品 │   ├── ejb货物样本 │   │   ├── 功能测试 │   │   │   ├── pom.xml │   │   │   └── src │   │   ├── pom.xml │   │   └── 服务 │   │   ├── pom.xml │   │   └── src │   └── pom.xml └── 工具 ├── pom.xml └── 核查资源 ├── 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 ... $mvn编译 [信息]正在扫描项目。。。 [信息]反应堆建造顺序: [信息]个人沙箱-样本-家长POM [信息]个人沙箱-样本-EJB3和货物样本 [信息]个人沙箱-工具-家长POM [信息]个人沙箱-工具-共享验证资源 [信息]个人沙箱-样本-EJB3和货物样本-服务 [信息]个人沙箱-样本-EJB3和货物样本-测试 [信息]沙盒外部POM ... 这使IMHO对正在发生的事情有了一个非常好的概述,可以正确地进行扩展,并且在出现问题时可以很容易地在文件系统中找到任何模块


不过,我不确定这是否能满足您的所有需求。

我也遇到过同样的问题,但没有使用
strace
就解决了它。
mvn exec:exec
插件用于在每个项目中
触摸pom.xml
,然后
查找最近修改的
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\u projects\u list.txt
文件中。

我找到的解决方案非常简单:

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

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

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

mvn——也可以生成依赖项:tree | grepmaven依赖项插件| awk'{print$(NF-1)}

如果你想要目录

mvn-q——也可以使exec:exec-Dexec.executable=“pwd”

mvn帮助:evaluate-Dexpression=project.modules
mvn帮助:evaluate-Dexpression=project.modules[0]
mvn帮助:evaluate-Dexpression=project.modules[1]
IFS=$'\n'
模块=($(mvn帮助:evaluate-Dexpression=project.modules | grep-v“^\[| grep-v”“| sed's///g'| sed's//[:space:][]/'))
对于“${modules[@]}”中的模块
做
回显“$module”
完成

这是命令我用于在项目根目录下列出项目中的所有pom.xml文件

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

命令的作用:

find-name pom.xml
我搜索的内容

grep-v target
避免在target/目录中列出pom.xml


排序
按字母顺序列出结果

以下脚本打印所有子模块的工件ID:

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

确实,一些更好的命名有助于可视化结构。但是,在这种情况下,我想构建一个文件名列表,作为对
git grep
的限制,因此我实际上需要POM的路径。@Emil哦,我明白了。这是另一个故事:)很好,我需要它。它可以稍微简化一点,我也不需要太复杂f您在echo参数中添加一个特殊字符串,然后grep:
mvn-B exec:exec-Dexec.executable=echo-Dexec.args='###MODULE#GAV##${project.groupId}:${project.artifactId}:${project.version}:${project“|grep”###########| cut-f2-d”
非常好,这对我很有用。为根pom和子模块生成GAV列表添加
-q
作为
mvn
的参数,这样就不需要grep消除噪音。 mvn -q --also-make exec:exec -Dexec.executable="pwd"
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
build-tools
aws-sdk-java-pom
core
annotations
utils
http-client-spi
http-client-tests
http-clients
apache-client
test-utils
sdk-core
...