首页 > 解决方案 > Spring boot - 不支持的配置数据位置'可选:文件:./config/*/'

问题描述

我们正在将一个 Spring Boot 应用程序从 2.2.4 迁移到 2.4.3
该应用程序可以通过内置的 tomcat / Tomcat war 部署运行。
环境: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 加载的。因此,当尝试使用密钥 URLlassLoader(第 136 行)检索时,启动 v2.4.3 中的 2 个解析器 - ConfigTreeConfigDataLocationResolver、StandardConfigDataLocationResolver 没有被识别。

不确定这是否是 Springboot / SpringCore / Tomcat / 作为我们升级的一部分添加的任何新配置的问题。
注意:我们的 application.properties 只有 spring.servlet.multipart 相关属性。

标签: spring-bootclassloaderjava-11tomcat9urlclassloader

解决方案


“./”在独立的 tomcat 中没有得到解决。

尝试使用 classpath:application.properties 或 classpath:config/* - 这需要战争中的道具。

或文件的绝对路径:/var/myapp/config/*. 由于tomcat在D:,你可以创建一个文件夹d:/var/myapp/config/。

请注意,在 spring 中您可以忽略“d:”而只提及“/var/myapp/config/*”,因此,如果 tomcat 在“x:”中,您的代码无需更改。


推荐阅读