java.lang.IllegalArgumentException 从方法中引用在 class 加载程序中不可见

java.lang.IllegalArgumentException referenced from a method is not visible from class loader

当 wsimport 在 /target/class/..... 和 运行 spring 带有 devtools 的启动应用程序中为 WS 服务生成存根时,我得到了一个异常。

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

我发现 spring devtools class 加载程序 RestartClassLoader 存在问题,因为对 Class (重启ClassLoader和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

因为它们是生成的 classes 你必须从 Spring Devtools "restart" classloader.

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

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

参考:

[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

或者简单地删除 Spring 开发工具依赖项,如果这不会影响您的应用程序:

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