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().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 的路径,并在调用时将其映射到给定的更改日志。如果它们不相同,Liquibase 将在没有更改日志和警告的情况下继续进行。

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

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

技术原因: 在 debuggin LB 之后我发现了这个。尽管 chanegeLog 路径正确,方法 DatabaseChageLog.getChangeSet() 返回 null。在 Liquibase.rollback(int changesToRollback, Contexts contexts, LabelExpression labelExpression) 方法中创建用于运行 RollbackVisitorChangeLogIterator 时会发生这种情况。 ValidationVisitor 不会发生这种情况,因为 ChangeLogIterator 的创建方式不同,这就是我没有收到任何错误\警告的原因

关于java - 从命令行回滚 Liquibase 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29147769/

相关文章:

bash - 从 Cygwin 调用 liquibase 命令行

java - 由于 StandardLockService 中 Oracle 上的 Liquibase 问题,Spring-Boot 应用程序无法启动

yaml - 在 Liquibase 中,如何在 YAML 更改日志中指定逻辑文件路径?

javascript - 使用 GWT 通过 HTTP POST 下载文件

java - 使 LinkedBinaryTree 可克隆

java - 单击时更改所有按钮的背景

java - Java-这种使用java/lang/ProcessBuilder。<init>([Ljava/lang/String;)V可能容易受到命令注入(inject)(Sonar)的攻击

java - 重绘占用CPU过多

mysql - 如何在Mysql中选择varchar大小?

java - 在 liquibase CustomTaskChange 类中使用其他 spring bean