nullpointerexception - 运行 Liquibase 时出现意外错误:未知原因引发 NPE
问题描述
使用 Liquibase 很长时间了,很喜欢。但是,在我目前正在进行的项目中,我遇到了一个我似乎无法找到原因的问题。
我可以从命令行运行每个changelog/feature/*.xml 文件(使用更新),一切都成功了。
我可以从命令行(使用更新)运行每个db.changelog-*.xml 文件(master除外),一切都成功了。
但是当我尝试运行 db.changelog-master 文件时,我得到:
Starting Liquibase at Tue, 14 Apr 2020 11:49:47 CDT (version 3.8.0 built at 2019-08-15T20:38:06Z)
Liquibase Community 3.8.0 by Datical
Unexpected error running Liquibase: Unknown reason
liquibase.exception.ChangeLogParseException: liquibase.exception.SetupException
at liquibase.parser.core.xml.AbstractChangeLogParser.parse(AbstractChangeLogParser.java:25) ~[liquibase.jar:na]
at liquibase.Liquibase.getDatabaseChangeLog(Liquibase.java:217) ~[liquibase.jar:na]
at liquibase.Liquibase.update(Liquibase.java:190) ~[liquibase.jar:na]
at liquibase.Liquibase.update(Liquibase.java:179) ~[liquibase.jar:na]
at liquibase.integration.commandline.Main.doMigration(Main.java:1223) [liquibase.jar:na]
at liquibase.integration.commandline.Main.run(Main.java:209) [liquibase.jar:na]
at liquibase.integration.commandline.Main.main(Main.java:132) [liquibase.jar:na]
Caused by: liquibase.exception.SetupException: null
at liquibase.changelog.DatabaseChangeLog.includeAll(DatabaseChangeLog.java:531) ~[liquibase.jar:na]
at liquibase.changelog.DatabaseChangeLog.handleChildNode(DatabaseChangeLog.java:398) ~[liquibase.jar:na]
at liquibase.changelog.DatabaseChangeLog.load(DatabaseChangeLog.java:308) ~[liquibase.jar:na]
at liquibase.parser.core.xml.AbstractChangeLogParser.parse(AbstractChangeLogParser.java:23) ~[liquibase.jar:na]
... 6 common frames omitted
Caused by: java.lang.NullPointerException: null
at java.util.AbstractCollection.addAll(AbstractCollection.java:343) ~[na:1.8.0_242]
at liquibase.integration.commandline.CommandLineResourceAccessor.list(CommandLineResourceAccessor.java:44) ~[liquibase.jar:na]
at liquibase.resource.CompositeResourceAccessor.list(CompositeResourceAccessor.java:40) ~[liquibase.jar:na]
at liquibase.changelog.DatabaseChangeLog.includeAll(DatabaseChangeLog.java:506) ~[liquibase.jar:na]
... 9 common frames omitted
For more information, please use the --logLevel flag
我确实找到了一个旧视图和触发器,它们是在研究项目期间为不同的模式创建的,它们从未在这个模式中运行过(也没有在这个 DATABASECHANGELOG 中)。它们已被删除,但问题仍然存在。
跑步:
- macOS Catalina 10.15.3
- openjdk 版本“1.8.0_242”
- OpenJDK 运行时环境 (Zulu 8.44.0.11-CA-macosx) (build 1.8.0_242-b20)
- OpenJDK 64 位服务器 VM (Zulu 8.44.0.11-CA-macosx) (build 25.242-b20, 混合模式)
- Oracle 数据库 11g 企业版 11.2.0.2.0 版
- 64 位生产 PL/SQL 版本 11.2.0.2.0 生产
- 核心 11.2.0.2.0 生产
- 适用于 Linux 的 TNS:版本 11.2.0.2.0 生产
- NLSRTL 版本 11.2.0.2.0 生产
- Liquibase 3.8.0
尝试了我能想到的一切。有人有什么想法吗?
**2020 年 4 月 29 日更新**
我有更多信息 - 我发现发生了什么,并且解决此问题的计划不起作用。
什么:显然 Liqiubase 在 3.4.2 和 3.5.5 之间更改了 includeAll 路径:请参阅“从 3.4.2 升级到 3.5.5 或更高版本”
我从运行 3.4.2 的旧系统中复制了我们的 liquibase 设置。在 db.changelog-master.xml 文件中,它有<includeAll path="/features"/>
(前导斜杠)。但是,在新项目上,我升级到了 3.8.0。而 includeAll 是引发异常的原因。
新值是<includeAll path="features/"/>
(斜杠)。DATABASECHANGELOG中FILENAME列的格式相同,即features/20191024-LD-1.xml
在文档中,有一个看起来非常适合此修复的命令行维护命令:cleanCheckSums。根据网站:
从数据库中删除当前校验和。在下一次更新时,已部署的变更集将重新计算其校验和,尚未部署的变更集将被部署。
挑战是,是的,cleanCheckSums 将 MD5SUM 列清空,EXECTYPE 列是 EXECUTED,并且每一行都有一个填充的 DEPLOYMENT_ID,但是下一个更新命令会尝试重新运行所有变更集。
这是我们为修复创建的计划:
脚步
更改 includeAll 参数路径
db.changelog-master.xml
:
<includeAll path="features/"/>
运行清算 clearCheckSums:
$LIQUIBASE_HOME/liquibase \ --driver=oracle.jdbc.OracleDriver \ --classpath=/data/apps/liquibase-3.8.0/ojdbc7.jar \ --url={pathToDatabase} \ --username={dbUserName} \ --password={dbUserPass} \ clearCheckSums
将数据库列文件名修复为预期格式的 SQL
似乎是完全相同的格式:
旧:features/20191024-LD-1.xml
新测试:features/20200429-deleteme.xml
运行主更新:
$LIQUIBASE_HOME/liquibase \ --driver=oracle.jdbc.OracleDriver \ --classpath=/data/apps/liquibase-3.8.0/ojdbc7.jar \ --url={pathToDatabase} \ --changeLogFile=db.changelog-master.xml \ --username={dbUserName} \ --password={dbUserPass} \ update
有人知道我错过了什么吗?
解决方案
请尝试以下命令:
liquibase changelogSync
此命令将创建与 DATABASECHANGELOG 跟踪表中的 db.changelog-master.xml 更改集对应的行,并将这些更改集视为已部署。
推荐阅读
- python - 按内部数组的特定元素分组
- pandas - 为什么熊猫处理两个数据帧与一个数据帧的子图不同?
- apache-spark - beam-release-2.16.0 中没有 gradlew
- python-3.x - AttributeError:模块“队列”没有属性“SimpleQueue”
- c# - 如何明确设计这两个类?
- microsoft-graph-api - microsoft graph rest api:更新应用程序失败并出现错误 badrequest - 错误:属性值是必需的,但为空或缺失
- php - Slim 框架:调用内部 API REST
- java - Jackson Json 和 @JsonAnySetter 的行为不稳定
- javascript - 如何将php变量传递给ajax成功函数并分配给JavaScript变量
- php - 获取最近 2 分钟插入的行数