Java 筛选时,如果指定的文件不存在,如何使用默认筛选文件?
在我的POM中,我有:Java 筛选时,如果指定的文件不存在,如何使用默认筛选文件?,java,maven,maven-3,maven-profiles,maven-resources-plugin,Java,Maven,Maven 3,Maven Profiles,Maven Resources Plugin,在我的POM中,我有: <properties> <custom.properties> ${basedir}/src/main/props/${environment}-${flavor}.properties </custom.properties> </properties> 如果由${environment}-${flavor}.properties创建的文件不存在,我可以定义回退,还是完全忽略它?Mave
<properties>
<custom.properties>
${basedir}/src/main/props/${environment}-${flavor}.properties
</custom.properties>
</properties>
如果由${environment}-${flavor}.properties
创建的文件不存在,我可以定义回退,还是完全忽略它?Maven当前将抛出一个错误
我不想为environment
和flavor
的每个可能组合创建一个虚拟文件
谢谢。只将
base.properties
保留在默认
部分
<build>
<filters>
<filter>src/main/props/base.properties</filter>
</filters>
</build>
src/main/props/base.properties
将自定义属性文件添加到配置文件中的过滤器,该配置文件由该自定义属性文件的存在激活,如
<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>
src/main/props/${custom.properties}
src/main/props/${custom.properties}
这种方法的问题是在main
中不能有任何environment&flavor的工作默认值。这似乎会导致配置文件激活中的
认为文件存在,即使从命令行调用时属性发生了更改
对于这个问题,如果可能的话,我建议将所有默认数据都放在基本属性中。这有点未经测试,但是我已经将用于类似的用例,其中我希望加载一个可能存在或不存在的文件。可能不是一个完全有效的方法 回答,但我希望它能给你一些想法
<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>
例如-加载的项目属性或过滤器属性哪个优先?我很想试试这样的东西:
<properties>
<prop1>defaultValue</prop1>
<prop2>anotherDefaultValue</prop2>
</properties>
默认值
另一个默认值
然后让加载的文件根据需要覆盖这些值。我相信这是可行的
您还可以查看properties插件的代码,查看在加载多个指定相同属性的文件时,哪些属性优先,然后将插件配置为按所需行为的顺序加载这两个文件。您的问题只是
maven resources plugin
对不存在的文件抛出错误吗?你是否需要像你的问题中那样定义过滤?我愿意接受关于如何以不同方式进行过滤的建议。大约有5种环境和2种风格,它们的任何组合都可能需要覆盖base.properties
中默认值的特定属性。我的根POM为2个属性设置默认值,并且有许多子模块将使用我的问题中的POM设置。一些人可能需要为独特的环境风味组合定义道具,而其他人可能不需要。我只是不想在每个模块中为每个可能的组合创建虚拟文件。似乎当在pluginManagement中设置base.properties时,自定义道具无法正确覆盖abase道具,因此我从编辑中删除了该部分。这几乎解决了问题。但不幸的是,根据Maven文档,
标记中唯一可用的属性是在命令行和${baseDir}
中提供的属性。所以POM创建的${custom.properties}
属性将无法在那里使用。@MattPowell嗯,不管怎样,它在我的eclipse和mvn cmd行中对我都很好地工作。。。也许我误解了你的问题?您是否在cmd行上尝试过它,如果出现了什么错误?我在命令行中尝试过,但它似乎忽略了我在根POM中分别默认为test
和guest
的environment
和flavor
属性。当我执行mvn clean install
时,它不使用我创建的test guest.properties
文件,而是使用base.properties
文件。同样,根据Maven的文档,在
部分中定义的属性不能用于
标记。这似乎是一个可怕的限制,我不知道它如何为你工作。请参阅此处的文件项目符号:@MattPowell Ok,对我来说,它实际上也可以工作,因此如果我在
中定义了一些默认的env&flavor,那么它要求任何cmd-lin参数也有效,所以文件必须存在。但是:如果没有默认道具,它可以正常工作。因此,要么只使用基本道具,要么用有效的自定义道具文件覆盖基本道具。但是定制道具是否应该有默认道具?那么它们应该是基础道具吗?也许会被覆盖?这正是我所需要的。我对它给POM增加的冗长感到失望,但事实就是这样。一个重要的注意事项:我必须确保maven资源插件中复制资源目标的执行阶段与properties maven插件的读取项目属性目标的执行阶段相同或更晚。我假设这决定了过滤的顺序。是的,这个插件执行加载的属性可以用于之后发生的任何插件执行。很高兴这有帮助。
<filters>
<filter>${basedir}/src/main/props/base.properties</filter>
</filters>
<properties>
<prop1>defaultValue</prop1>
<prop2>anotherDefaultValue</prop2>
</properties>