首页 > 解决方案 > 运行 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 中)。它们已被删除,但问题仍然存在。

跑步:

尝试了我能想到的一切。有人有什么想法吗?


**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,但是下一个更新命令会尝试重新运行所有变更集。

这是我们为修复创建的计划:

脚步

  1. 更改 includeAll 参数路径db.changelog-master.xml
    <includeAll path="features/"/>

  2. 运行清算 clearCheckSums:
    $LIQUIBASE_HOME/liquibase \ --driver=oracle.jdbc.OracleDriver \ --classpath=/data/apps/liquibase-3.8.0/ojdbc7.jar \ --url={pathToDatabase} \ --username={dbUserName} \ --password={dbUserPass} \ clearCheckSums

  3. 将数据库列文件名修复为预期格式的 SQL
    似乎是完全相同的格式:
    旧: features/20191024-LD-1.xml
    新测试:features/20200429-deleteme.xml

  4. 运行主更新:
    $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

有人知道我错过了什么吗?

标签: nullpointerexceptionliquibase

解决方案


请尝试以下命令:

liquibase changelogSync

此命令将创建与 DATABASECHANGELOG 跟踪表中的 db.changelog-master.xml 更改集对应的行,并将这些更改集视为已部署。


推荐阅读