Spring Boot多模块项目使用Thin Jar报错求助
Spring Boot多模块项目Thin Jar无法正常工作的问题排查与解决
项目目录结构
app (com.xxx.app) | ├─ adapter/rest (无启动类模块) ├─ adapter/sns (无启动类模块) └─ application (含启动类模块,com.xxx.application) └─ pom.xml (父项目pom.xml)
父项目pom.xml配置
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>${spring-boot-maven-plugin.version}</version> <dependencies> <dependency> <groupId>org.springframework.boot.experimental</groupId> <artifactId>spring-boot-thin-layout</artifactId> <version>${thin-jar.version}</version> </dependency> </dependencies> <executions> <execution> <id>repackage</id> <goals> <goal>repackage</goal> </goals> </execution> </executions> <configuration> <mainClass>com.xxx.application.MobileNotificationSvcApplication</mainClass> </configuration> </plugin> <plugin> <groupId>org.springframework.boot.experimental</groupId> <artifactId>spring-boot-thin-maven-plugin</artifactId> <version>${thin-jar.version}</version> <executions> <execution> <!-- 构建时将依赖下载到target/thin/root/ --> <id>resolve</id> <goals> <goal>resolve</goal> </goals> <inherited>false</inherited> </execution> </executions> </plugin>
application模块pom.xml配置
<plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>${spring-boot-maven-plugin.version}</version> <executions> <execution> <id>repackage</id> <goals> <goal>repackage</goal> </goals> <configuration> <classifier>exec</classifier> </configuration> </execution> <execution> <phase>install</phase> <goals> <goal>repackage</goal> <goal>build-info</goal> </goals> </execution> </executions> <configuration> <executable>true</executable> <finalName>${project.artifactId}</finalName> <mainClass>com.xxx.application.MobileNotificationSvcApplication</mainClass> <includeSystemScope>true</includeSystemScope> </configuration> </plugin> </plugins>
执行情况与错误信息
执行mvn clean install -f后,各模块target目录生成了小体积Jar,但未生成target/thin/root目录。启动application模块的Jar时抛出如下错误:
Exception in thread "main" java.lang.reflect.InvocationTargetException at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at org.springframework.boot.loader.wrapper.ThinJarWrapper.launch(ThinJarWrapper.java:139) at org.springframework.boot.loader.wrapper.ThinJarWrapper.main(ThinJarWrapper.java:107) Caused by: java.lang.IllegalStateException: Cannot build model at org.springframework.boot.loader.thin.DependencyResolver.dependencies(DependencyResolver.java:253) at org.springframework.boot.loader.thin.PathResolver.extract(PathResolver.java:259) at org.springframework.boot.loader.thin.PathResolver.resolve(PathResolver.java:105) at org.springframework.boot.loader.thin.ThinJarLauncher.getClassPathArchives(ThinJarLauncher.java:369) at org.springframework.boot.loader.thin.ThinJarLauncher.getClassPathArchives(ThinJarLauncher.java:352) at org.springframework.boot.loader.thin.ThinJarLauncher.getClassPathArchivesIterator(ThinJarLauncher.java:200) at org.springframework.boot.loader.Launcher.launch(Launcher.java:55) at org.springframework.boot.loader.thin.ThinJarLauncher.launch(ThinJarLauncher.java:195) at org.springframework.boot.loader.thin.ThinJarLauncher.main(ThinJarLauncher.java:141) ... 6 more Caused by: hidden.org.apache.maven.project.ProjectBuildingException: 1 problem was encountered while building the effective model for com.xxx:application:${revision} [FATAL] Non-resolvable parent POM for com.xxx:application:${revision}: Could not find artifact com.xxx:app:pom:${revision} in spring-snapshots (https://repo.spring.io/snapshot) @ line 6, column 13 for project com.xxx:application:${revision} at hidden.org.apache.maven.project.DefaultProjectBuilder.build(DefaultProjectBuilder.java:165) at hidden.org.apache.maven.project.DefaultProjectBuilder.build(DefaultProjectBuilder.java:123) at org.springframework.boot.loader.thin.DependencyResolver.dependencies(DependencyResolver.java:213) ... 14 more Caused by: hidden.org.apache.maven.model.building.ModelBuildingException: 1 problem was encountered while building the effective model for com.xxx:mobile-notification-configuration:${revision} [FATAL] Non-resolvable parent POM for com.xxx:application:${revision}: Could not find artifact com.xxx:app:${revision} in spring-snapshots (https://repo.spring.io/snapshot) @ line 6, column 13 at hidden.org.apache.maven.model.building.DefaultModelProblemCollector.newModelBuildingException(DefaultModelProblemCollector.java:197) at hidden.org.apache.maven.model.building.DefaultModelBuilder.readParentExternally(DefaultModelBuilder.java:1082) at hidden.org.apache.maven.model.building.DefaultModelBuilder.readParent(DefaultModelBuilder.java:830) at hidden.org.apache.maven.model.building.DefaultModelBuilder.build(DefaultModelBuilder.java:332) at hidden.org.apache.maven.project.DefaultProjectBuilder.build(DefaultProjectBuilder.java:158) ... 16 more
问题分析
target/thin/root未生成:父POM中spring-boot-thin-maven-plugin的resolve执行配置了<inherited>false</inherited>,导致子模块不会继承该执行逻辑,而父模块本身不是可执行模块,无法触发依赖下载。- 启动时找不到父POM:Thin Jar默认仅从远程Maven仓库查找依赖,但父POM仅存在于本地仓库,启动时无法解析;同时多模块下Spring Boot Maven插件的重复repackage配置可能破坏Thin Jar的布局。
- 插件配置冲突:父POM和application模块都配置了
repackage目标,且application模块在install阶段重复执行repackage,导致打包后的Jar缺少必要的依赖解析配置。
解决方案
1. 调整spring-boot-thin-maven-plugin配置
移除父POM中该插件的<inherited>false</inherited>,或者直接在application模块中配置resolve执行:
<!-- 在application模块的pom.xml中添加 --> <plugin> <groupId>org.springframework.boot.experimental</groupId> <artifactId>spring-boot-thin-maven-plugin</artifactId> <version>${thin-jar.version}</version> <executions> <execution> <id>resolve</id> <goals> <goal>resolve</goal> </goals> <configuration> <rootDirectory>${project.build.directory}/thin/root</rootDirectory> </configuration> </execution> </executions> </plugin>
执行mvn clean install后,application模块的target/thin/root目录会生成包含所有依赖的文件。
2. 解决父POM解析问题
启动Thin Jar时,指定本地Maven仓库路径,让解析器找到本地安装的父POM:
java -jar application.jar --thin.root=./target/thin/root -Dmaven.repo.local=$HOME/.m2/repository
同时确保执行mvn clean install时,-f参数指向正确的父pom.xml路径(比如mvn clean install -f app/pom.xml),保证父POM和所有模块安装到本地仓库。
3. 清理Spring Boot Maven插件重复配置
- 父POM中移除
spring-boot-maven-plugin的repackage执行,只保留Thin Layout依赖:
<!-- 父POM中的spring-boot-maven-plugin调整为 --> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>${spring-boot-maven-plugin.version}</version> <dependencies> <dependency> <groupId>org.springframework.boot.experimental</groupId> <artifactId>spring-boot-thin-layout</artifactId> <version>${thin-jar.version}</version> </dependency> </dependencies> <configuration> <mainClass>com.xxx.application.MobileNotificationSvcApplication</mainClass> </configuration> </plugin>
- application模块中保留一个
repackage执行即可,移除install阶段的重复repackage:
<execution> <id>repackage</id> <goals> <goal>repackage</goal> </goals> <configuration> <classifier>exec</classifier> </configuration> </execution> <!-- 移除下面这个重复的execution --> <!-- <execution> <phase>install</phase> <goals> <goal>repackage</goal> <goal>build-info</goal> </goals> </execution> -->
4. 预下载依赖并启动
如果希望构建时就完成依赖下载,启动时无需再解析,可使用thin插件的run目标:
mvn spring-boot:run -Dthin.resolve=true
内容的提问来源于stack exchange,提问作者Ladu anand
相关产品推荐
相关产品推荐

