代码之家  ›  专栏  ›  技术社区  ›  Matt Anxo P

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

  •  1
  • Matt Anxo P  · 技术社区  · 6 年前

    在我的POM中,我有:

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

    哪里 environment flavor 可以在命令行中提供:

    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当前将抛出一个错误。

    我不想为所有可能的 环境 风味 .

    谢谢

    2 回复  |  直到 6 年前
        1
  •  1
  •   pirho    6 年前

    只保留 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>
    

    这种方法的问题是不能有任何工作默认值 环境 & 风味 总的来说 <properties /> . 似乎是因为 <exists/> 在概要文件激活中,即使属性在从命令行调用时发生更改,也认为文件存在。

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

        2
  •  0
  •   user944849    6 年前

    这有点未经测试,但是我使用了 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>
    

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

    resources 插件执行,它使用

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

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

    上述内容涵盖了“忽略”情况。如果你想提供一个后备方案,它可能会变得有点棘手。我不确定属性插件如何与

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

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

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

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

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