8

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

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

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

行家抱怨:

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

如果我<artifactId>在 POM 中省略并尝试在命令行中指定它

mvn -Dproject.artifactId=foo ...

行家抱怨:

[错误] 'artifactId' 丢失。

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

4

3 回答 3

6

如果我做对了,您想重用蓝图 Maven 应用程序并能够更改 artifactId。

这个用例最好用Maven 原型来完成。看到这个让你开始。它相当简单,值得学习。你有一个普通的 Maven 项目,你可以${groupId}在你的蓝图 pom.xml 中添加变量。然后它们被您在原型生成时给出的参数替换:

mvn archetype:generate                                  \
-DarchetypeGroupId=<archetype-groupId>                \
-DarchetypeArtifactId=<archetype-artifactId>          \
-DarchetypeVersion=<archetype-version>                \
-DgroupId=<my.groupid>                                \
-DartifactId=<my-artifactId>

GitHub 上还有很多人创建的原型,您可以在其中了解更多关于 Maven 原型中的结构化和过滤的信息,例如

或者,您可以尝试在不使用原型系统的情况下设置 Maven 过滤,但我没有这方面的经验。我认为没有有效的 artifactId 就无法运行项目,必须在此之前发生一些生成(例如从原型生成),但我不确定。

于 2012-06-08T20:05:13.920 回答
1

可以在运行时设置 artifactId(我将以下解决方案用于包含多个应用程序的单一存储库)。您的项目 pom.xml 应包括:

<project>
  <artifactId>${artifactId}</artifactId> 
  ...
  <properties>
    <artifactId>defaultArtifactId</artifactId>
  </properties>
  ... 

要在运行时设置 artifactId,请使用mvn带有-DartifactId=foo选项的命令。

例子 :mvn verify -DartifactId=foo

于 2021-05-18T09:49:45.743 回答
0

你违背了一个 maven 原则,即 pom 应该代表一个自包含项目,生成一个稳定的工件(即避免无法轻松复制的参数化构建)。

如果这确实是您想要的,我会使用 maven-install-plugin 作为生命周期步骤(特别是安装文件)并将其参数化,而不是尝试参数化 pom 本身的 artifactId。

于 2012-06-08T21:10:16.967 回答