我正在 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) 方法中创建用于运行 RollbackVisitor 的 ChangeLogIterator 时会发生这种情况。 ValidationVisitor 不会发生这种情况,因为 ChangeLogIterator 的创建方式不同,这就是我没有收到任何错误\警告的原因
关于java - 从命令行回滚 Liquibase 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29147769/