Spring Boot Maven多模块项目构建thin jar仍报错,求解决方案
解决Spring Boot Maven插件在工具子模块中构建失败的问题
我来帮你梳理下这个问题的本质和可行的解决思路:
你的核心问题是父模块中全局引入的Spring Boot Maven插件会被所有子模块继承,而这个插件默认会执行repackage目标——这个目标的作用是把普通jar转换成包含依赖的可执行Spring Boot jar,它必须找到主类才能完成操作。你的工具子模块是标准Java项目,没有Spring Boot主类,所以必然报错。你尝试的spring-boot-thin-layout其实是用来生成"瘦jar"(依赖不打包在jar内,运行时动态拉取),但它依然属于repackage目标的扩展,还是需要主类,所以不适用你的场景。
下面是几个更有效的解决办法:
方法1:在工具子模块中跳过Spring Boot插件的repackage目标
直接在工具子模块的pom.xml中配置插件,跳过它的核心执行目标:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.1.5.RELEASE</version> <executions> <execution> <id>repackage</id> <!-- 让插件跳过repackage阶段,这样就不会尝试生成可执行jar --> <phase>none</phase> </execution> </executions> </plugin> </plugins> </build>
或者更彻底一点,直接跳过整个插件的所有操作:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <skip>true</skip> </configuration> </plugin> </plugins> </build>
方法2:调整父模块的插件配置,让插件按需继承
这是更规范的做法:把父模块中的Spring Boot插件移到pluginManagement节点下,这样它只会定义插件的版本,不会自动被所有子模块继承。然后让需要的5个微服务子模块主动引入这个插件。
父模块修改后的配置:
<build> <pluginManagement> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.1.5.RELEASE</version> </plugin> </plugins> </pluginManagement> </build>
然后在每个微服务子模块的pom.xml中添加:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
工具子模块不需要做任何修改,这样它就不会继承到这个插件,自然不会触发repackage操作。
方法3:将工具子模块从Spring Boot父模块的继承链中移除(可选)
如果你的工具模块完全不需要Spring Boot相关的依赖和配置,可以考虑让它不再继承当前的Spring Boot父模块,转而继承一个普通的Maven父模块(比如你自己定义的纯管理依赖的父模块)。不过这个方案改动较大,只有当工具模块和微服务模块几乎没有共享依赖时才推荐。
内容的提问来源于stack exchange,提问作者Jon H




