java.lang.IllegalArgument从方法引用的异常在类装入器中不可见

2022-09-03 07:05:06

当 wsimport 在 /target/class/ .....并使用 devtools 运行弹簧引导应用程序。

Caused: java.lang.IllegalArgumentException: com....从方法引用的服务在类装入器中不可见

我发现spring devtools类加载器RestartClassLoader存在问题,因为对类的两个不同引用(RestartClassLoader和AppClassLoader))

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中添加对jar文件的引用以重新启动.include=/.....罐

Spring Boot 2.0.0.RELEASE Java 9


答案 1

由于它们是生成的类,因此您必须从Spring Devtools“重新启动”类装入器中排除它们。

  1. 创建文件/src/main/resources/META-INF/spring-devtools.properties
  2. 添加属性,例如从重新启动类装入器中排除类(例如,您可以使用来排除所有将单词作为包或类名一部分的类)restart.exclude.*restart.exclude.mygeneratedclasses=/*[generated]*.classgenerated

  3. 做。现在,您可以使用 devtools,并且 WS 生成的类没有问题。

参考:

[1] https://github.com/spring-projects/spring-boot/issues/4529

[2] https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-devtools.html#using-boot-devtools-customizing-classload


答案 2

或者干脆删除一个 Spring Dev Tools 依赖项,如果这不会影响您的应用程序:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-devtools</artifactId>
  <scope>runtime</scope>
</dependency>

推荐