spring-boot - 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 相关属性。
解决方案
“./”在独立的 tomcat 中没有得到解决。
尝试使用 classpath:application.properties 或 classpath:config/* - 这需要战争中的道具。
或文件的绝对路径:/var/myapp/config/*. 由于tomcat在D:,你可以创建一个文件夹d:/var/myapp/config/。
请注意,在 spring 中您可以忽略“d:”而只提及“/var/myapp/config/*”,因此,如果 tomcat 在“x:”中,您的代码无需更改。
推荐阅读
- flutter - 如何使用颤振从谷歌驱动器获取所有视频文件?
- intellij-idea - 关闭项目后 IntelliJ 内容根目录重置
- android - 颤振位置
- python - 如何找到使用 Pandas 最频繁和最不频繁的计数?
- kotlin - 从字符串拆分空间在 Kotlin 中不起作用
- pdf - 数字签名证书推荐
- python - 缓存 Django 页面以快速加载
- python - 如何在一行中编写嵌套的 if-elif-else 条件?
- git - Git - 从提交到主文件中永久排除文件(删除)
- symfony - 如何在我的项目 symfony 4 中卸载包 lexik / jwt-authentication-bundle