【发布时间】:2021-07-12 01:18:19
【问题描述】:
我们正在将 Spring Boot 应用程序从 2.2.4 迁移到 2.4.3
该应用程序可以通过内置的 tomcat / Tomcat 战争部署运行。
环境:Windows Azul Java 11 (Zulu 11) 和 Tomcat 9.0.33
如果我使用 Netbeans 链接的 tomcat 运行代码,它可以正常工作。
如果我将生成的战争直接部署在同一个独立的 tomcat 中,则会引发以下错误。
SEVERE [main] org.apache.catalina.startup.HostConfig.deployWAR Error deploying web application archive [D:\apache-tomcat-9.0.33-without port - rest.war]
java.lang.IllegalStateException: Error starting child
................................................................
................................................................
Caused by: org.springframework.boot.context.config.UnsupportedConfigDataLocationException: Unsupported config data location 'optional:file:./config/*/'
at org.springframework.boot.context.config.ConfigDataLocationResolvers.resolve(ConfigDataLocationResolvers.java:110)
在阅读 Spring 文档时,提到默认情况下,Spring Boot 在默认搜索位置包含 config/*/。参考:https://docs.spring.io/spring-boot/docs/2.4.0-SNAPSHOT/reference/htmlsingle/#boot-features-external-config-files-wildcards
我进一步使用 spring boot 源和 spring core 源进行了调试,发现类加载器中发生了不匹配,这是导致此异常的原因。
SpringFactoriesLoader 是在 NB 链接的 tomcat 中由 ParallelWebAppClassLoader 和在独立 tomcat 中由 URLClassLoader 加载的类。
参考:第 129 行https://github.com/spring-projects/spring-framework/blob/master/spring-core/src/main/java/org/springframework/core/io/support/SpringFactoriesLoader.java#L129
第 136 行的缓存具有由 ParallelWebAppClassLoader 加载的配置类,但不是由 URLlassLoader 加载的。因此,启动 v2.4.3 中的 2 个解析器 - ConfigTreeConfigDataLocationResolver、StandardConfigDataLocationResolver 在尝试使用密钥 URLlassLoader(第 136 行)检索时没有被识别。
不确定这是否是 Springboot / SpringCore / Tomcat / 作为我们升级的一部分添加的任何新配置的问题。
注意:我们的 application.properties 只有 spring.servlet.multipart 相关属性。
【问题讨论】:
标签: spring-boot classloader java-11 tomcat9 urlclassloader