Spring boot 应用程序从 2.37 迁移到 2.4.1 版本后停止工作,它可以在 windows 上运行,但不能在 linux 机器上运行

Posted

技术标签:

【中文标题】Spring boot 应用程序从 2.37 迁移到 2.4.1 版本后停止工作,它可以在 windows 上运行,但不能在 linux 机器上运行【英文标题】:Spring boot app stopped working after migration from 2.37 to 2.4.1 version, it is working on windows but not on linux machine 【发布时间】:2021-04-14 03:24:00 【问题描述】:

以下是日志:

2021 年 1 月 6 日 11:24:57.362 INFO [main] org.apache.jasper.servlet.TldScanner.scanJars 至少对一个 JAR 进行了 TLD 扫描,但未包含 TLD。启用此记录器的调试日志记录以获取已扫描但未在其中找到 TLD 的 JAR 的完整列表。在扫描期间跳过不需要的 JAR 可以缩短启动时间和 JSP 编译时间。 11:24:57.872 [main] 错误 org.springframework.boot.SpringApplication - 应用程序运行失败 java.lang.IllegalStateException:无法从模式“文件:./config/*/application.properties”加载配置数据资源 在 org.springframework.boot.context.config.LocationResourceLoader.getDirectory(LocationResourceLoader.java:141) 在 org.springframework.boot.context.config.LocationResourceLoader.getResources(LocationResourceLoader.java:102) 在 org.springframework.boot.context.config.StandardConfigDataLocationResolver.resolvePattern(StandardConfigDataLocationResolver.java:259) 在 org.springframework.boot.context.config.StandardConfigDataLocationResolver.resolve(StandardConfigDataLocationResolver.java:245) 在 org.springframework.boot.context.config.StandardConfigDataLocationResolver.resolve(StandardConfigDataLocationResolver.java:219) 在 org.springframework.boot.context.config.StandardConfigDataLocationResolver.resolve(StandardConfigDataLocationResolver.java:111) 在 org.springframework.boot.context.config.ConfigDataLocationResolvers.lambda$resolve$1(ConfigDataLocationResolvers.java:114) 在 org.springframework.boot.context.config.ConfigDataLocationResolvers.resolve(ConfigDataLocationResolvers.java:125) 在 org.springframework.boot.context.config.ConfigDataLocationResolvers.resolve(ConfigDataLocationResolvers.java:114) 在 org.springframework.boot.context.config.ConfigDataLocationResolvers.resolve(ConfigDataLocationResolvers.java:106) 在 org.springframework.boot.context.config.ConfigDataImporter.resolve(ConfigDataImporter.java:101) 在 org.springframework.boot.context.config.ConfigDataImporter.resolve(ConfigDataImporter.java:93) 在 org.springframework.boot.context.config.ConfigDataImporter.resolveAndLoad(ConfigDataImporter.java:81) 在 org.springframework.boot.context.config.ConfigDataEnvironmentContributors.withProcessedImports(ConfigDataEnvironmentContributors.java:118) 在 org.springframework.boot.context.config.ConfigDataEnvironment.processInitial(ConfigDataEnvironment.java:230) 在 org.springframework.boot.context.config.ConfigDataEnvironment.processAndApply(ConfigDataEnvironment.java:217) 在 org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessor.postProcessEnvironment(ConfigDataEnvironmentPostProcessor.java:88) 在 org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessor.postProcessEnvironment(ConfigDataEnvironmentPostProcessor.java:80) 在 org.springframework.boot.env.EnvironmentPostProcessorApplicationListener.onApplicationEnvironmentPreparedEvent(EnvironmentPostProcessorApplicationListener.java:100) 在 org.springframework.boot.env.EnvironmentPostProcessorApplicationListener.onApplicationEvent(EnvironmentPostProcessorApplicationListener.java:86) 在 org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:203) 在 org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:196) 在 org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:170) 在 org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:148) 在 org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.java:82) 在 org.springframework.boot.SpringApplicationRunListeners.lambda$environmentPrepared$2(SpringApplicationRunListeners.java:63) 在 java.util.ArrayList.forEach(ArrayList.java:1259) 在 org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:117) 在 org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:111) 在 org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:62) 在 org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:362) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:320) 在 org.springframework.boot.web.servlet.support.SpringBootServletInitializer.run(SpringBootServletInitializer.java:173) 在 org.springframework.boot.web.servlet.support.SpringBootServletInitializer.createRootApplicationContext(SpringBootServletInitializer.java:153) 在 org.springframework.boot.web.servlet.support.SpringBootServletInitializer.onStartup(SpringBootServletInitializer.java:95) 在 org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:174) 在 org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5140) 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) 在 org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:717) 在 org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:690) 在 org.apache.catalina.core.StandardHost.addChild(StandardHost.java:705) 在 org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:978) 在 org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1849) 在 java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 在 java.util.concurrent.FutureTask.run(FutureTask.java:266) 在 org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) 在 java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:112) 在 org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:773) 在 org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:427) 在 org.apache.catalina.startup.HostConfig.start(HostConfig.java:1576) 在 org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:309) 在 org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123) 在 org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:423) 在 org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:366) 在 org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:936) 在 org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:841) 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) 在 org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1384) 在 org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1374) 在 java.util.concurrent.FutureTask.run(FutureTask.java:266) 在 org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) 在 java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:134) 在 org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:909) 在 org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262) 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) 在 org.apache.catalina.core.StandardService.startInternal(StandardService.java:421) 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) 在 org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:930) 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) 在 org.apache.catalina.startup.Catalina.start(Catalina.java:633) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:343) 在 org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:474) 引起:java.lang.IllegalStateException:'config'不是目录 在 org.springframework.util.Assert.state(Assert.java:97) 在 org.springframework.boot.context.config.LocationResourceLoader.getDirectory(LocationResourceLoader.java:137)

【问题讨论】:

【参考方案1】:

尝试通过设置属性来使用遗留配置处理:

spring.config.use-legacy-processing=true

或 YAML:

spring:
  config:
    use-legacy-processing: true

您可以在文章中阅读更多相关信息:https://spring.io/blog/2020/08/14/config-file-processing-in-spring-boot-2-4

【讨论】:

我有一个 application.properties 文件,但我也收到此错误。如何设置“use-legacy-processing”属性?似乎 Spring Boot 甚至无法加载我的 application.properties。 您是否尝试在 application.properties 中添加spring.config.use-legacy-processing=true 是的,但似乎连application.properties都无法加载。所以它并没有真正起作用。

以上是关于Spring boot 应用程序从 2.37 迁移到 2.4.1 版本后停止工作,它可以在 windows 上运行,但不能在 linux 机器上运行的主要内容,如果未能解决你的问题,请参考以下文章

从 Spring Boot 安全迁移到 keycloak

从 Spring Boot 1.5.10 迁移到 2.0.0 时无法解析依赖项

使用spring-boot在多个数据库之间进行数据迁移

迁移到 Spring Boot 2 并使用 Spring Batch 4

将 Spring boot 1.5 迁移到 2.x 无法启动应用程序

将用户从 Spring Boot 迁移到 ASP.NET