【问题标题】:When filtering, how can I use default filter file when specified file does not exist?过滤时,指定文件不存在时如何使用默认过滤文件?
【发布时间】:2018-01-03 17:09:32
【问题描述】:

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

谢谢。

【问题讨论】:

  • 您的问题只是maven-resources-plugin 对不存在的文件抛出错误吗?您是否需要像在您的问题中一样定义过滤?
  • 我愿意接受有关如何以不同方式进行过滤的建议。大约有 5 种环境和 2 种风格,它们的任何组合都可能需要覆盖 base.properties 中默认值的特定属性。我的根 POM 为 2 个属性设置了默认值,并且有许多子模块将使用我的问题中的 POM 设置。有些人可能需要为独特的环境风味组合定义道具,而其他人可能不需要。我只是不想为每个可能的组合在每个模块中创建虚拟文件。

标签: java maven maven-3 maven-profiles maven-resources-plugin


【解决方案1】:

只保留base.properties 到默认的&lt;build /&gt; 部分

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

这种方法的问题是主&lt;properties /&gt; 中的environmentflavor 不能有任何工作默认值。这似乎导致配置文件激活中的&lt;exists/&gt; 认为文件存在,即使从命令行调用时属性已更改。

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

【讨论】:

  • 似乎在 pluginManagement 中设置 base.properties 时,自定义道具没有正确覆盖 abase 道具,因此我从编辑中删除了该部分。
  • 这几乎解决了它。但不幸的是,根据 Maven 文档,&lt;exists&gt; 标记中唯一可用的属性是命令行提供的属性和${baseDir}。因此,POM 创建的 ${custom.properties} 属性将无法在那里使用。
  • @MattPowell 好吧,无论如何,无论从我的 eclipse 还是 mvn cmd-line 来看,它都对我有用……也许我误解了你的问题?您是否在 cmd-line 上尝试过,如果遇到什么错误?
  • 我从命令行尝试过,但它似乎忽略了我在根 POM 中分别默认为 testguestenvironmentflavor 属性。当我执行mvn clean install 时,它不会使用我创建的test-guest.properties 文件,而是使用base.properties 文件。同样,根据 Maven 的文档,您在 &lt;properties&gt; 部分中定义的属性不能在 &lt;exists&gt; 标记中使用。这似乎是一个可怕的限制,我不确定它是如何为你工作的。在此处查看 文件 项目符号:maven.apache.org/pom.html#Activation
  • @MattPowell 好的,对我来说它实际上也有效,因此如果我在&lt;properties /&gt; 中定义一些默认环境和风味,那么它需要任何 cmd-lin 参数也有效,因此文件必须存在。但是:没有默认道具它工作正常。因此,要么仅使用基本道具,要么使用有效的自定义道具文件覆盖基本道具。但是自定义道具应该有任何默认道具吗?那么它们是否应该成为可能被覆盖的基础道具?
【解决方案2】:

这有点未经测试,但是我已经将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 构建/过滤器部分中指定的系统属性、项目属性和过滤器属性文件

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

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

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

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

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

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

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

【讨论】:

  • 这正是我所需要的。我对它添加到 POM 的冗长感到失望,但事实就是如此。一个重要的注意事项:我必须确保 maven-resources-plugin 中的 copy-resources 目标的执行阶段与 properties-maven-plugin 的 read-project-properties 目标的阶段相同或晚。我假设这决定了过滤的顺序。
  • 是的,此插件执行加载的属性可用于之后发生的任何插件执行。很高兴它有帮助。
猜你喜欢
  • 2012-12-18
  • 1970-01-01
  • 2012-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-12
相关资源
最近更新 更多