如何通过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
相关产品推荐
相关产品推荐

