Spring Boot Devtools启动报错:类加载器无法访问Service类
刚好我之前在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存根类所在的路径。具体操作步骤:
- 在项目的
src/main/resources目录下创建spring-devtools.properties文件(如果还没有的话) - 根据你的存根类位置添加配置:
- 如果存根类直接在
/target/classes/下的某个包中,配置包路径匹配:# 替换成你实际的WebService存根类包前缀 restart.include.webservice-stubs=/com/yourcompany/webservice/** - 如果存根被打包成了jar文件,直接匹配jar文件名:
# 替换成你实际的存根jar名称,支持通配符 restart.include.webservice-stub=/webservice-client-*.jar
- 如果存根类直接在
另外,因为你用的是Java 9,如果是模块化项目,还要确保WebService存根所在的模块被正确导出,并且应用模块能正确引用它,避免模块边界的类加载问题。
内容的提问来源于stack exchange,提问作者Александр Захаров

