You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动