如何在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-plugin的process目标:仅负责将共享资源包中的文件复制到子项目的target/maven-shared-archive-resources目录,它本身不处理占位符替换。maven-resources-plugin:是Maven负责资源过滤的核心插件,通过在父POM中全局配置它处理共享资源目录,子项目会自动继承这个逻辑,无需单独修改POM。runOnlyAtExecutionRoot=false:确保子项目单独执行mvn clean install时,也会触发远程资源的复制操作(如果设为true,只有在父聚合项目根目录执行构建时才会处理子项目的共享资源)。
这样调整后,所有子项目无需任何额外配置,构建时就能自动获取经过过滤的共享properties文件了。
内容的提问来源于stack exchange,提问作者gillesB




