Maven编译时依赖scope设为provided无法正常工作如何解决
解决方案
provided scope本身的设计就是满足「编译期依赖可用、最终构建产物不包含该依赖」的诉求,完全匹配你开发公共依赖库的使用场景,编译失败和scope本身无关,均为项目配置异常导致,可按以下步骤排查修复:
- 移除
spring-boot-maven-plugin的repackage逻辑
如果你的项目是通过Spring Boot官方脚手架生成的,默认会绑定spring-boot-maven-plugin:repackage目标,该目标是用来构建可执行Fat Jar的,不适用于构建供其他项目引用的公共依赖库,还会干扰provided依赖的类路径识别导致编译异常。你可以直接删除该插件配置,或按如下配置关闭repackage能力:
公共依赖库使用Maven默认的<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> </goals> <configuration> <skip>true</skip> </configuration> </execution> </executions> </plugin>maven-jar-plugin打包即可,符合普通Jar的结构规范。 - 升级适配版本的
maven-compiler-plugin
老旧版本的编译插件存在类路径处理Bug,可能无法正确加载provided scope的依赖到编译类路径。针对Spring Boot 2.1.x版本,建议使用3.8.0及以上版本的编译插件,配置参考:<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>8</source> <target>8</target> </configuration> </plugin> - 校验本地开发环境配置
如果你是在IDEA等IDE中执行编译出现异常,可先运行命令行mvn clean compile验证。如果命令行编译正常,说明是IDE的Maven配置问题,检查是否开启了「忽略provided依赖」的选项,刷新Maven项目重新同步即可。
内容的提问来源于stack exchange,提问作者Ravi Mishra
相关产品推荐
相关产品推荐

