我可以在运行时指定maven project.artifactId吗?

时间:2012-06-08 19:21:38

标签: maven maven-3

我有一个maven POM,我想将其用作模板,根据我传递给它的参数产生具有不同名称的工件。但我无法弄清楚如何在运行时指定artifactId。

如果我像这样参数化<artifactId>元素:

<artifact>foo-${bar}</artifact>

maven抱怨:

[警告]'artifactId'包含一个表达式,但应该是一个常量。

如果我在POM中遗漏<artifactId>并尝试使用

在命令行中指定它
mvn -Dproject.artifactId=foo ...

maven抱怨:

[错误]'artifactId'缺失。

除了从模板中即时生成POM文件之外,还有其他技巧可以用来完成此任务吗? [嗯,也许我可以使用maven资源过滤来做到这一点......]

3 个答案:

答案 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