【问题标题】:Spring boot - Unsupported config data location 'optional:file:./config/*/'Spring boot - 不支持的配置数据位置'可选:文件:./config/*/'
【发布时间】: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


    【解决方案1】:

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

    尝试使用 classpath:application.properties 或 classpath:config/* -- 这需要在 war 中使用 props。

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

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

    【讨论】:

    • 正如我已经提到的,我没有添加任何配置,例如./config/*/。它由 Springboot 自动添加。我的应用程序没有任何特定配置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-13
    • 1970-01-01
    • 2016-07-29
    • 2022-01-15
    • 2020-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多