我有一个maven POM,我想将其用作模板,根据我传递给它的参数产生具有不同名称的工件。但我无法弄清楚如何在运行时指定artifactId。
如果我像这样参数化<artifactId>
元素:
<artifact>foo-${bar}</artifact>
maven抱怨:
[警告]'artifactId'包含一个表达式,但应该是一个常量。
如果我在POM中遗漏<artifactId>
并尝试使用
mvn -Dproject.artifactId=foo ...
maven抱怨:
[错误]'artifactId'缺失。
除了从模板中即时生成POM文件之外,还有其他技巧可以用来完成此任务吗? [嗯,也许我可以使用maven资源过滤来做到这一点......]
答案 0 :(得分:5)
如果我做得对,你想重用蓝图maven应用程序并能够更改artifactId。
使用 Maven原型可以最好地完成此用例。见this to get you started。这是相当直接的,值得学习。您拥有正常的Maven项目,并在蓝图pom中添加${groupId}
等变量。然后,它们将被您在原型生成中给出的参数替换:
mvn archetype:generate \
-DarchetypeGroupId=<archetype-groupId> \
-DarchetypeArtifactId=<archetype-artifactId> \
-DarchetypeVersion=<archetype-version> \
-DgroupId=<my.groupid> \
-DartifactId=<my-artifactId>
GitHub上还有很多人创建的原型,你可以在Maven原型中For example了解更多关于结构化和过滤的内容。
或者,您可以尝试在不使用原型系统的情况下设置Maven过滤,但我没有相关经验。我不认为你可以在没有有效artifactId的情况下运行项目,有些代必须在此之前发生(比如从原型生成),但我不确定。
答案 1 :(得分:0)
你违背了一个maven原则,即pom应该代表一个自包含项目,产生一个稳定的工件(即避免参数化构建,不能轻易复制)。
如果这真的是你想要的,我会使用maven-install-plugin作为生命周期步骤(特别是安装文件)并参数化,而不是尝试参数化pom本身的artifactId。
答案 2 :(得分:0)
可以在运行时设置 artifactId(对于包含多个应用程序的单一存储库,我使用以下解决方案)。您的项目 pom.xml 应包括:
<project>
<artifactId>${artifactId}</artifactId>
...
<properties>
<artifactId>defaultArtifactId</artifactId>
</properties>
...
要在运行时设置 artifactId,请使用带有 mvn
选项的 -DartifactId=foo
命令。
示例:mvn verify -DartifactId=foo