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

如何通过Maven实现Jar包执行时运行Liquibase及兼容新版本插件?

解决方案:执行Jar时运行Liquibase并兼容新版本插件

一、核心思路

要脱离Maven构建阶段,在Jar运行时触发Liquibase,本质是将Liquibase的执行逻辑与应用打包在一起,通过命令行指定执行入口,或嵌入应用启动流程中。同时通过调整依赖和配置,解决新版本插件的兼容问题。

二、步骤1:调整项目依赖(兼容新版本Liquibase)

将Liquibase核心依赖从插件内部移到项目直接依赖,确保新版本能被打进可执行Jar:

<dependencies>
    <!-- 替换为你需要的Liquibase新版本,例如4.25.0 -->
    <dependency>
        <groupId>org.liquibase</groupId>
        <artifactId>liquibase-core</artifactId>
        <version>4.25.0</version>
    </dependency>
    <!-- 保留数据库驱动依赖 -->
    <dependency>
        <groupId>org.mariadb.jdbc</groupId>
        <artifactId>mariadb-java-client</artifactId>
        <version>3.1.2</version>
    </dependency>
    <!-- Spring项目需额外引入集成依赖,普通Java项目可忽略 -->
    <!-- <dependency>
        <groupId>org.liquibase</groupId>
        <artifactId>liquibase-spring</artifactId>
        <version>4.25.0</version>
    </dependency> -->
</dependencies>

三、步骤2:配置可执行Jar打包

完善maven-assembly-plugin配置,确保打包的Jar包含所有依赖,并可指定主类:

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>3.6.0</version>
    <configuration>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        <archive>
            <manifest>
                <!-- 配置你的应用主类,或后续通过命令指定Liquibase主类 -->
                <mainClass>com.yourpackage.YourApplicationMain</mainClass>
            </manifest>
        </archive>
    </configuration>
    <executions>
        <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

四、方式A:命令行直接触发Liquibase(无需修改代码)

打包完成后,通过java -cp指定Jar包,调用Liquibase官方主类执行更新:

# 直接传入参数执行
java -cp target/your-project-jar-with-dependencies.jar liquibase.integration.commandline.Main \
--changeLogFile=src/main/resources/db/changelog/db.changelog-master.xml \
--url=jdbc:mariadb://localhost:3306/your_db \
--username=root \
--password=your_password \
update

或引用外部配置文件:

java -cp target/your-project-jar-with-dependencies.jar liquibase.integration.commandline.Main \
--defaultsFile=src/main/resources/liquibase.properties \
update

五、方式B:嵌入应用启动流程(自动触发)

如果希望启动应用时自动执行Liquibase,在主类中添加执行逻辑:

import liquibase.Liquibase;
import liquibase.database.Database;
import liquibase.database.DatabaseFactory;
import liquibase.database.jvm.JdbcConnection;
import liquibase.resource.ClassLoaderResourceAccessor;
import java.sql.Connection;
import java.sql.DriverManager;

public class YourApplicationMain {
    public static void main(String[] args) throws Exception {
        // 1. 执行Liquibase更新
        String url = "jdbc:mariadb://localhost:3306/your_db";
        String username = "root";
        String password = "your_password";
        String changeLogFile = "db/changelog/db.changelog-master.xml";

        try (Connection conn = DriverManager.getConnection(url, username, password)) {
            Database database = DatabaseFactory.getInstance().findCorrectDatabaseImplementation(new JdbcConnection(conn));
            Liquibase liquibase = new Liquibase(changeLogFile, new ClassLoaderResourceAccessor(), database);
            liquibase.update("");
            System.out.println("Liquibase更新完成");
        }

        // 2. 启动应用核心逻辑
        // yourApplicationStartupLogic();
    }
}

运行Jar时会先执行Liquibase,再启动应用。

六、解决新版本Liquibase Maven插件兼容问题

旧版本3.10.3能运行但新版本失败,通常是配置或依赖冲突导致:

  • 新版本插件推荐用defaultsFile替代propertyFile,保持路径正确
  • 移除插件内部的数据库驱动依赖,改用项目全局依赖避免版本冲突
  • 确保JDK版本符合要求(新版本Liquibase需Java 8+)

调整后的新版本插件配置(若需保留构建阶段手动执行的选项):

<plugin>
    <groupId>org.liquibase</groupId>
    <artifactId>liquibase-maven-plugin</artifactId>
    <version>4.25.0</version>
    <configuration>
        <defaultsFile>${liquibase.propertyFile}</defaultsFile>
    </configuration>
    <executions>
        <execution>
            <phase>none</phase> <!-- 取消构建阶段自动执行,仅手动触发 -->
            <goals>
                <goal>update</goal>
            </goals>
        </execution>
    </executions>
</plugin>

手动触发构建阶段执行:mvn liquibase:update

七、exec-maven-plugin的正确用法(补充)

若想用该插件在Maven打包后执行Liquibase(仍属于构建生命周期,非Jar运行时),配置如下:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>3.1.0</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>java</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <mainClass>liquibase.integration.commandline.Main</mainClass>
        <arguments>
            <argument>--defaultsFile=${liquibase.propertyFile}</argument>
            <argument>update</argument>
        </arguments>
    </configuration>
</plugin>

但这和「执行Jar时运行」的需求不符,前面的方式A/B才是Jar运行时触发的方案。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 21:37:40