过滤时指定文件不存在,如何使用默认过滤文件?
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>
其中 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 当前会抛出一个错误。
我宁愿不必为 environment
和 flavor
的每个可能组合创建虚拟文件。
谢谢。
仅将 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>
然后让加载的文件根据需要覆盖这些值。我相信这行得通。
您还可以查看属性插件的代码,以查看如果加载了指定相同 属性 的多个文件,哪些属性优先,然后将插件配置为按导致的顺序加载两个文件所需的行为。
在我的 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 当前会抛出一个错误。
我宁愿不必为 environment
和 flavor
的每个可能组合创建虚拟文件。
谢谢。
仅将 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>
然后让加载的文件根据需要覆盖这些值。我相信这行得通。
您还可以查看属性插件的代码,以查看如果加载了指定相同 属性 的多个文件,哪些属性优先,然后将插件配置为按导致的顺序加载两个文件所需的行为。