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

Spring Boot库引入时遇IllegalAccessError,求无额外配置解决方案

解决Spring Boot库引入的IllegalAccessError问题

Hey,这个错误我之前帮同事排查过好几次,核心原因基本都是Spring Boot依赖版本冲突或者自制库的打包方式不对——毕竟Spring Boot内部的类访问权限控制很严格,版本不统一或者打包结构有问题就容易踩这个坑。我给你一步步拆解解决方案:

第一步:把自制库从「可执行JAR」改成「普通库JAR」

很多人会犯这个错:用Spring Boot的spring-boot-maven-plugin打包自己的库,但这个插件是用来生成可运行的应用JAR的,它的结构和类加载机制都是为独立运行设计的,拿来当库用肯定会和主应用的依赖打架。

你得修改库的pom.xml:

  • 要么直接移除spring-boot-maven-plugin,改用标准的maven-jar-plugin打包;
  • 要么如果还需要用Spring Boot的依赖管理,就把插件的可执行配置关掉,同时用spring-boot-dependencies做版本统一:
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>你的Spring Boot版本号</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    
    这样你的库会自动继承Spring Boot官方的依赖版本,不会乱引入冲突版本。

第二步:揪出冲突依赖的来源

你说不知道哪些依赖带了logback-classic和evo-inflector,用Maven的依赖树命令一查就清楚:
在你的库项目和主应用项目里分别跑:

# 查logback-classic的来源
mvn dependency:tree | grep logback-classic
# 查evo-inflector的来源
mvn dependency:tree | grep evo-inflector

输出结果会显示这些依赖是从哪个父依赖引进来的,比如可能是spring-boot-starter-web或者某个第三方库。找到之后,在你的库的pom.xml里,给对应的父依赖加上排除配置,比如:

<dependency>
    <groupId>某个第三方库的groupId</groupId>
    <artifactId>某个第三方库的artifactId</artifactId>
    <exclusions>
        <exclusion>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
        </exclusion>
    </exclusions>
</dependency>

第三步:强制统一Spring Boot版本

这个是关键!你的自制库和引入它的主应用必须用完全相同的Spring Boot版本。因为Spring Boot内部的类(比如报错里的LoggingSystemProperties)的访问权限、包结构在不同版本里可能会变,版本不统一就会出现“我能看见这个类但没法访问”的情况。

所以在你的库的pom.xml里,一定要通过spring-boot-dependencies来管理版本,主应用那边也用同一个版本,这样所有依赖的版本都会自动对齐,不会出现冲突。

第四步:让你的库“零配置”接入其他应用

要实现不用额外配置就能引入,你得在库的pom.xml里做好依赖隔离:

  • 对于Spring Boot的核心starter(比如spring-boot-starter-logging),把它们设为optional,这样主应用不会自动继承这些依赖,而是用自己的日志配置:
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-logging</artifactId>
        <optional>true</optional>
    </dependency>
    
  • 如果你的库不需要自己初始化日志,干脆别引入日志starter,完全依赖主应用的日志环境就行。
  • 另外,别在库里面放@SpringBootApplication注解的类!要用@Configuration来定义Bean,否则主应用启动时会触发两次Spring上下文初始化,各种奇怪问题都会来。

最后:重新打包测试

改完pom之后,跑mvn clean install重新打包你的库,然后在测试应用里引入试试。如果还有问题,再跑一遍依赖树命令,看看是不是还有漏网的冲突依赖。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:47:39