You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

问题分析

  1. target/thin/root未生成:父POM中spring-boot-thin-maven-plugin的resolve执行配置了<inherited>false</inherited>,导致子模块不会继承该执行逻辑,而父模块本身不是可执行模块,无法触发依赖下载。
  2. 启动时找不到父POM:Thin Jar默认仅从远程Maven仓库查找依赖,但父POM仅存在于本地仓库,启动时无法解析;同时多模块下Spring Boot Maven插件的重复repackage配置可能破坏Thin Jar的布局。
  3. 插件配置冲突:父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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 18:59:50