多模块项目使用spring-boot-maven-plugin构建启动jar提示找不到主类如何解决
问题根源
你当前的配置错误核心是:将仅需启动模块使用的spring-boot-maven-plugin重打包、主类配置全局放在了父POM的pluginManagement中,普通依赖模块(Model/Controller/View)如果继承到该配置,打包时会找不到不存在的主类报错。
可行解决步骤
1. 调整父POM配置
父POM的pluginManagement中仅保留插件的统一版本声明,移除全局的重打包执行配置、主类配置,修改后对应部分如下:
<build> <pluginManagement> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.4.0</version> </plugin> </plugins> </pluginManagement> </build>
2. 仅在Execute启动模块配置插件
Model/Controller/View三个普通依赖模块完全不要添加spring-boot-maven-plugin的引用,仅在存放主启动类的Execute模块的POM中添加插件及对应配置:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> </goals> <configuration> <!-- 确认此处全限定名和Execute模块中主类实际路径完全一致 --> <mainClass>ru.kwork.Main</mainClass> <classifier>spring-boot</classifier> </configuration> </execution> </executions> </plugin> </plugins> </build>
注意:请确认主类ru.kwork.Main确实存放在Execute模块的src/main/java/ru/kwork路径下,且类上标注了@SpringBootApplication注解
3. 执行打包
在父项目根目录执行命令mvn clean package即可,打包完成后可执行jar包会生成在Execute模块的target目录下,带spring-boot后缀的就是可运行的fat jar。
配置逻辑说明
pluginManagement的作用是统一管控子模块的插件版本,不会直接生效,仅在子模块声明引用该插件时才会继承配置,因此仅单个模块需要的特殊配置不要放在父POM中,避免污染其他模块。- 普通业务模块只需打成普通jar包供其他模块依赖即可,不需要执行Spring Boot的repackage操作,repackage会将普通jar转换为带启动引导类的可执行jar,反而会导致其他模块依赖时无法正常识别类。
- 仅入口模块需要配置repackage并指定自身的主类路径,打包时仅会对该模块做可执行jar转换,其他模块都是普通依赖jar,不会触发主类查找逻辑,因此不会报错。
内容的提问来源于stack exchange,提问作者Daniele D'Alia
相关产品推荐
相关产品推荐

