You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在maven-remote-resources-plugin中启用资源过滤(无需修改子POM)

解决maven-remote-resources-plugin共享资源过滤不生效的问题

你遇到的核心问题是:maven-remote-resources-plugin仅负责把共享资源复制到本地目录,但不会自动触发文件过滤——过滤是maven-resources-plugin的职责。要实现父POM统一配置、子项目零改动的目标,只需在父POM中补充资源过滤的全局配置即可,具体方案如下:

完整父POM配置调整

1. 全局配置资源过滤

在父POM的<build>节点下添加<resources>配置,把共享资源目录纳入过滤范围,所有子项目会自动继承这个配置:

<build>
  <resources>
    <!-- 处理共享资源目录的过滤逻辑 -->
    <resource>
      <directory>${project.build.directory}/maven-shared-archive-resources</directory>
      <filtering>true</filtering>
    </resource>
    <!-- 保留默认资源目录配置(根据你的需求调整过滤开关) -->
    <resource>
      <directory>src/main/resources</directory>
      <filtering>false</filtering>
    </resource>
  </resources>

  <!-- 插件管理:统一配置远程资源插件 -->
  <pluginManagement>
    <plugins>
      <plugin>
        <artifactId>maven-remote-resources-plugin</artifactId>
        <version>1.5</version>
        <executions>
          <execution>
            <id>process-remote-resources</id>
            <goals>
              <goal>process</goal>
            </goals>
            <configuration>
              <resourceBundles>
                <resourceBundle>com.gillesB:resourceJar:1.0</resourceBundle>
              </resourceBundles>
              <!-- 关键:改为false,确保子项目单独构建时也会执行该插件 -->
              <runOnlyAtExecutionRoot>false</runOnlyAtExecutionRoot>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </pluginManagement>
</build>

<!-- 父POM声明共享资源包依赖,子项目自动继承 -->
<dependencies>
  <dependency>
    <groupId>com.gillesB</groupId>
    <artifactId>resourceJar</artifactId>
    <version>1.0</version>
  </dependency>
</dependencies>

2. 确保共享资源包不提前过滤

还要检查你的resourceJar项目(共享资源包)的POM,确保它打包时不会提前替换占位符——否则子项目拿到的就是已经被替换过的静态文件了:

<build>
  <plugins>
    <plugin>
      <artifactId>maven-remote-resources-plugin</artifactId>
      <version>1.5</version>
      <executions>
        <execution>
          <goals>
            <goal>bundle</goal>
          </goals>
          <configuration>
            <resources>
              <resource>
                <directory>src/main/resources</directory>
                <!-- 设为false,保留占位符到子项目构建时再替换 -->
                <filtering>false</filtering>
              </resource>
            </resources>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

方案原理说明

  • maven-remote-resources-pluginprocess目标:仅负责将共享资源包中的文件复制到子项目的target/maven-shared-archive-resources目录,它本身不处理占位符替换。
  • maven-resources-plugin:是Maven负责资源过滤的核心插件,通过在父POM中全局配置它处理共享资源目录,子项目会自动继承这个逻辑,无需单独修改POM。
  • runOnlyAtExecutionRoot=false:确保子项目单独执行mvn clean install时,也会触发远程资源的复制操作(如果设为true,只有在父聚合项目根目录执行构建时才会处理子项目的共享资源)。

这样调整后,所有子项目无需任何额外配置,构建时就能自动获取经过过滤的共享properties文件了。

内容的提问来源于stack exchange,提问作者gillesB

火山引擎 最新活动