Quarkus无法识别同版本依赖Jar的代码变更问题咨询
问题根因
这个问题是两层缓存机制共同导致的,和Quarkus 2.7.4版本本身无直接bug关联:
- Maven默认依赖缓存规则:Maven对依赖的唯一判定标识是GAV坐标(groupId + artifactId + version),只要本地仓库(默认路径
~/.m2/repository)中已经存在对应坐标的jar包,默认不会主动覆盖同坐标的本地构建产物,也不会主动检查同坐标RELEASE版本的内容变更。你修改B的代码后如果只是执行普通的mvn install,很多时候不会触发旧包的覆盖,A构建时直接读取本地仓库里旧的B的jar,自然识别不到变更。 - Quarkus原生构建缓存规则:Quarkus 2.7.x版本的native构建默认开启两层缓存:一层是项目路径下
target/目录内的构建中间产物缓存,一层是用户目录下~/.quarkus/cache的全局依赖原生编译缓存。缓存的失效判定依据就是依赖的GAV坐标,只要B的版本号不变,哪怕本地仓库里的B包内容被替换,Quarkus也会直接复用之前编译好的B的原生元数据、静态编译结果,不会重新解析B的字节码变更。
快速验证方法
- 定位Maven缓存问题:找到本地Maven仓库中B对应版本的目录,解压目录下的B的jar包,查看你修改过的类文件,确认是否是修改后的最新代码,90%以上的场景这里留存的还是旧版本代码。
- 定位Quarkus缓存问题:删除项目A的
target目录,同时删除~/.quarkus/cache下和项目A、B相关的缓存文件,重新构建A,如果依然读不到B的变更,就可以确定是Maven缓存导致的问题。
对应解决方案
本地开发联调场景(无需变更版本号)
- 修改B的代码后,执行安装命令时追加强制更新参数:
mvn clean install -U,该参数会强制Maven检查并覆盖本地所有同坐标的依赖包,确保本地仓库中存的是最新的B的构建产物。 - 构建A的原生镜像时,追加参数关闭Quarkus构建缓存:
mvn clean package -Pnative -Dquarkus.build.cache.enable=false -Dquarkus.native.enable-reuse=false,让Quarkus全量重新解析所有依赖的字节码,不复用历史缓存。 - 长期本地联调可以直接把B作为子模块引入A的pom.xml,用模块依赖代替远程jar依赖,IDE和Maven都会自动识别代码变更,不需要手动处理缓存。
正式发布场景
- 开发迭代阶段给B使用
x.y.z-SNAPSHOT快照版本,Maven会默认按固定时间间隔拉取快照版本的最新产物,不会长期缓存旧快照。 - 正式发布的RELEASE版本,只要代码有变更必须升级版本号,禁止覆盖仓库中已存在的同版本RELEASE包,这也是Maven仓库的通用规范,能彻底避免所有构建节点、开发环境的缓存不一致问题。
注意:不要手动替换本地Maven仓库中同版本的jar包,Quarkus构建时会校验依赖包的SHA256哈希值,哈希值和缓存记录不匹配会直接触发构建报错。
内容的提问来源于stack exchange,提问作者Yamini
相关产品推荐
相关产品推荐

