【问题标题】:Using maven profiles to control build execution使用 Maven 配置文件来控制构建执行
【发布时间】:2011-06-08 18:17:57
【问题描述】:

我需要修改大型项目的 maven 构建以跳过典型开发构建期间的某些步骤(即不构建 *-source.jar 文件)。我已经为 maven 搜索了“条件执行”,但没有找到任何东西。

开发配置文件听起来像是执行此操作的直观方式 - 但我不知道 maven 有多直观。配置文件的文档显示了如何为不同的配置文件设置不同的属性(即数据库连接参数)。我想我可以设置一个属性,然后测试该属性是否设置在 maven-source-plugin - executions - execution 标签中。

这是在 maven 中进行条件执行的正确方法吗?

在 Maven 中执行此操作的“正确”方法是什么?

【问题讨论】:

    标签: maven-2


    【解决方案1】:

    你的想法有点倒退:让配置文件启用行为,而不是禁用它。这正是配置文件最擅长的,并且正是您的情况:您只希望在某些情况下运行这些步骤。所以你可能会有类似的东西:

    <profile>
      <id>source-jars</id>
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-source-plugin</artifactId>
            ...
    

    事实上在maven-source-plugin usage page 上有一个类似的例子。当您需要生成工件时,请使用 mvn -P source-jars (或其他)。而已!如果您只需要在发布时执行此操作,release plugin 甚至提供了一种方法来定义配置文件以在发布插件配置中正确使用。

    【讨论】:

    • 我们的 pom 是在默认运行 maven-source-plugin 的地方编写的,所以我必须按照你的建议重新构建它们。
    • 在很多情况下,需要默认启用插件并使用配置文件禁用插件。我认为这个答案在不解决问题的情况下避免了问题。
    • @Mowgli 但是 maven 配置文件系统不太适合这种情况:只有“激活”机制,没有“停用”机制。一些插件通过构建自己的停用机制来处理这个问题(例如,skipTests for surefire 插件)。
    • 简而言之,这是 Maven 病。 “不,你实际上不想要一个有条件的构建,你真的想要这个颠倒的东西,需要你重新组装你的整个构建系统!看,这不是很棒吗?”请注意,没有什么反对答案的,我 +1 了。
    • @wberry 嗯,也许吧。正如我上面所说,maven 配置文件系统非常适合有条件的构建......通过有条件地启用东西。如果您想有条件地启用 禁用某些东西,我怀疑您的构建系统将需要随着时间的推移增加维护工作。这些天来,大多数反对 maven 的声音对我来说都是“我想创建自己的构建系统!”但感谢 +1 :)
    【解决方案2】:

    您可以通过向您的 POM 添加两个配置文件来实现默认启用 source-jars 插件的实际目标。 Maven profiles documentation 指出您可以将元素 &lt;activeByDefault&gt;true&lt;/activeByDefault&gt; 添加到 activation 部分并声明

    除非使用上述方法之一激活同一 POM 中的另一个配置文件,否则此配置文件将自动对所有构建生效

    所以,您可以添加两个配置文件,一个是activeByDefault,其中包含相关插件,另一个是可以通过任何标准方式(例如命令行中的-P)激活阻止默认配置文件运行。因此,pom.xml(或 Maven 设置或其他)中的 profiles 部分可能如下所示:

    <profile>
      <id>source-jars</id>
      <activation>
        <activeByDefault>true</activeByDefault>
      </activation>
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-source-plugin</artifactId>
            ...
          </plugin>
        </plugins>
      </build>
    </profile>
    <profile>
       <!-- active this profile to disable the source-jars plugin -->
       <id>no-optional-plugins</id>
    </profile>
    

    不幸的是,我看不出有一种方法可以使这种方法很好地扩展以控制多个插件 - 我认为您需要 O(n^2) 配置文件以用于 n 插件,但对于这种简单的情况,它应该可以正常工作。

    Maven ≥ 2.0.10 的另一个可能更简单的选择是只使用上面的 source-jars 配置文件(仍然是 activeByDefault),并在需要时通过在配置文件 ID 前加上 - 或 @ 来添加 manually deactivate the profile 987654335@ 在-P CLI 标志之后:

    $ mvn -P !source-jars
    

    这种方法在使用多个插件时没有相同的O(n^2) 问题,但它也不太灵活,因为无法通过系统属性、环境变量、JDK 版本等触发停用。

    【讨论】:

      猜你喜欢
      • 2012-11-03
      • 2016-10-13
      • 1970-01-01
      • 2012-05-17
      • 1970-01-01
      • 2012-08-06
      • 2018-10-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多