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

Spring Boot Devtools启动报错:类加载器无法访问Service类

解决Spring Devtools与WebService存根的类加载器冲突问题

刚好我之前在Spring Boot 2.0 + Java 9的环境下碰到过一模一样的问题,给你梳理下问题根源和解决办法:

问题场景

你用wsimport在/target/classes/生成WebService服务存根后,启动带Spring Devtools的应用时抛出了异常:

Caused by: java.lang.IllegalArgumentException: com....Service referenced from a method is not visible from class loader

问题根源

这个异常的核心原因是Spring Devtools的RestartClassLoader和系统默认的AppClassLoader加载了同一个WebService存根类,导致类对象不匹配。

Devtools为了实现热重启功能,会用RestartClassLoader来加载大部分应用类,但你通过wsimport生成在/target/classes/的存根类,可能被AppClassLoader优先加载了。而框架里的ensureVisible方法会严格校验类加载器一致性:

private static void ensureVisible(ClassLoader ld, Class<?> c) { 
    Class<?> type = null; 
    try { 
        type = Class.forName(c.getName(), false, ld); 
    } catch (ClassNotFoundException e) { 
        if (type != c) { 
            throw new IllegalArgumentException(c.getName() + " referenced from a method is not visible from class loader"); 
        } 
    } 
}

当校验发现同一个类名被两个不同类加载器加载出不同的类对象时,就会抛出这个异常。

解决方案

你尝试通过spring-devtools.properties配置restart.include的思路完全正确,关键是要让RestartClassLoader明确包含WebService存根类所在的路径。具体操作步骤:

  1. 在项目的src/main/resources目录下创建spring-devtools.properties文件(如果还没有的话)
  2. 根据你的存根类位置添加配置:
    • 如果存根类直接在/target/classes/下的某个包中,配置包路径匹配:
      # 替换成你实际的WebService存根类包前缀
      restart.include.webservice-stubs=/com/yourcompany/webservice/**
      
    • 如果存根被打包成了jar文件,直接匹配jar文件名:
      # 替换成你实际的存根jar名称,支持通配符
      restart.include.webservice-stub=/webservice-client-*.jar
      
    这样配置后,Devtools的RestartClassLoader会负责加载这些存根类,避免和AppClassLoader产生类对象不一致的冲突。

另外,因为你用的是Java 9,如果是模块化项目,还要确保WebService存根所在的模块被正确导出,并且应用模块能正确引用它,避免模块边界的类加载问题。

内容的提问来源于stack exchange,提问作者Александр Захаров

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:22:25