【发布时间】:2016-09-05 16:08:00
【问题描述】:
我们开始..
我们有一个 Spring Boot 1.4.0 应用程序,我们正在使用 Liquibase 3.5.1 进行数据库管理。
我们所有的单独变更集文件都位于 /src/main/resources/db/changelog 中,它们具有以下命名架构:[semanticVersion]-[descriptor].yml
然而,主变更日志位于运行时依赖项中。
db.changelog-master.yaml
databaseChangeLog:
- changeSet:
id: 1.0.1
author: atlassian
changes:
- createTable:
//code omitted for brevity
- includeAll:
path: classpath*:db/changelog
errorIfMissingOrEmpty: false
现在问题来了。
通过 IDEA 运行应用程序,所有变更集都已加载并应用于我们的数据库。
但是,当我使用 Spring Boot Gradle 插件构建一个胖 jar(bootRepackage 任务)然后继续使用java -jar [project].jar 运行它时,找到了主更改日志,创建了表,但所有其他文件似乎..忽略。 databasechangelog 表仅显示 1.0.1 更新,仅此而已。有趣的事实是,如果我将error 属性设置为true,它只会在我也将path 设置为无法解决的问题时失败。所以看起来目录找到就好了。
注意!所有.yml 文件都在fat jar 中,经过检查和仔细检查:)
我也尝试将它们重命名为.yaml,我尝试将它们替换为相应的.xml 文件,但没有任何解决。
我在 Google、Stack 和 Liquibase JIRA 上进行了挖掘,发现只有少数提到了这种情况,从我读到的内容来看,在 3.5.1 上,这个问题应该已经解决了。但没有骰子。
如果我将 Liquibase 依赖项切换回 3.4.2(这被认为是一种可能的解决方案)并运行 jar,我会得到几千行异常,最终以 Exception 说db.changelog-master.yaml 未被识别为正确的文件,并且无法找到 DatabaseChangeLog 节点。
如果我错过了任何重要信息,请告诉我,我会尽量详细说明。
【问题讨论】:
-
似乎 spring-boot 1.4.0 不适用于 liquibase - 请参阅 liquibase.jira.com/browse/CORE-2863
-
即使问题已解决,在使用 maven 启动集成测试时,我仍然遇到与 liquibase 3.5.2、3.5.3(jar 文件中的 includeAll:db/changelog/sql)相同的问题。从 IDE 启动集成测试时没有问题。我必须降级到 3.4.1 或改用
include而不是includeAll -
也许这与stackoverflow.com/q/41678616/4864870有关。有一些技术细节可以帮助 liquibase 开发人员找到问题。
标签: spring spring-boot liquibase