我有一个复杂的项目,其中有许多目录都有POM文件,但其中只有一些是特定父项目的子模块(可能是传递的)。
显然,Maven知道相关文件列表,因为它会解析所有<module>
标签以找到它们。但是,我只看到[INFO]注释中的<name>
列表,而不是这些模块的路径。
有没有办法让Maven输出所有POM文件的列表,这些文件提供对作为给定项目的reactor构建的一部分的项目的引用?
答案 0 :(得分:22)
这很简单,但它只从根(或父)模块中获取artifactId:
mvn --also-make dependency:tree | grep maven-dependency-plugin | awk '{ print $(NF-1) }'
如果你想要目录
mvn -q --also-make exec:exec -Dexec.executable="pwd"
答案 1 :(得分:7)
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
答案 2 :(得分:4)
这是通过使用strace在Maven之外的Linux上执行此操作的方法。
$ 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在任何forks之后输出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
处理脚本本身使用的正则表达式找到有趣的打开电话。)
以maven本地的方式做这件事会很好: - )
答案 3 :(得分:3)
我发现的解决方案非常简单:
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 out [INFO | WARNING | ERROR]行并使其可用于编写脚本,但是因为你可以在那里放任何表达式而节省了我很多时间。
答案 4 :(得分:3)
以下脚本显示所有子模块的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
...
答案 5 :(得分:1)
我有同样的问题,但没有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 :(得分:0)
我对这个问题没有直接的答案。但是使用某种“模块路径”作为我的模块<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 :(得分:-1)
这是我用于列出项目根目录下项目中所有 pom.xml 文件的命令。
find -name pom.xml | grep -v target | sort
该命令的作用:
find -name pom.xml
我搜索的内容
grep -v target
避免在目标/目录中列出pom.xml
sort
按字母顺序列出结果