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