【问题标题】:can I specify a maven project.artifactId at runtime?我可以在运行时指定一个 Maven project.artifactId 吗?
【发布时间】:2012-06-12 20:52:27
【问题描述】:

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

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

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

maven 抱怨:

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

如果我在 POM 中省略 &lt;artifactId&gt; 并尝试在命令行中指定它

mvn -Dproject.artifactId=foo ...

maven 抱怨:

[错误] 'artifactId' 缺失。

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

【问题讨论】:

    标签: maven maven-3


    【解决方案1】:

    如果我猜对了,您想重用一个蓝图 maven 应用程序并能够更改 artifactId。

    这个用例最好用 Maven 原型 来完成。见this to get you started。它相当简单,值得学习。你有一个普通的 Maven 项目,并在你的蓝图 pom.xml 中添加像${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 就无法运行项目,必须在此之前发生一些生成(例如从原型生成),但我不确定。

    【讨论】:

    • 谢谢,这看起来很合适。似乎每个 Maven 问题都有“有一个插件”形式的答案:-)。我怀疑我使用 maven 过滤的想法最终会成为一种穷人的原型,所以使用经过验证的东西而不是重新发明轮子是有意义的。
    • 我同意原型是要走的路,但它并不能真正回答这个问题。即使这是一个完全不好的做法,是否可以在运行时设置 artifactId?
    【解决方案2】:

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

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

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

    例如:mvn verify -DartifactId=foo

    【讨论】:

    • 此方法有效,但会从 Maven 生成警告:“强烈建议修复这些问题,因为它们会威胁您构建的稳定性。因此,未来的 Maven 版本可能不再支持构建此类格式错误的项目。”
    • 您是对的,但是如果您知道自己在做什么,那么此解决方案不会造成任何问题。我已经在生产环境中使用它几年了,没有任何问题。
    【解决方案3】:

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

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

    【讨论】:

    • 感谢您的反馈。我的构建已经有些参数化了(考虑到它对从命令行、环境等获取属性的内置支持,maven 似乎并没有过多地阻止这一点)。但不可否认,我是一名行家菜鸟。我需要做的是建立一个“工厂”项目并构建它的许多变体,这些变体仅略有不同,产生不同的工件。我来看看 install-file。
    猜你喜欢
    • 1970-01-01
    • 2014-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多