Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 筛选时,如果指定的文件不存在,如何使用默认筛选文件?_Java_Maven_Maven 3_Maven Profiles_Maven Resources Plugin - Fatal编程技术网

Java 筛选时,如果指定的文件不存在,如何使用默认筛选文件?

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

在我的POM中,我有:

<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>