我使用liquibase已有好几年了,作为应用程序开发人员,我对源代码和数据库同步非常有帮助,所以感谢所有贡献者使用这个工具。
在我的日常工作中,我通常从命令行启动liquibase以测试变更集和数据库操作。如果一切正确,我启动我的应用程序(Spring Boot),应用程序中的liquibase设置执行所有这些同步步骤。除非我的更改日志文件包含带有loaddata
的更改集,以便将CSV文件中的数据填充到数据库中,否则这些设置将非常有效。每个应用程序启动失败,并显示liquibase.exception.ValidationFailedException: Validation Failed:
change sets check sum
原因似乎是loaddata
中提到的CVS文件的不同文件位置,它们是校验和计算的一部分。如果来自应用程序的startet,变更集如下所示:
classpath:liquibase/changelog.xml: classpath:liquibase/changelog.xml::loadDefaultRolePermissions::dominik
但是如果从命令行启动,则无法使用类路径资源,变更集信息看起来像那样
liquibase: src/main/resources/liquibase/changelog.xml: src/main/resources/liquibase/changelog.xml::loadDefaultRolePermissions::dominik
两个值都不同,导致校验和不同。
如果查看liquibase.integration.commandline.Main.java,则没有使用类路径资源访问器:
FileSystemResourceAccessor fsOpener = new FileSystemResourceAccessor();
CommandLineResourceAccessor clOpener = new CommandLineResourceAccessor(classLoader);
CompositeResourceAccessor fileOpener = new CompositeResourceAccessor(fsOpener, clOpener);
来自liquibase.integration.commandline.Main.java
有没有办法让liquibase在命令行和应用程序启动运行之间可以互操作?
提前致谢
多米尼克
答案 0 :(得分:0)
通过从liquibase 3.3.1更新到3.5.3来解决