我正在使用Spring Boot 2.0.1和 liquibase-core-3.5.5
.
当我从IntelliJ运行应用程序(将运行 main()
方法)时,我在Liquibase数据库列 database.filename
中看到以下类型的值:
db/changelog/changes/v0001.sql
如果我使用嵌入式Tomcat创建一个胖jar并运行该应用程序,则相同的变更集将在数据库中显示为:
BOOT-INF/classes/db/changelog/changes/v0001.sql
我希望这些值匹配,以便我可以将我的应用程序作为JAR文件运行,但如果需要调试则从IntelliJ连接到远程数据库 . (注意:这将是一个测试数据库,我不会以这种方式调试 生产环境 ) .
我找到了对 logicalFilePath
的引用(例如this SO question),但我不相信这会提供我需要的东西 .
我也尝试调试Liquibase代码以确定是否有一种方法可以改变这个值 . 我最接近的是这两个观察结果:
如果有办法使这些一致,或者可能只是将 filename
列更改为实际文件名(例如 v0001.sql
),那将是最好的 .
UPDATE
我在Spring Boot中将Liquibase设置如下:
我的 resources/db/changelog/db.changelog-master.yaml
文件包含以下内容:
databaseChangeLog:
- includeAll:
path: db/changelog/changes/
然后在 resources/db/changelog/changes
我有单独的 *.sql
文件,其中包含我想要运行的SQL . 我不记得我在哪里找到了这个设置,但我没有具体的"changesets",这对我来说是个错误吗?
3 回答
logicalFilePath
属性正是您想要的 . 我的项目遇到了同样的问题,我用maven执行了一些部件,有些部件用spring-boot执行 . this question也可以帮到你 .在每个变更集上设置
logicalFilePath
. 这将确保DATABASECHANGELOG.FILENAME
列保持一致,并且不依赖于变更集文件as explained in this post的物理结帐目录 .我能够通过不再使用
db.changelog-master.yaml
文件中的includeAll
选项来使用它 .includeAll
选项是一种快速入门(并处理特定目录中的所有文件)的有用方法,但对于常规使用来说似乎是不可取的 . 如上所述here .这就是我之前在
db.changelog-master.yaml
, don't use it this way 中所拥有的 .这是我将其更新为:
需要注意的重要一点是,我按照我想要的顺序列出了我想要包含的每个文件 . 这有点麻烦,但值得改变 .
在原始版本中,
databasechangelog.filename
列将根据应用程序的执行方式而有所不同:db/changelog/changes/v0001_users.sql
是从IntelliJ运行时列的显示方式BOOT-INF/classes/db/changelog/changes/v0001_users.sql
是从可执行jar运行时列的显示方式 .进行更改后,上述两个选项都相同,不再包含
BOOT-INF/classes/
作为前缀 .感谢其他答案帮助我指明正确的方向!