Maven:如何在每次Liquibase插件执行前执行初始化操作
解决方案:将Docker与Liquibase无缝整合进Maven生命周期
核心逻辑
把数据库初始化操作绑定到每个Liquibase插件执行的前置步骤,同时严格对齐Maven构建阶段:
pre-integration-test:启动Docker MySQL容器并等待服务就绪integration-test:执行多轮Liquibase任务,每轮任务前通过root用户完成数据库初始化post-integration-test:停止并清理Docker容器及数据卷
具体配置步骤
1. 用Docker Maven插件管理容器生命周期
在pom.xml中配置docker-maven-plugin,将容器启停绑定到对应阶段:
<plugin> <groupId>io.fabric8</groupId> <artifactId>docker-maven-plugin</artifactId> <version>0.40.2</version> <executions> <!-- 启动MySQL容器 --> <execution> <id>start-mysql</id> <phase>pre-integration-test</phase> <goals> <goal>start</goal> </goals> <configuration> <images> <image> <name>mysql:8.0</name> <run> <env> <MYSQL_ROOT_PASSWORD>root</MYSQL_ROOT_PASSWORD> </env> <ports> <port>3306:3306</port> </ports> <wait> <tcp> <port>3306</port> <time>30000</time> </tcp> </wait> </run> </image> </images> </configuration> </execution> <!-- 停止并清理容器 --> <execution> <id>stop-mysql</id> <phase>post-integration-test</phase> <goals> <goal>stop</goal> </goals> <configuration> <removeVolumes>true</removeVolumes> </configuration> </execution> </executions> </plugin>
2. 配置root用户的数据库初始化插件
使用sql-maven-plugin执行root权限的初始化脚本,同时为每个Liquibase任务绑定前置初始化操作:
第一步:定义数据库连接参数
<properties> <!-- Root用户连接信息 --> <db.root.url>jdbc:mysql://localhost:3306/mysql?allowPublicKeyRetrieval=true&useSSL=false</db.root.url> <db.root.user>root</db.root.user> <db.root.password>root</db.root.password> <!-- 业务库连接信息 --> <db.url>jdbc:mysql://localhost:3306/test_db?allowPublicKeyRetrieval=true&useSSL=false</db.url> <db.user>test_user</db.user> <db.password>test_pass</db.password> </properties>
第二步:绑定初始化操作到Liquibase前置步骤
假设你有多个Liquibase任务(如update、rollback),为每个任务单独配置前置初始化:
<!-- SQL初始化插件 --> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>sql-maven-plugin</artifactId> <version>1.5</version> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> </dependency> </dependencies> <configuration> <driver>com.mysql.cj.jdbc.Driver</driver> <url>${db.root.url}</url> <username>${db.root.user}</username> <password>${db.root.password}</password> <!-- 自定义初始化逻辑:创建库、用户、授权等 --> <sqlCommand> DROP DATABASE IF EXISTS test_db; CREATE DATABASE test_db; CREATE USER IF NOT EXISTS 'test_user'@'%' IDENTIFIED BY 'test_pass'; GRANT ALL PRIVILEGES ON test_db.* TO 'test_user'@'%'; FLUSH PRIVILEGES; </sqlCommand> </configuration> </plugin> <!-- Liquibase插件配置 --> <plugin> <groupId>org.liquibase</groupId> <artifactId>liquibase-maven-plugin</artifactId> <version>4.22.0</version> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> </dependency> </dependencies> <executions> <!-- 第一个Liquibase任务:update --> <execution> <id>liquibase-update</id> <phase>integration-test</phase> <!-- 先执行SQL初始化,再执行Liquibase --> <goals> <goal>execute</goal> <goal>update</goal> </goals> <configuration> <changeLogFile>src/main/resources/db/changelog/db.changelog-master.xml</changeLogFile> <url>${db.url}</url> <username>${db.user}</username> <password>${db.password}</password> </configuration> </execution> <!-- 第二个Liquibase任务:rollback --> <execution> <id>liquibase-rollback</id> <phase>integration-test</phase> <goals> <goal>execute</goal> <goal>rollback</goal> </goals> <configuration> <changeLogFile>src/main/resources/db/changelog/db.changelog-master.xml</changeLogFile> <url>${db.url}</url> <username>${db.user}</username> <password>${db.password}</password> <rollbackCount>1</rollbackCount> </configuration> </execution> </executions> </plugin>
验证执行流程
运行mvn clean verify,会按以下顺序自动执行:
pre-integration-test:启动MySQL容器,等待3306端口就绪integration-test:- 执行root权限的数据库初始化
- 执行第一个Liquibase任务
- 再次执行root权限的数据库初始化
- 执行第二个Liquibase任务
- (所有Liquibase任务依次执行,每轮前都重置数据库)
post-integration-test:停止并删除MySQL容器,清理数据卷
内容的提问来源于stack exchange,提问作者Victor Rodriguez
相关产品推荐
相关产品推荐

