过滤时,如果指定的文件不存在,如何使用默认过滤器文件?

时间:2018-01-03 17:09:33

标签: java maven maven-3 maven-profiles maven-resources-plugin

在我的POM中,我有:

<properties>
    <custom.properties>
        ${basedir}/src/main/props/${environment}-${flavor}.properties
    </custom.properties>
</properties>

可以在命令行中提供environmentflavor

mvn clean install -Denvironment=test -Dflavor=guest

在maven-resources插件定义中,我有:

<filters>
    <filter>${basedir}/src/main/props/base.properties</filter>
    <filter>${custom.properties}</filter>
</filters>

如果${environment}-${flavor}.properties创建的文件不存在,我可以定义回退,还是完全忽略它? Maven目前会抛出一个错误。

我宁愿不必为environmentflavor的每个可能组合创建一个虚拟文件。

感谢。

2 个答案:

答案 0 :(得分:0)

仅将base.properties留在默认<build />部分

<build>
   <filters>
      <filter>src/main/props/base.properties</filter>            
   </filters>
</build>

将自定义属性文件添加到由此自定义属性文件存在而激活的配置文件中的过滤器,例如

<profiles>
   <profile>
      <activation>
         <file><exists>src/main/props/${custom.properties}</exists></file>
      </activation>
      <build>
         <filters>
            <filter>src/main/props/${custom.properties}</filter>
         </filters>         
      </build>
   </profile>
</profiles>

此方法的问题在于 environment &amp;;主<properties />中的 flavor 。它似乎导致配置文件激活<exists/>认为文件存在,即使从命令行调用属性也会更改。

对于这个问题,我建议尽可能在基本属性中包含所有默认数据。

答案 1 :(得分:0)

这有些未经测试,但我已将properties-maven-plugin用于类似的用例,我想加载一个可能存在或可能不存在的文件。可能不是一个完全工作 回答,但我希望它能给你一些想法。

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>properties-maven-plugin</artifactId>
  <version>1.0.0</version>
  <executions>
    <execution>
      <id>load-filters</id>
      <phase>initialize</phase>
      <goals>
        <goal>read-project-properties</goal>
      </goals>
      <configuration>
        <files>
          <file>${basedir}/src/main/props/${environment}-${flavor}.properties</file>
        </files>
        <quiet>true</quiet>  <!-- important! -->
      </configuration>
    </execution>
  </executions>
</plugin>

&#34;安静&#34;如果文件不存在,part告诉插件不要使构建失败;它只会记录一条消息并继续前进。如果文件存在,则属性将作为项目属性加载。

resources插件执行时,它会使用

进行过滤
  

POM构建/过滤器部分中指定的系统属性,项目属性和过滤器属性文件

因此属性将应用于资源而无需进一步配置。您不需要在资源插件中指定<filters>

以上涵盖了“忽略”&#39;案件。如果你想提供一个后备,它可能会有点棘手。我不确定属性插件如何与

交互
<filters>
  <filter>${basedir}/src/main/props/base.properties</filter>
</filters>

例如 - 哪个优先,加载的项目属性或过滤器属性?我很想尝试这样的事情:

<properties>
    <prop1>defaultValue</prop1>
    <prop2>anotherDefaultValue</prop2>
</properties>

然后让加载的文件根据需要覆盖值。我相信这很有效。

如果加载了指定相同属性的多个文件,您还可以查看属性插件的代码以查看哪些属性优先,然后配置插件以按顺序加载这两个文件,从而产生所需的行为。