在多模块反应堆项目的子模块中,从命令行运行特定的Maven插件目标。
在多模块反应堆项目的子模块中,从命令行运行特定的Maven插件目标。
我在寻找一种通用的技术,但让我们举一个具体的例子。我有一个多模块项目,我想通过命令行对项目的其中一个子模块运行exec:java
目标。
我知道一种方法是可以对整个项目运行mvn install
,然后进入子模块目录,从命令行运行exec:java
命令,并将构件解析到我的本地仓库。但是,经常运行mvn install
变得非常繁琐。
我真正想要的是能够对Maven反应堆运行exec:java
,其中类路径是从项目中活动的模块构建的。问题是我不确定这是否可能。一个天真的方法是从项目的根目录运行exec:java
目标,但这会尝试对项目中的每个模块运行插件,而不是我感兴趣的目标模块。
有什么想法吗?我知道我的动机示例是exec:java
,但实际上我还想偶尔在完整构建生命周期之外运行我的项目中的一些单一插件目标。
在多模块反应堆项目的子模块中从命令行运行特定的Maven插件目标的原因是,许多插件都有一个skip选项,可以通过将其值设置为true来在根项目上激活。插件执行将默认跳过所有子模块。应该显式将skip设置为false以执行插件的子模块。仍然需要在根项目中配置任何非可选属性。
解决方法是使用
根项目中的配置:
org.codehaus.mojo exec-maven-plugin 1.3.2 true java
任何应该执行插件的子模块中的配置:
org.codehaus.mojo exec-maven-plugin false
此方法不需要使用任何丑陋的技巧,可以正常工作。如果使用exec:java,需要在父pom.xml中删除
这种方法适用于依赖其他模块的模块吗?exec-maven-plugin会将它们包含在类路径中吗?-am -pl unicodetools是项目文件夹列表。需要从根目录运行该命令,并在运行exec:java目标之前在命令中包含compile。具体命令如下:
mvn -s ~/.m2/settings.xml compile exec:java -Dexec.mainClass="org.unicode.text.UCA.Main" -Dexec.args="ICU" -am -pl unicodetools
更多细节请参考上述评论的链接:github.com/unicode-org/unicodetools/issues/317
问题:如何在多模块反应堆项目的子模块中从命令行运行特定的Maven插件目标?
原因:在多模块项目中,运行exec:java插件时希望针对项目的某个子模块进行操作。
解决方法:可以使用-pl, --projects
具体命令为:mvn exec:java -pl my-module
原因:已经了解到可以通过运行"mvn install"在整个项目上执行,然后进入子模块目录,从命令行运行exec:java命令,并将构件解析到本地仓库。
解决方法:确实通过本地仓库进行依赖解析。
原因:希望能够在Maven反应堆中运行exec:java,其中类路径是从Maven反应堆中的活动模块构造的。
解决方法:这并不是反应堆构建的真正目的。反应堆构建通过构建模块的有向图,从中导出适当的构建顺序,并对计算顺序中的模块运行目标/阶段。反应堆构建不构造某个“全局”类路径。
原因:一个天真的方法是从项目的根目录运行exec:java目标,但这会尝试对项目中的每个模块运行插件,而不是我感兴趣的目标模块。
解决方法:这是预期的行为,但似乎并不是你真正寻找的东西。
原因:有什么建议吗?我知道我激励的例子是exec:java,但实际上有一些单一插件目标,我想偶尔在完整构建生命周期范围之外对我的项目运行。
解决方法:反应堆构建确实允许这样做,但正如我所写的,你似乎寻找的是不同的东西。如果你明确你的具体需求,我可能能够提供更好的答案。
你写道“确实通过本地仓库进行依赖解析”...这并不总是正确的...特别是对于反应堆构建来说通常并不是真的...为了验证这一点,请尝试从多模块项目的根目录运行mvn package。你会发现它成功了,尽管本地仓库不包含任何我们尝试打包的模块。
等等,这太棒了!你的代码片段实际上对我起作用了!mvn exec:java -pl my-module实际起作用!(嗯,我想要的不仅仅是exec:java,但它对它也起作用!)...编辑:我说得太早了...它可以运行“help”目标,但对于任何非平凡的目标都无法工作。叹息。
在一个多模块的反应堆项目中,通过命令行运行特定的Maven插件目标是一个常见的需求。下面的内容提供了一种解决方法。
通常,可以在需要的子模块POM中定义一个配置文件,将exec:java绑定到测试阶段。具体配置如下:
test-java org.codehaus.mojo exec-maven-plugin 1.1.1 test java com.foo.bar.MyClass
然后在项目的顶层目录中运行以下命令:
mvn test -Ptest-java
这将像往常一样设置模块间的类路径,并尝试在所有子项目中运行test-java配置文件。但是由于只有你关心的子项目定义了该配置文件,所以只有它会执行相应的操作。
需要注意的一点是,子项目是以顶层目录作为当前工作目录运行的(而不是子项目目录)。这个问题目前无法解决,但希望这不会给你带来麻烦。
虽然Maven需要额外的时间来处理其他子项目的NOOP操作,但并不会太糟糕。