Liquibase/Springboot 启动异常

Posted

技术标签:

【中文标题】Liquibase/Springboot 启动异常【英文标题】:Liquibase/Springboot startup exception 【发布时间】:2022-01-22 01:23:54 【问题描述】:

从昨天(星期日)早上开始,我的生产应用程序无法启动,我这边没有任何代码更改。它运行 Springboot 2.3.4、Liquibase-core 3.8.0 并托管在 Amazon linux2 上。 有趣的是本地没有例外,只有在部署时才例外。

这是相关的堆栈跟踪:

Caused by: liquibase.exception.UnexpectedLiquibaseException: java.nio.file.NoSuchFileException: /tmp/agent12302722365010540729.jar
 at liquibase.servicelocator.ServiceLocator.setResourceAccessor(ServiceLocator.java:129)
 at liquibase.servicelocator.ServiceLocator.<init>(ServiceLocator.java:69)
 at liquibase.servicelocator.CustomResolverServiceLocator.<init>(CustomResolverServiceLocator.java:16)
 at org.springframework.boot.liquibase.LiquibaseServiceLocatorApplicationListener$LiquibasePresent.replaceServiceLocator(LiquibaseServiceLocatorApplicationListener.java:55)
 at org.springframework.boot.liquibase.LiquibaseServiceLocatorApplicationListener.onApplicationEvent(LiquibaseServiceLocatorApplicationListener.java:44)
 at org.springframework.boot.liquibase.LiquibaseServiceLocatorApplicationListener.onApplicationEvent(LiquibaseServiceLocatorApplicationListener.java:36)
...
Caused by: java.nio.file.NoSuchFileException: /tmp/agent801508645517312012.jar
  at liquibase.resource.ClassLoaderResourceAccessor.getResourcesAsStream(ClassLoaderResourceAccessor.java:53)
  at liquibase.servicelocator.ServiceLocator.setResourceAccessor(ServiceLocator.java:115)

我仔细检查了所有与应用程序相关的文件和环境变量,它们都是一样的。有问题的文件与我的应用没有任何关系。

你知道这个文件是什么吗?为什么 Liquibase 突然想找到它?

【问题讨论】:

您是否会在 aws 上托管您的应用程序? @korda 是的。具有伸缩组的虚拟机 我们遇到了同样的问题。 【参考方案1】:

我遇到了同样的问题。在amazon linux 2启动时,安装了一个安全补丁。

导致问题的包是 log4j-cve-2021-44228-hotpatch.noarch(你可以在 /var/log/yum.log 中查看)

临时解决办法是卸载补丁并安装另一个java版本。

yum remove log4j-cve-2021-44228-hotpatch.noarch
yum install java-11-openjdk-11.0.12.0.7-0.amzn2.0.2.x86_64

感谢@mihristov 的解决方案。

【讨论】:

听起来很有希望,但我无法使用 yum 安装旧版本的 openjdk-11 你能卸载 log4j-cve-2021-44228-hotpatch-1.1-9.amzn2.noarch 和/或 tzdata-java-2021a-1.amzn2.noarch 来检查它是否有效吗?跨度> 好的,所以我删除了log4j-cve-2021-44228-hotpatch.noarch 并手动安装了1:java-11-openjdk-11.0.12.0.7-0.amzn2.0.2.x86_64,问题得到了解决,但这并不是一个长期的解决方案。让我们希望 AL2 依赖关系尽快得到修复。 在 AWS Linux 1 上看到同样的问题。补丁调用:log4j-cve-2021-44228-hotpatch-1.1-9.amzn1.noarch alas.aws.amazon.com/announcements/2021-001.htmlAWS 的公告,其中包含有关此补丁的详细信息 - 值得一读。【参考方案2】:

这是一个临时问题:java-11-amazon-corretto-headless-11.0.13+8-2.amzn2.aarch64

修复:

yum remove log4j-cve-2021-44228-hotpatch.noarch
yum install java-11-amazon-corretto-headless-11.0.13+8-1.amzn2.aarch64

感谢@Reda 和@mihristov 指出问题。

我们的实际解决方法是安装特定版本的 corretto 而不是通用软件包

yum install java-11-amazon-corretto-headless-11.0.13+8-1.amzn2.aarch64

您应该只暂时执行此操作,直到修复完成!

【讨论】:

【参考方案3】:

我们迁移到最新的 liquibase (4+) 解决了这个问题。他们在 4+ 中使用更标准的 ServiceLocator,这似乎有所作为。

【讨论】:

【参考方案4】:

详细说明这里发生的事情:

AWS 开发了一种 systemd 服务,该服务每秒都会查找系统上运行的任何 JVM。对于它找到并支持它的所有内容,请连接一个 java 代理,该代理在运行时将 log4j JNDI lookup() 方法替换为硬编码的安全字符串。

我不清楚为什么 liquibase 在这方面会失败。我确实看到已经给出的答案似乎太具有侵略性了。无需删除/重新安装/更新您的 JVM。您可以通过以下方式解决此问题:

停止systemd补丁服务:sudo service log4j-cve-2021-44228-hotpatch status|stop|start

最佳解决方案 - 创建 kill 文件,如果服务读取该文件,则停止应用补丁:sudo touch /etc/log4j-cve-2021-44228-hotpatch.kill

【讨论】:

超级有帮助!非常感谢!创建.kill 文件对我来说很好。

以上是关于Liquibase/Springboot 启动异常的主要内容,如果未能解决你的问题,请参考以下文章

Liquibase / Spring Boot / Postgres - 模式名称不起作用

Python 异常后,启动启动debug调试

rsyslog服务异常导致Python rpc服务启动异常的排查

Docker问题排查-异常断电导致Docker启动卡住

Kafka启动失败异常-InconsistentClusterIdException

activemq启动异常