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

SpringBoot项目作为Maven依赖引入后编译报包不存在问题

问题根因

核心原因是Spring Boot默认打包逻辑和普通Maven类库打包逻辑不兼容:

  • 你当前配置下spring-boot-maven-plugin会生成Spring Boot可执行Fat Jar,这种包的自定义类全部放在BOOT-INF/classes/嵌套目录下,不符合Maven依赖Jar的类路径规范(普通Jar的类文件直接放在包根目录)。
  • IDE能识别到类是因为IDE本身做了Spring Boot包的特殊适配,但标准Maven编译流程不会扫描Fat Jar嵌套路径下的类,所以编译时直接报找不到包。
  • 你之前生成的5KB小包是Maven编译阶段生成的原始未重打包Jar,本身没有包含Spring Boot重打包逻辑,引入后能识别类但缺少依赖;shade插件失效是因为和Spring Boot自带的重打包插件执行顺序、打包结构逻辑冲突。
正确解决方案

根据你的类库使用场景二选一即可:

方案1:类库仅作为公共依赖引用(推荐)

如果你的类库不需要独立作为Spring Boot服务启动,直接关闭Spring Boot的Fat Jar重打包逻辑即可:

  1. 修改类库项目pom.xml中spring-boot-maven-plugin的配置:
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <!-- 关闭Spring Boot默认Fat Jar重打包逻辑 -->
                <skip>true</skip>
            </configuration>
        </plugin>
    </plugins>
</build>
  1. 执行mvn clean deploy重新上传类库到私有仓库,业务项目重新拉取依赖即可正常编译。
    注意:该方式打出来的Jar不会内嵌Spring Boot相关依赖,业务项目需要自行引入对应版本的Spring Boot依赖,适合纯接口定义、工具类的公共库场景。

方案2:类库需要同时支持独立启动+被依赖引用

如果你的类库本身既要能通过java -jar独立启动,又要能被其他项目引用,直接用Spring Boot插件自带的分类配置,同时生成两种Jar即可,不需要额外引入shade插件:

  1. 修改spring-boot-maven-plugin配置如下:
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <!-- 给可执行Fat Jar加专属分类,和普通依赖Jar区分 -->
                <classifier>exec</classifier>
            </configuration>
        </plugin>
    </plugins>
</build>
  1. 执行mvn clean deploy后,仓库会生成两个包:
    • 不带classifier后缀的普通Jar:符合Maven依赖规范,给其他业务项目引用,编译时可正常识别类
    • 带exec后缀的Fat Jar:是可独立启动的Spring Boot包
  2. 业务项目引入依赖时不需要额外加classifier配置,默认拉取的就是普通可引用Jar,不会出现找不到包的问题。
额外代码问题修正

你当前类库代码里有两个会引发运行时异常的写法,建议同步调整:

  1. 接口中定义的name、description、dependencies默认是public static final常量,实现类中定义同名字段不会覆盖接口常量值,会引发逻辑错误,建议改成接口方法定义,不要在接口中声明可变成员字段。
  2. new HashMap<>().put("Database","1.0.0")的返回值是put操作的旧值(类型为String),直接强转成Map会抛出ClassCastException,正确写法如下:
// 两种写法二选一
public Map<String, String> dependencies = new HashMap<>(){{
    put("Database","1.0.0");
}};
// Java 9+版本可直接使用
public Map<String, String> dependencies = Map.of("Database","1.0.0");

内容的提问来源于stack exchange,提问作者Burner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 17:21:26