运行Liquibase发生意外错误:引发NPE的原因未知

问题描述 投票:0回答:1

[长期使用Liquibase,并喜欢它。但是,在我目前正在进行的项目中,我遇到了一个似乎无法找到原因的问题。

我可以从命令行运行每个 changelog / feature / *。xml文件(使用更新),一切都成功。

我可以从命令行(使用更新)运行每个 db.changelog-*。xml文件(主服务器除外),并且一切成功。

但是当我尝试运行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)(build1.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生产
  • 用于Linux的TNS:版本11.2.0.2.0生产
  • NLSRTL版本11.2.0.2.0生产
  • Liquibase 3.8.0

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

UPDATE 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. 运行清算清算总和:$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

有人知道我想念什么吗?

nullpointerexception liquibase
1个回答
0
投票

请尝试以下命令:

liquibase changelogSync

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

© www.soinside.com 2019 - 2024. All rights reserved.