2

我想在我的src/main/liberty/config/server.xml中使用maven 过滤,而不会破坏maven-liberty-plugin中对liberty:dev的使用。我最大的问题似乎是liberty-maven-plugin不支持过滤。

例如,考虑这个webApplication元素:

<webApplication id="${project.artifactId}" contextRoot="/"
    location="${server.config.dir}/apps/${project.artifactId}.war">
</webApplication>

在没有任何其他指导的情况下,这个文件被复制到target/liberty/wlp/usr/servers/defaultServer/server.xml没有任何过滤,所以运行时找不到 WAR 文件。

假设我使用maven-resources-plugin手动打开过滤:

<plugin>
  <artifactId>maven-resources-plugin</artifactId>
  <version>3.2.0</version>
  <executions>
    <execution>
      <id>01-liberty-config</id>
      <phase>package</phase>
      <goals>
        <goal>copy-resources</goal>
      </goals>
      <configuration>
        <outputDirectory>${project.build.directory}/liberty/wlp/usr/servers/defaultServer</outputDirectory>
        <resources>          
          <resource>
            <directory>src/main/liberty/config</directory>
            <filtering>true</filtering>
          </resource>
        </resources>              
      </configuration>            
    </execution>
  </executions>
</plugin>

现在过滤工作并且文件位于正确的位置。不幸的是,我观察到当我运行mvn liberty:dev时,它会被来自src/main/liberty/config/server.xml的未过滤server.xml覆盖。

是否可以在server.xml中使用 Maven 过滤?

4

1 回答 1

1

背景

今天基本上不支持这一点。liberty-maven-plugin不允许您这样做,并且管理和控制 Liberty 配置的方式也liberty-maven-plugin无法让您轻松使用标准 Maven 插件,例如“依赖”或“资源”插件。

由于这个问题是在我分享一个您可能会觉得有用的示例方法之前提出的,尽管它有一种解决方法的感觉。

解决方案概述

基本上,虽然我们不能通过过滤器替换到 server.xml 本身,但我们可以替换到 server.xml 包含的配置片段,并使用资源插件将其复制到位,而不是liberty-maven-plugin.

解决方案详情

假设我想${tidal.url}在 Liberty 服务器配置中使用“过滤器”样式的 Maven 变量替换 URL。

1. src/main/filtered-config/environment.xml

首先定义一个配置片段,我们将对其应用过滤器。

<server description="environment">
    <!-- Expect to come from filter -->
    <variable name="tidal.url" value="${tidal.url}"/>
</server>

2. pom.xml

配置resources:copy-resources将上面的“environment.xml”片段复制到共享配置目录位置target/liberty/wlp/usr/shared/config的执行,并启用过滤:

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>3.2.0</version>
                <executions>
                    <execution>
                        <id>default-cli</id>
                        <phase>none</phase>
                        <goals>
                            <goal>copy-resources</goal>
                        </goals>
                        <configuration>
                            <overwrite>true</overwrite>
                            <!-- This location can persist across a server recreate, where the refresh can annoyingly wipe out your earlier copy -->
                            <outputDirectory>target/liberty/wlp/usr/shared/config</outputDirectory>
                            <resources>
                                <resource>
                                    <directory>src/main/filtered-config</directory>
                                    <filtering>true</filtering>
                                </resource>
                            </resources>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

3. server.xml

在您的主 server.xml 配置文件中,添加<include>您通过“复制资源”复制到共享配置目录中的配置片段。

还展示了我们最终如何使用或“使用”通过过滤器应用的值<jndiEntry>,在这个例子中:

 <include location="${shared.config.dir}/environment.xml"/>

 <!-- This is how I'm ultimately going to "consume" the filtered value -->
 <jndiEntry jndiName="url/tidal-api" value="${tidal.url}" id="TidalJNDI" />

4. 运行开发模式,首先调用额外的目标,然后以某种方式激活你的过滤器

例如:

mvn resources:copy-resources liberty:dev

至于激活您的过滤器,也许您在构建中定义了一个过滤器(通过 build.filters.filter 就像在我的示例存储库中一样),或者您可能只是在使用-Dtidal.url=<value>.

跟进

除了复杂之外,上述的一个重要限制是您只有一次机会应用过滤器。您不能在单个开发模式“会话”中遍历不同的值。

随时就该问题提供反馈: https ://github.com/OpenLiberty/ci.maven/issues/587

我还要注意,我们正在考虑增强对一般资源和 Web 资源的过滤器支持。

再想一想

如果您只需要一种动态方式来在构建时选择一组 Liberty 配置值与另一组,那么您不一定需要使用过滤。

您可以改为使用将 Maven 属性映射到 Liberty 配置的支持。

例如对于这个例子,你可以有一个配置文件定义

<properties>
    <liberty.var.tidal.url>URL1</liberty.var.tidal.url>
</properties>

另一个配置文件定义了具有不同值的相同属性。

这将参数化我的样本:

<jndiEntry jndiName="url/tidal-api" value="${tidal.url}" id="TidalJNDI" />

正好。

但问题是,如果您想在其他上下文中使用完全支持过滤的其他插件的相同属性集。然后,您需要标准的 Maven 过滤。

于 2021-05-20T01:31:55.873 回答