我正在 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("");
Run Code Online (Sandbox Code Playgroud)
问题是,当出现问题并且我从命令行执行回滚时,什么也没有发生。我没有收到任何异常或错误消息。只是一条消息“回滚成功”,但数据库中根本没有任何变化。现在有趣的是,当我从 cmd 更新更改日志文件,然后也从 cmd 进行回滚时,回滚就会起作用。命令行调用如下所示:
Liquibase --changeLogFile=C:\myProject\src\main\resources\database\master.xml --logLevel=DEBUG rollbackCount 5
Run Code Online (Sandbox Code Playgroud)
我的 liquibase.properties 文件如下所示:
driver: oracle.jdbc.OracleDriver
classpath:ojdbc6.jar
url: jdbc:oracle:thin:@192.168.56.101:1521:orcl
username: myUser
password: mypassword
Run Code Online (Sandbox Code Playgroud)
问题有人知道为什么会发生这种情况吗?SDK和cmd工具之间是否存在不兼容的情况?
问题出在更改日志文件的路径上。Liquibase 将 chengeLog 的路径存储在某处,并将其映射到调用时给定的更改日志。如果它们不相同,Liquibase 将继续运行,而不会出现更改日志和警告。
因此,在我的情况下,当从 tomcat 应用程序调用 Liquibase 时,路径为:database\master.xml,当从控制台调用它时,我在命令中给出了路径C:\myProject\src\main\resources\database\master.xml线。尽管 Liquibase 知道更改日志的路径,但这会导致该方法返回 null。这就是它不起作用的原因。
解决方法是使用相对路径从应用程序所在的同一文件夹中的命令行调用 liquibase。
技术原因: 在调试LB后我发现了这一点。尽管 changeLog 路径正确,但方法DatabaseChageLog.getChangeSet()返回 null。当在方法Liquibase.rollback(intchangesToRollback, Contexts contexts, LabelExpression labelExpression)中创建用于运行RollbackVisitor 的ChangeLogIterator时,会发生这种情况。ValidationVisitor不会发生这种情况,因为ChangeLogIterator的创建方式不同,这就是为什么我没有收到任何错误\警告
| 归档时间: |
|
| 查看次数: |
6571 次 |
| 最近记录: |