13

当 /target/class/..... 中的 wsimport 为 WS 服务生成存根并使用 devtools 运行 Spring Boot 应用程序时,我得到了一个异常。

原因: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 文件的引用以 restart.include=/.....jar

Spring Boot 2.0.0.RELEASE Java 9

4

2 回答 2

14

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

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

  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

于 2018-06-06T22:47:07.227 回答
0

或者,如果这不会影响您的应用程序,则只需删除 Spring Dev Tools 依赖项:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-devtools</artifactId>
  <scope>runtime</scope>
</dependency>
于 2022-03-04T18:36:24.013 回答