Maven多模块项目build-cache-extension缓存失效问题求助
核心结论
先明确:这个扩展没有单模块扫描限制,多模块下缓存失效基本是依赖传递、配置漏项或者模块间干扰导致的校验码乱变。
具体修复步骤
1. 统一扩展配置到父pom,子模块别重复加
得确认父pom的build段里,扩展是在extensions里正确声明的,子模块的pom里别再单独加这个扩展,避免重复加载搞乱校验逻辑:
<build> <extensions> <extension> <groupId>org.apache.maven.extensions</groupId> <artifactId>maven-build-cache-extension</artifactId> <version>1.0.0</version> </extension> </extensions> </build>
2. 给缓存配置文件加模块级规则
在maven-build-cache-config.xml里,明确给每个子模块单独配置缓存规则,尤其是模块间的依赖产物要纳入校验范围:
<cache> <modules> <module> <id>你的groupId:api</id> <includes> <include>src/main/**/*</include> <include>pom.xml</include> </includes> <excludes> <exclude>target/**/*</exclude> </excludes> </module> <module> <id>你的groupId:service</id> <includes> <include>src/main/**/*</include> <include>pom.xml</include> <!-- service依赖api的编译产物,得把api的class文件也纳入校验 --> <include>${project.build.directory}/classes/com/你的包名/api/**/*</include> </includes> <excludes> <exclude>target/**/*</exclude> </excludes> </module> </modules> </cache>
重点是:多模块之间的依赖产物(比如api编译后的class)必须被依赖模块(service)的校验逻辑覆盖,不然每次构建api产物的生成时间变了,service的校验码也跟着变,缓存就废了。
3. 关掉文件时间戳校验
这个扩展默认会把文件修改时间当成校验因子之一,多模块构建时,api产物的生成时间每次都不一样,直接导致service的校验码波动。可以在配置里关掉:
<cache> <config> <checksum> <ignoreFileTimestamps>true</ignoreFileTimestamps> </checksum> </config> </cache>
这样校验只看文件内容,不管修改时间,就不会因为构建时序搞出问题。
4. 清掉旧缓存再重新构建
先执行这个命令彻底清理旧缓存,避免之前的异常校验记录捣乱:
mvn clean package -Dmaven.build.cache.clean=true
之后再正常跑mvn clean package,看看缓存能不能生效。
5. 换个扩展版本试试(备选)
1.0.0版本的这个扩展在多模块场景下确实有bug,试试降级到0.5.0或者升级到最新稳定版(比如1.1.0),很多版本都修复了多模块依赖的校验逻辑问题。
验证方法
构建完看日志,如果出现这两行类似的内容,说明缓存命中了:
[INFO] CACHE: Hit cache for project 你的groupId:api
[INFO] CACHE: Hit cache for project 你的groupId:service
内容的提问来源于stack exchange,提问作者Venelin K

