运行Liquibase发生意外错误:未知原因抛出NPE

时间:2020-04-14 17:26:47

标签: nullpointerexception liquibase

长期使用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)(内部版本 1.8.0_242-b20)
  • OpenJDK 64位服务器VM(Zulu 8.44.0.11-CA-macosx)(内部版本 25.242-b20,混合模式)
  • Oracle数据库11g企业版11.2.0.2.0
  • 64位生产PL / SQL版本11.2.0.2.0生产
  • CORE 11.2.0.2.0生产
  • TNS for Linux:11.2.0.2.0版正式版
  • NLSRTL版本11.2.0.2.0量产
  • Liquibase 3.8.0

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


更新APR-29-2020


我还有更多信息-我发现正在发生什么,并且解决此问题的计划无效。

什么: 显然,Liqiubase在版本3.4.2和3.5.5之间的某个位置更改了includeAll路径: 参见https://forum.liquibase.org/topic/upgrade-from-3-4-2-to-3-5-5-includeall-issues?reply=true

我已从运行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. 更改db.changelog-master.xml中的includeAll参数路径:
    <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

有人知道我想念什么吗?

1 个答案:

答案 0 :(得分:1)

请尝试以下命令:

liquibase changelogSync

此命令将在DATABASECHANGELOG跟踪表中为db.changelog-master.xml changeSet创建相应的行,并考虑已部署的那些changeSet。