当我在启用 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/
- 因此,您不能通过这种方式排除一个类