Liquibase spring boot BOOT-INF/classes/ 路径问题

Liquibase 配置如下:
  
  liquibase:
    enabled: true
    change-log: classpath:db/db-changelog.xml
    
   change-log.xml
   
   <includeAll  path="changelogs" relativeToChangelogFile="true" />
 
使用Main方法启动项目,脚本文件的路径: 
        classpath:db/changelogs/*

将项目使用spring boot打成执行jar,脚本文件的路径变成了
        BOOT-INF/classes/db/changelogs/*

因为路径不同的问题,导致脚本会执行多次出错

 

解决方法:

通过研究Liquibase源码,知道文件路径的解析是通过 XMLChangeLogSAXParser 
   
   通过自定义的实现的方式将 BOOT-INF/classes/ 移除,使两种启动方式的路径一致
   
   1. 编写自己的一个 XMLChangeLogSAXParser
       public class ChangeLogParser extends XMLChangeLogSAXParser
       
   2. 使Liquibase能扫描到我们的实现
      在 META-INF/MANIFEST.MF 中增加
        Liquibase-Package: com.xx (ChangeLogParser所在的包)
        
    完整的 ChangeLogParser 代码

public static class ChangeLogParser extends XMLChangeLogSAXParser
    {
        private final static String BOOT_CLASSES = "BOOT-INF/classes/";
        @Override
        public int getPriority() {
            return 2;
        }

        @Override
        public DatabaseChangeLog parse(String physicalChangeLogLocation, ChangeLogParameters changeLogParameters, ResourceAccessor resourceAccessor) throws ChangeLogParseException {
            DatabaseChangeLog log =  super.parse(physicalChangeLogLocation, changeLogParameters, resourceAccessor);
            Iterator<ChangeSet> iterator =  log.getChangeSets().iterator();
            while( iterator.hasNext() )
            {
                ChangeSet set =  iterator.next();
                String filePath = set.getFilePath();
                if( filePath.startsWith(BOOT_CLASSES) )
                {
                    set.setFilePath(filePath.substring(BOOT_CLASSES.length()));
                }
            }
            return log;
        }
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值