默认情况下,Maven是否可以同时激活多个配置文件?

时间:2018-04-24 14:34:20

标签: java maven

我在Maven中设置了以下配置文件:

<profiles>
    <profile>
        <id>prod</id>
        <properties>
            <environment>prod</environment>
            <serverAddress>https://example.com/v1</serverAddress>
            <pubNubSubscribeKey>blah-blah</pubNubSubscribeKey>
            <sentryDsn>https://username:password@sentry.io/id</sentryDsn>
        </properties>
    </profile>
    <profile>
        <id>dev</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <environment>dev</environment>
            <serverAddress>http://localhost:8080/v1</serverAddress>
            <pubNubSubscribeKey>blah blah</pubNubSubscribeKey>
            <sentryDsn/>
        </properties>
    </profile>
    <profile>
        <id>win32</id>
        <activation>
            <os>
                <family>Windows</family>
                <arch>x86</arch>
            </os>
        </activation>
    </profile>
    <profile>
        <id>win64</id>
        <activation>
            <os>
                <family>Windows</family>
                <arch>amd64</arch>
            </os>
        </activation>
    </profile>
</profiles>

有四个配置文件,但两个架构中的一个和两个prod / dev配置文件中的一个应同时处于活动状态。默认情况下,dev配置文件已配置为处于活动状态,当win64因激活条件而处于活动状态时,dev配置文件将变为非活动状态。

除非dev个人资料变为有效,否则有办法让prod个人资料保持有效状态吗?

本质上,我想要一个这样的逻辑:

------------------------
|      | win32 | win64 |
------------------------
| dev  |       |   X   |
------------------------
| prod |       |       |
------------------------

application.properties中的src/main/resources模板看起来像这样:

version=${version}
environment=${environment}
server.address=${serverAddress}
pubnub.keys.subscribe=${pubNubSubscribeKey}
sentry.dsn=${sentryDsn}

然后使用过滤器:

<resources>
    <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
        <includes>
            <include>application.properties</include>
        </includes>
    </resource>
    <resource>
        <directory>src/main/resources</directory>
    </resource>
</resources>

我使用proddev的正确值填充它。如果没有发生,应用程序无法启动。我无法在我的计算机上setting.xmldev的环境变量中继,因为这意味着它不会在其他计算机上处​​于活动状态,而且会非常混乱。

2 个答案:

答案 0 :(得分:2)

如果未激活其他个人资料,则activeByDefault是一个后备广告。

要激活多个配置文件,您可以将其添加到activeProfiles的{​​{1}}部分 - 哪种对本地开发有意义,以便将配置文件设置为settings.xml或到其他机器的dev

您可以使用prod选项等CLI参数或通过系统属性激活和-P来触发它。 system属性选项还有一个负版本,如果属性未设置或没有特定值,则会触发配置文件。这可以用于实现任一或者切换,如果未设置属性,则触发默认值:

-Dpropname=value

使用

取消激活dev / activate prod
<profile>
    <id>dev</id>
    <activation>
       <property>
           <name>!prod</name> <!-- deactivated if system property prod is set, otherwise activated -->
       </property>
    </activation>
</profile>
<profile>
    <id>prod</id>
    <activation>
       <property>
           <name>prod</name> 
       </property>
    </activation>
</profile>

除了这些选项之外,似乎没有直接的方式无条件地激活配置文件与有条件触发的另一个配置文件。

但是有一个小的解决方法可以有条件地激活配置文件,条件始终为真,那就是使用文件激活和始终存在的文件,如mvn ... -Dprod=true 或 - 如果您的poms位于在不同的位置,pom.xml也适用

.

答案 1 :(得分:1)

还可以根据系统属性的值激活配置文件。 你可以有像

这样的东西
<profiles>
  <profile>
    <id>win32</id>
    <activation>
      <property>
        <name>arch</name>
        <value>win32</value>
      </property>
    </activation>
    ...
  </profile>
  <profile>
    <id>dev</id>
    <activation>
      <property>
        <name>environment</name>
        <value>dev</value>
      </property>
    </activation>
    ...
  </profile>
  <profile>
    <id>win64</id>
    <activation>
      <property>
        <name>arch</name>
        <value>win64</value>
      </property>
    </activation>
    ...
  </profile>
  <profile>
    <id>prod</id>
    <activation>
      <property>
        <name>environment</name>
        <value>prod</value>
      </property>
    </activation>
    ...
  </profile>
</profiles>

现在,如果您设置两个系统属性,如arch = win64和environment = dev,那么您应该有2个活动的配置文件