如何从 Spring-Devtools 重启周期中排除使用 WSDL 生成的类?



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

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

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

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

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

做了工作。


编辑:

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

你不能

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

最新更新