在 server.xml 中使用 maven 过滤而不破坏 mvn liberty:dev

Use maven filtering in server.xml without breaking mvn liberty:dev

我想在我的 src/main/liberty/config/server.xml 中使用 maven filtering,而不破坏 [ 的使用=52=] 来自 maven-liberty-plugin。我最大的问题似乎是 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 时,它会被未过滤的 server.xml 覆盖来自 src/main/liberty/config/server.xml.

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

背景

这在今天基本上不受支持。 liberty-maven-plugin 不允许您这样做,并且 liberty-maven-plugin 管理和控制 Liberty 配置的方式也不会让您轻松使用标准 Maven 插件,例如 'dependency' 或 'resources' 插件。

因为这种 issue was raised before I shared a sample 您可能会发现有用的方法,尽管它有一种解决方法的感觉。

解决方案概述

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

解决方案详情

假设我想在 Liberty 服务器配置中对 URL 使用“过滤器”式 Maven 变量替换 ${tidal.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 就像在我的示例 repo 中)或者你可能只是使用 -Dtidal.url=<value>.

跟进

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

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

另外我会注意到我们正在考虑增强对一般资源和网络资源的过滤器支持here

再想想

如果您只需要一种动态方式 select,在构建时,一组 Liberty 配置值与另一组 Liberty 配置值对比,则您不一定需要使用过滤。

您可以改用 support,它将 Maven 属性映射到 Liberty 配置。

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

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

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

这将参数化我的示例:

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

很好。

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