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

时间:2010-09-07 20:09:48

标签: maven-2

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

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

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

8 个答案:

答案 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 按字母顺序列出结果