如何通过Maven属性激活配置文件?

31

我正在尝试使用在pom.xml内定义的属性来激活一个maven配置文件:

<project>
  [...]
  <properties>
    <run.it>true</run.it>
  </properties>
  [...]
  <profiles>
    <profile>
      <activation>
        <property><name>run.it</name></property>
      </activation>
      [...]
    </profile>
  </profiles>
  [...]
</project>

显然它无法工作。但是,从命令行启用可以正常工作:

mvn -Drun.it

这是“按设计要求”吗?如果是的话,是否有可能有一种解决方法?


这里是一个解决方法:http://stackoverflow.com/a/14386303/290918 - kldavis4
我已经创建了一个功能请求,它将在 settings.xml 中添加 <activeProfiles> 标签到 pom.xml 中,以便您可以定义要激活的配置文件。https://issues.apache.org/jira/browse/MNG-6000 - flungo
7个回答

29

根据我现在理解的问题,编辑并完全重写如下:

请参考这个论坛帖子

配置文件激活基于系统属性。您不能根据POM中定义的属性来激活配置文件,也不能基于构建计划启动执行后定义的系统属性来激活配置文件。


请您再次查看问题好吗?我正在尝试使用在pom.xml中定义的属性来激活配置文件,而不是在命令行中定义。 - yegor256
确实,我错过了这个,像M. Jessup所说的那样看activeByDefault。 - moritz
谢谢,现在我明白这是“按设计要求”的。你能提供一个解决方法吗? - yegor256

6
使用这样的激活方式如何?
    <profile>
        <id>gwt</id>
        <activation>
            <file>
                <exists>uses-gwt.marker</exists>
            </file>
        </activation>

将文件'uses-gwt.marker'添加到源代码控制中,就在pom.xml旁边。这样做可以让所有开发人员处于同一状态,并允许面向方面的pom。我们正在父pom中使用此技术,并将标记文件放在子svn中。虽然不是理想的方法,但它可行。


5

在最近的Maven版本(3.5+?)中,您可以在项目的根目录下创建一个.mvn文件夹和一个文件.mvn/maven.config。在这个文件中,您可以像在命令行中一样激活配置文件或设置属性。

-Dactivate.myprofile=true

-Pmyprofile

希望 Maven5 能够支持 Mixins,这将使构建设置更具可重用性。


谢谢,这让我的一天都变得美好了!我需要能够配置一个子项目,以便从父POM启用一个配置文件,而不需要在命令行中添加额外的参数。 - Paulo

2

如前面的回答所述,个人资料激活仅适用于系统属性。

但是,通过一些创意,您可以使用 pom 属性实现类似的结果(有条件的插件执行)。为了实现这一点,请使用您想要有条件执行的插件的 phase 标签:

<project>

    ...

    <properties>
        <run.it>none</run.it>
        <!-- <run.it>compile</run.it> -->
        <!-- <run.it>package</run.it> -->
    </properties>

    ...

    <build>

        ...

        <plugins>
            <plugin>
            <artifactId>your-plugin</artifactId>
            <executions>
                <execution>
                    <phase>${run.it}</phase>
                </execution>
            </executions>

            </plugin>
        </plugins>

        ...

    </build>

</project>

唯一的区别是您必须使用阶段名称而不是true/false。但是,您可以自由更改属性或覆盖它作为属性。

2
  • 在项目根目录下添加一个目录".mvn"。
  • 添加一个文件".mvn/jvm.config"。
  • 将"-Drun.it=false"插入到jvm.config中。

现在应该可以工作了。您可以在pom.xml中覆盖"run.it"属性,它将被选中以激活配置文件。

我不确定这是一个错误还是一个功能。

注:Original Answer翻译成“最初的回答”

-2
正如Moritz Heuser所解释的那样,配置激活基于系统属性。但是,你可以尝试像这样的东西:
<project>
  ...
  <properties>
    <run.it>true</run.it>
  </properties>
  ...
  <profiles>
    <profile>
      <activation>
        <activeByDefault>${run.it}</activeByDefault>
      </activation>
      ...
    </profile>
  </profiles>
  ...
</project>

这个想法是在<properties>中定义activeByDefault标志。


1
我不明白这能怎么帮助。在pom中定义run.it对于配置文件生效来说太晚了。参考https://jira.codehaus.org/browse/MNG-5235。 - Jeanne Boyarsky
我同意。这是一个经典的鸡生蛋问题:由于其本质,配置文件可能会定义其他属性。它们是否应该递归地激活其他配置文件?如果配置文件已经被激活,但新的属性定义指示将其停用怎么办? - dma_k
这个不起作用的原因和OP的例子不起作用的原因相同(正如@moritz所解释的那样)。 - flungo

-3

我认为你的问题与这个类似。

基于多个属性激活Maven配置文件

正如提到的那样,你可以根据需要激活配置文件并设置各种属性,然后使用命令mvn -Prun-it将属性设置为true。

<project>
  [...]

  [...]
  <profiles>
    <profile>
    <id>don't-run</id>
<properties>
    <run.it>false</run.it>
  </properties>


      [...]
    </profile>


    <profile>
    <id>run-it</id>
<properties>
    <run.it>true</run.it>
  </properties>

      [...]
    </profile>


  </profiles>
  [...]
</project>

1
请查看我的问题。我希望从 pom.xml 中控制配置文件的开/关,而不是通过命令行或 settings.xml - yegor256
但这对你有什么影响呢?你能详细说明一下吗? 另外,正如Moritz所提到的,激活是基于系统属性而不是命令行完成的。请参阅此引用http://maven.apache.org/guides/introduction/introduction-to-profiles.html - Prabhjot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接