15

我有一个 Maven 项目,它定义了两个单独的配置文件,developer并且release(肯定你明白了,here)。我希望随时激活这两个配置文件之一,但绝不要同时激活这两个配置文件。如果两者都以某种方式被激活,则此构建没有意义并且应该失败。如果两者都没有被激活,那么这个构建也没有任何意义并且应该失败。

我确信我可以编写一些自定义插件代码来实现这一点,我很可能最终会这样做,但我有兴趣使用 POM 配置来实现这一点(可能使用来自 Maven Central 的现有插件)。

应该可以使用-P( --activate-profiles) 激活插件,因此<activation>通过属性将不是一个有效的解决方案。使用的解决方案activeByDefault也无效,因为activeByDefault通常被称为陷阱,不可靠(实际上我们可能会激活其他配置文件,从而导致activateByDefault无法使用)。

非常感谢您的建议。

4

5 回答 5

5

我有类似的需求(即两个配置文件的互斥性)并通过将两个目标配置文件视为不应在命令行上指定的内部配置文件来解决它:相反,可以指定或不指定控制系统属性. 例如,假设默认情况下您希望“dev”配置文件处于活动状态。然后我们可以根据选项是否指定如下来激活/停用相关的内部配置文件:-Drelease

<!-- Internal profile: FOR INTERNAL USE ONLY - active if -Drelease is *not* specified. -->
<profile>
  <id>internal-dev</id>
  <activation>
    <!-- Activation via *absence* of a system property to ensure mutual exclusivity
         of this profile with internal-release -->
    <property>
      <name>!release</name>
    </property>
  </activation>
  ...
</profile>

<!-- Internal profile: FOR INTERNAL USE ONLY - active if -Drelease *is* specified. -->
<profile>
  <id>internal-release</id>
  <activation>
    <!-- Activation via *presence* of a system property to ensure mutual exclusivity
         of this profile with internal-dev -->
    <property>
      <name>release</name>
    </property>
  </activation>
  ...
</profile>
于 2016-01-12T12:41:42.663 回答
4

这仍然可以使用Maven Enforcer 插件完成

<requireActiveProfile>...<all>false</all>...尽管正如@khmarbaise 所报告的那样,互斥是错误的,但仍然有一个<evaluateBeanshell/>内置规则可以让人们为所欲为。

我专门为这种情况写了一个:两个配置文件的异或。我希望它有所帮助。

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-enforcer-plugin</artifactId>
                <version>1.4.1</version>
                <executions>
                    <execution>
                        <id>enforce-PROFILE_ONE-XOR-PROFILE_TWO-is-active</id>
                        <goals>
                            <goal>enforce</goal>
                        </goals>
                        <configuration>
                            <rules>
                                <requireActiveProfile>
                                    <profiles>PROFILE_ONE,PROFILE_TWO</profiles>
                                    <all>false</all>
                                </requireActiveProfile>
                                <evaluateBeanshell>
                                    <condition><![CDATA[
                                        // ensure PROFILE_ONE XOR PROFILE_TWO
                                        print("Checking if only one of PROFILE_ONE and PROFILE_TWO profiles is active ...");
                                        boolean profile1 = false, profile2 = false;
                                        for(s: "${project.activeProfiles}".replaceAll("\\[?\\s?Profile \\{id: (?<profile>\\w+), source: \\w+\\}\\]?", "${profile}").split(",")) {
                                            if("PROFILE_ONE".equalsIgnoreCase(s)){ profile1 = true;}
                                            if("PROFILE_TWO".equalsIgnoreCase(s)){ profile2 = true;}
                                        }
                                        print("PROFILE_ONE XOR PROFILE_TWO: "+(profile1 != profile2));
                                        return profile1 != profile2;
                                    ]]></condition>
                                </evaluateBeanshell>
                            </rules>
                            <failFast>true</failFast>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

棘手的部分是循环访问活动配置文件,我已经在这里完成了。如果需要,您可以将其扩展到两个以上的配置文件。但是您必须编写长 xor 表达式,因为 beanshell 没有实现 Java xor ^运算符。

于 2017-08-16T17:00:45.443 回答
3

我总是发出这样的构建命令:

mvn package -P-dev,prod

它明确禁用开发配置文件并启用生产配置文件。据我所知,如果另一个构建配置文件处于活动状态(这有点不幸),您不能有条件地启用一个构建配置文件,因此您无法确保配置文件是互斥的。

于 2014-07-20T23:08:02.640 回答
3

此类问题的最简单解决方案是使用maven-enforcer-plugin,它恰好具有这样的规则来强制激活两个或多个配置文件中的至少一个。

不幸的是 requireActiveProfile 目前有一个错误。但目前正在为新版本做准备,以解决这个问题。

更新上述错误已在 1.4 版(2015 年发布)中修复。

于 2014-07-21T09:59:07.157 回答
1

我需要这个规则的稍微高级一点的版本。最后是我自己写的。我已经向他们提交了一个补丁,其中包括以下两条规则:

  • 指定一组互斥配置文件的能力(p1,p2:p1,p3 意味着 p1 不能与 p2 或 p3 一起活动)。

  • 禁止个人资料的能力(与 相反requireActiveProfile)。p1, p2 意味着 p1 和 p2 都不能用于此构建。

这两个规则都支持通配符并考虑继承的配置文件。这些是建立在规则的 v1.4 之上的。

http://jira.codehaus.org/browse/MENFORCER-225

于 2015-02-21T18:46:44.197 回答