You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,会按以下顺序自动执行:

  1. pre-integration-test:启动MySQL容器,等待3306端口就绪
  2. integration-test:
    • 执行root权限的数据库初始化
    • 执行第一个Liquibase任务
    • 再次执行root权限的数据库初始化
    • 执行第二个Liquibase任务
    • (所有Liquibase任务依次执行,每轮前都重置数据库)
  3. post-integration-test:停止并删除MySQL容器,清理数据卷

内容的提问来源于stack exchange,提问作者Victor Rodriguez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 11:05:15