如何构建多模块Spring/Maven项目为独立可执行Jar?构建报错排查
Maven多模块依赖找不到的常见原因及解决方法
以下是导致com.example:example-commons:jar:1.0找不到的几个核心问题,对应解决方式如下:
父POM未正确声明子模块
父pom.xml的<modules>标签必须包含所有子模块,尤其是commons模块。如果没声明,Maven在构建时会跳过commons模块的编译打包,本地仓库自然没有这个依赖。示例配置:<modules> <module>commons</module> <module>infrastructure</module> <module>data</module> <module>backend</module> </modules>commons模块被打成了可执行Fat Jar
commons是库模块,不能用spring-boot-maven-plugin的默认配置(默认会生成可执行Fat Jar),这种Jar无法被其他模块作为依赖引用。需要修改commons的pom.xml:- 要么移除spring-boot-maven-plugin,改用普通的maven-jar-plugin;
- 要么保留spring-boot-maven-plugin,但添加classifier配置,让它生成两个Jar(一个可执行、一个普通库):
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <classifier>exec</classifier> </configuration> </plugin> </plugins> </build>
构建命令执行位置错误
必须在父POM所在的根目录执行mvn clean package -Pproduction,不能直接在backend模块目录下执行。否则Maven只会构建backend模块,不会自动构建依赖的commons模块,导致本地仓库缺失commons的Jar。production Profile干扰了依赖或模块构建
检查父POM或各子模块的POM中,productionprofile是否有以下情况:- 修改了commons模块的依赖版本;
- 排除了commons依赖;
- 配置了仅在特定profile下才构建commons模块。
本地仓库无commons模块的Jar
先在根目录执行mvn clean install,将所有子模块安装到本地Maven仓库,之后再执行package命令。因为package仅完成打包,不会把模块安装到本地仓库,其他模块依赖时会找不到。
内容的提问来源于stack exchange,提问作者jnemecz
相关产品推荐
相关产品推荐

