Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从命令行执行的Liquibase回滚不工作_Java_Liquibase - Fatal编程技术网

Java 从命令行执行的Liquibase回滚不工作

Java 从命令行执行的Liquibase回滚不工作,java,liquibase,Java,Liquibase,我正在windows环境中做一个tomcat应用程序,部署时在oracle数据库上创建/更新数据库模式。为此,我使用的是Liquibase SDK 3.3.2。因此,基本上我调用SDK,告诉它从我的changelog.xml进行更新。这部分工作正常。 这些代码构成了java类 ... Liquibase liquibase = new Liquibase(CHANGE_LOG, new ClassLoaderResourceAccessor(getClass().

我正在windows环境中做一个tomcat应用程序,部署时在oracle数据库上创建/更新数据库模式。为此,我使用的是Liquibase SDK 3.3.2。因此,基本上我调用SDK,告诉它从我的changelog.xml进行更新。这部分工作正常。 这些代码构成了java类

...
Liquibase liquibase = new Liquibase(CHANGE_LOG,
                new ClassLoaderResourceAccessor(getClass().getClassLoader()), db);

liquibase.update("");
问题是,当出现问题时,我从命令行执行回滚,什么都不会发生。我没有收到异常或错误消息。只有一条消息回滚成功,但在数据库中没有任何更改。现在有趣的是,当我从cmd更新我的更改日志文件,然后从cmd执行回滚时,回滚工作正常。命令行调用如下所示:

Liquibase --changeLogFile=C:\myProject\src\main\resources\database\master.xml  --logLevel=DEBUG rollbackCount 5
我的liquibase.properties文件如下所示:

driver: oracle.jdbc.OracleDriver 
classpath:ojdbc6.jar 
url: jdbc:oracle:thin:@192.168.56.101:1521:orcl
username: myUser
password: mypassword

问题是,有些人知道为什么会发生这种情况吗?SDK和cmd工具之间是否存在不兼容

问题是更改日志文件的路径。Liquibase在某个地方存储到chengeLog的路径,并在调用时将其复制到给定的更改日志中。如果他们不是同一个液化者,他们只会在没有变更记录和警告的情况下继续进行

因此,在我从tomcat应用程序调用Liquibase时,路径是:database\master.xml,从控制台调用时,我在命令行中给出了路径C:\myProject\src\main\resources\database\master.xml。这导致该方法返回null,尽管Liquibase知道变更日志的路径。这就是它不起作用的原因

解决方法是从命令行使用相对路径从应用程序使用的同一文件夹调用liquibase

技术原因:
调试完后我发现了这个。尽管chanegeLog路径正确,但方法DatabaseChageLog.getChangeSet返回null。在方法Liquibase.rollbackint changesToRollback、Contexts、LabelExpression LabelExpression中为RollbackVisitor运行创建ChangeLogIterator时会发生这种情况。ValidationVisitor不会发生这种情况,因为ChangeLogIterator的创建方式不同,因此我没有收到任何错误\警告。问题是更改日志文件的路径。Liquibase在某个地方存储到chengeLog的路径,并在调用时将其复制到给定的更改日志中。如果他们不是同一个液化者,他们只会在没有变更记录和警告的情况下继续进行

因此,在我从tomcat应用程序调用Liquibase时,路径是:database\master.xml,从控制台调用时,我在命令行中给出了路径C:\myProject\src\main\resources\database\master.xml。这导致该方法返回null,尽管Liquibase知道变更日志的路径。这就是它不起作用的原因

解决方法是从命令行使用相对路径从应用程序使用的同一文件夹调用liquibase

技术原因:
调试完后我发现了这个。尽管chanegeLog路径正确,但方法DatabaseChageLog.getChangeSet返回null。在方法Liquibase.rollbackint changesToRollback、Contexts、LabelExpression LabelExpression中为RollbackVisitor运行创建ChangeLogIterator时会发生这种情况。ValidationVisitor不会发生这种情况,因为ChangeLogIterator的创建方式不同,这就是为什么我没有收到任何错误\警告的原因。为了其他读者的利益,我想补充我的经验和理解

了解从命令行运行回滚时发生的情况非常重要

Liquibase通过-changeLogFile参数查阅您提供的变更日志文件

它将遍历此文件中提到的变更集,将其校验和与DATABASECHANGELOG数据库表中相应记录的校验和进行比较

现在重要的一点是:校验和是根据文件名计算的,包括路径和文件内容

如果校验和不匹配,则变更集不符合回滚条件

如果从web应用程序内部运行Liquibase,则Liquibase更改日志很可能位于类路径上,这意味着DATABASECHANGELOG表中的文件名列以类路径为前缀:


为了其他读者的利益,我想补充我的经验和理解

了解从命令行运行回滚时发生的情况非常重要

Liquibase通过-changeLogFile参数查阅您提供的变更日志文件

它将遍历此文件中提到的变更集,将其校验和与DATABASECHANGELOG数据库表中相应记录的校验和进行比较

现在重要的一点是:校验和是根据文件名计算的,包括路径和文件内容

如果校验和不匹配,则变更集不符合回滚条件

如果你在一个酒吧里喝烈酒 在web应用程序中,Liquibase changelog很可能位于类路径上,这意味着DATABASECHANGELOG表中的filename列以类路径作为前缀:


使用rollbackCountSQL命令查看将应用的SQL。Hi已经尝试过了。来自SDK的相同效果更新和来自命令行no SLQ的回滚。从命令行更新和从命令行回滚我获得了正确的SQL使用rollbackCountSQL命令查看将应用的SQL。Hi已经尝试过了。来自SDK的相同效果更新和来自命令行no SLQ的回滚。从命令行更新并从命令行回滚我得到了正确的SQL ID AUTHOR FILENAME CreateWidgetTable NabilH classpath:liquibase/sprint1/create.widget.table.xml
java -jar lib/liquibase-core-3.5.3.jar\
    --url=jdbc:h2:tcp://localhost/~/test --username=sa --password=\
    --logLevel=DEBUG --classpath=/opt/tomcat9/webapps/springLiquibase.war\
    --changeLogFile=liquibase/changelog.xml rollback v1