多个条件下的 Maven 配置文件激活

Posted

技术标签:

【中文标题】多个条件下的 Maven 配置文件激活【英文标题】:Maven profile activation with multiple conditions 【发布时间】:2011-06-05 11:23:42 【问题描述】:

我正在努力在一个项目中安装 rpm-maven 插件。在我们的暂存和生产环境中,构建发生在 Red Hat 机器上,但我们有几个用于开发和测试的 Windows 机器,所以我希望 RPM 构建过程成为配置文件的一部分,该配置文件仅在具有rpmbuild 已安装。

这是我第一次尝试激活条件:

<activation>
  <os>
    <family>unix</family>
  </os> 
  <file>
    <exists>/usr/bin/rpmbuild</exists>
  </file>
</activation>

我最初的测试只涉及在 Windows 机器上构建和在 CentOS 机器上构建,两者都给了我预期的结果。后来,该构建在没有可用 rpmbuild 的 Linux 机器上中断。似乎不支持有两个这样的条件。是这样吗?我意识到我可能可以摆脱 &lt;os/&gt; 元素并获得我想要的结果,但是为了将来参考,有没有更好的方法来创建具有多个激活条件的配置文件?

【问题讨论】:

【参考方案1】:

Maven &lt;activation&gt; 块是OR 的列表——一旦满足第一个条件,配置文件就会被激活。因此,至少在此错误报告得到修复之前,您的问题不太可能有解决方案https://issues.apache.org/jira/browse/MNG-4565


更新:

现在已在 3.2.2 中修复 – sfussenegger(通过评论)

【讨论】:

我担心这就是答案。谢谢! :) @bhinks 但它没有意义。可悲的是,Maven:权威指南说它的行为应该是AND——但事实并非如此。 现在在 3.2.2 中修复了 因为我在谷歌上所做的每一次搜索都会弹出这个 SO。如果你想做一个 OR 你怎么做?例如,如果他们使用命令 -Ddeep-clean 或 -Dlight-clean,我想激活。从 3.2.2 开始,这不再可能了吗? @dtracers 好问题!在这种情况下,我应该如何配置“OR”逻辑。 Maven 改变了处理属性的逻辑,现在不可能做“OR”。解决一个问题 - 创建另一个问题?【参考方案2】:

最糟糕的是,您可以混合不同类型的条件,例如文件、jdk 和属性,如 http://www.sonatype.com/books/mvnref-book/reference/profiles-sect-activation.html 所述,但您甚至不能放置两个相同类型的条件,例如两个属性

<activation>
    <property>
           <name>integrationTest</name>
    </property>
    <property>
        <name>packaging</name>
        <value>swf</value>
    </property>
 </activation>

这不起作用,因为只允许使用一个 &lt;property&gt; 标记。 关联 JIRA:https://issues.apache.org/jira/browse/MNG-3328

并且上面描述的错误仍然存​​在...... 5 年它只是一个耻辱!

【讨论】:

7 年了!刚投了票。不要认为它会改变什么。 9 年而且还在继续。 我基本上已经放弃了配置文件激活逻辑,只是制作了一个 shell 脚本来确定要激活的配置文件,然后使用-P"someProfile,!someOtherProfile" 将它们传递给 maven,这使得属性和环境变量检测完全毫无价值。 【参考方案3】:

刚刚被我修好了:)

从 3.2.2 开始,它将按预期工作:多个条件将被与

参考 - https://github.com/apache/maven/commits/master,通过 MNG-4565 搜索

提交网址 - https://github.com/apache/maven/commit/c6529932f9e3efdfc86ed73f59a307a8f8b6ea5f

【讨论】:

希望 OR 或 AND 都是选项。不幸的是 OR 刚刚被 AND 删除。 @mdo123,这可能就是应该这样做的,是的。以某种方式将其贡献给 maven 应该是个好主意 您能否提供实际的提交 URL(基于提交哈希)?现在 3.5 年后,这将需要大量的提交!【参考方案4】:

我认为这就是这些 Maven 扩展的作用:

Maven EL Profile Activator Extension

这个很简单,看看source

Maven Profile Activation Extension

这个有more options for the actual activation expression,包括Scala。

然而,由于它是一个扩展(不是插件),每个使用它的项目都必须注册该扩展。并且存在项目作者放弃它的风险,并且在未来的 maven 版本中将无法使用。

【讨论】:

以上是关于多个条件下的 Maven 配置文件激活的主要内容,如果未能解决你的问题,请参考以下文章

idea pom profiles 配置的使用

在eclipse激活maven profile配置

Maven:如果配置文件 B 未激活,则仅激活配置文件 A?

除了默认配置文件外,Maven 配置文件未激活

Maven:如何根据子模块是不是包含文件来激活配置文件?

Maven:配置文件激活取决于 localRepository 属性?