【问题标题】:How to exclude classes generated with WSDL from Spring-Devtools restart cycle?如何从 Spring-Devtools 重启周期中排除使用 WSDL 生成的类?
【发布时间】:2020-02-15 03:18:38
【问题描述】:

当我在启用 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.** 生成的类排除在重启周期之外。

【问题讨论】:

    标签: java spring-boot wsdl spring-boot-devtools


    【解决方案1】:

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

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

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

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

    完成了。


    编辑:

    这个解决方案只是将异常的调用从 Bean 创建阶段移到了执行阶段。问题仍未解决。

    【讨论】:

      【解决方案2】:

      你不能

      • 因为 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/
      • 所以,你不能通过这种方式排除一个类

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-28
        • 2019-02-27
        相关资源
        最近更新 更多