Maven微服务架构下自定义外部Jar作为公共依赖的配置及编译问题
问题修复方案
无法识别lib依赖的根因与解决
你遇到的编译报错核心原因是lib项目使用Spring Boot默认打包插件生成的是可执行Jar,不是可供其他项目依赖的普通Jar:可执行Jar的类文件都存放在BOOT-INF/classes目录下,Maven依赖解析时无法识别该路径下的类。IDE能正常读取是因为直接关联了lib项目的源码目录,未使用本地仓库安装的Jar包。
修复步骤:
- 若lib项目不需要独立启动运行,直接删除lib项目pom.xml中的
spring-boot-maven-plugin插件配置即可 - 若需要保留lib的可执行能力,修改lib项目的插件配置,增加
classifier区分可执行Jar和依赖Jar:
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> <classifier>exec</classifier> </configuration> </plugin>
修改完成后重新执行mvn clean install安装lib项目,再编译base项目即可正常识别依赖。
自动编译lib的实现方案
推荐使用Maven多模块聚合架构实现自动按依赖顺序构建:
- 新增一个父级POM项目,packaging类型设为
pom,将lib、base都作为子模块纳入管理,父POM示例:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>slt.mytest</groupId> <artifactId>mytest-parent</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <modules> <module>libs</module> <!-- 这里的路径要和实际子模块目录对应 --> <module>base</module> </modules> <!-- 可将公共依赖版本、JDK版本等通用配置抽到父POM统一管理 --> </project>
- 调整lib和base的parent配置,继承该父POM,替换原来直接继承的
spring-boot-starter-parent(可将spring-boot-starter-parent作为父POM的父级引入) - 需要构建base时,在父项目目录执行命令:
mvn clean install -pl base -am,Maven会自动构建base依赖的所有关联模块(包括lib),无需手动提前编译lib。
通用最佳实践
- 仅作为公共依赖的工具类、DTO模块,不要继承spring-boot-starter-parent,也不要引入Spring Boot打包插件,使用普通Maven Jar项目结构即可,减少不必要的依赖和配置冲突
- 同一业务域内的关联微服务/模块,优先用Maven多模块架构管理,天然支持依赖顺序构建、版本统一管控,降低依赖冲突概率
- 如果公共依赖需要跨多个无关项目复用,可搭建私有Maven仓库(如Nexus),公共模块版本更新后发布到私有仓库,其他项目直接拉取对应版本依赖即可,无需本地编译公共模块。
内容的提问来源于stack exchange,提问作者user3187960
相关产品推荐
相关产品推荐

