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

When filtering, how can I use default filter file when specified file does not exist?

在我的 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 的每个可能组合创建虚拟文件。

谢谢。

仅将 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 & flavor 在 main <properties /> 中不能有任何工作默认值.这似乎导致 <exists/> 在配置文件激活中认为文件存在,即使从命令行调用时属性已更改。

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

这有点未经测试,但是我已经将 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>

"quiet" 部分告诉插件如果文件不存在则构建不会失败;它只会记录一条消息并继续。如果文件存在,属性将作为项目属性加载。

resources 插件执行时,它使用

进行过滤

System properties, project properties, and filter properties files specified in the POM build/filters section

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

以上涵盖了 'ignore' 的情况。如果你想提供后备,它可能会变得有点棘手。我不确定属性插件如何与

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

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

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

然后让加载的文件根据需要覆盖这些值。我相信这行得通。

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