1

当我在启用 Spring-Devtools 并从 WSDL 模式生成的类的情况下启动 Spring Boot 应用程序时,我得到:

Caused by: java.lang.IllegalArgumentException: org.wsdl.WsdlServiceWs referenced from a method is not visible from class loader

我有一个基于 Spring Boot 的项目,其中包含使用org.apache.cxf:cxf-codegen-plugin插件从 WSDL 文件生成的一些类。生成的类存储在target/generated/wsdl/**目录中。生成类的包名与工程包名不同。

我在文档之后尝试了几个排除项:

https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#using-boot-devtools-restart-exclude

但我所有的尝试都失败了。

restart.exclude.wsdl=target/generated/wsdl
restart.exclude.wsdl=org.wsdl.*
restart.exclude.wsdl=**WsdlServiceWs.class

我想启用 Spring-Devtools,将 org.wsdl.** 生成的类排除在重启周期之外。

4

2 回答 2

1

问题是,我尝试使用WsdlServiceWs实际上是由WsdlServiceWsService. 我在WsdlServiceWs配置中将接口作为 bean 返回:

    ...

    @Bean
    public WsdlServiceWs wsdlService() {
        return new WsdlServiceWsService().getService();
    }

    ...

我没有想到这会是问题所在。只需将 bean 更改为以下内容:

    ...

    @Bean
    public WsdlServiceWsService wsdlService() {
        return new WsdlServiceWsService();
    }

    ...

做了工作。


编辑:

该解决方案仅将异常调用从 Bean 创建阶段移至执行阶段。问题仍未解决。

于 2019-10-18T07:25:25.913 回答
0

你不能

  • 因为 devtools 只检查类父路径,而不是每个文件夹,你可以在 ChangeableUrls.java:59 上添加断点
private ChangeableUrls(URL... urls) {
        DevToolsSettings settings = DevToolsSettings.get();
        List<URL> reloadableUrls = new ArrayList<>(urls.length);
        for (URL url : urls) {
            if ((settings.isRestartInclude(url) || isDirectoryUrl(url.toString())) && !settings.isRestartExclude(url)) {
                reloadableUrls.add(url);
            }
        }
        if (logger.isDebugEnabled()) {
            logger.debug("Matching URLs for reloading : " + reloadableUrls);
        }
        this.urls = Collections.unmodifiableList(reloadableUrls);
    }
  • 你可以看到网址是file:/xxx/target/classes/
  • 所以,你不能通过这种方式排除一个类
于 2021-04-23T07:24:41.730 回答