如何将build.gradle中的Liquibase迁移配置抽离为独立Java插件?
当然可以!把重复的Liquibase迁移配置抽成Gradle插件完全可行,既能精简项目配置,又能统一多项目的迁移规则。下面分两种场景给出具体实现方案:
一、本地复用插件(适用于同仓库多项目)
如果你的多个项目都在同一个Gradle根仓库下,用buildSrc目录做本地插件最方便,Gradle会自动识别并编译这个目录下的代码:
- 创建buildSrc目录结构
在根项目下新建如下结构:
buildSrc/ ├── build.gradle └── src/main/groovy/com/yourcompany/LiquibaseMigrationPlugin.groovy
- 配置buildSrc的build.gradle
添加Gradle插件开发和Liquibase依赖:
plugins { id 'groovy' id 'java-gradle-plugin' } repositories { mavenCentral() } dependencies { implementation gradleApi() implementation localGroovy() // 引入Liquibase Gradle插件依赖 implementation 'org.liquibase:liquibase-gradle-plugin:2.2.0' } gradlePlugin { plugins { liquibaseMigration { id = 'com.yourcompany.liquibase-migration' implementationClass = 'com.yourcompany.LiquibaseMigrationPlugin' } } }
- 编写插件核心逻辑
在LiquibaseMigrationPlugin.groovy里封装原来的配置逻辑:
package com.yourcompany import org.gradle.api.Plugin import org.gradle.api.Project class LiquibaseMigrationPlugin implements Plugin<Project> { void apply(Project project) { // 应用Liquibase插件 project.plugins.apply('org.liquibase.gradle') // 设置默认属性,外部未传参时用这些值 project.ext.set('url', project.hasProperty('url') ? project.property('url') : 'jdbc:postgresql://localhost:5432/test') project.ext.set('username', project.hasProperty('username') ? project.property('username') : 'test') project.ext.set('password', project.hasProperty('password') ? project.property('password') : 'test') project.ext.set('defaultSchemaName', project.hasProperty('defaultSchemaName') ? project.property('defaultSchemaName') : 'test') project.ext.set('changelogFile', project.hasProperty('changelogFile') ? project.property('changelogFile') : 'some-path/changelog-master.xml') // 配置Liquibase活动 project.liquibase { activities { main { driver 'org.postgresql.Driver' url project.ext.url username project.ext.username password project.ext.password defaultSchemaName project.ext.defaultSchemaName changelogFile project.ext.changelogFile } } } } }
- 在业务项目中使用插件
在任意子项目的build.gradle里只需一行代码应用插件,需要覆盖默认值时直接设置属性即可:
// 应用自定义插件 plugins { id 'com.yourcompany.liquibase-migration' } // 可选:覆盖默认配置,比如修改changelog路径 ext.changelogFile = 'my-project/changelog-master.xml'
之后执行./gradlew update就能和原来一样执行迁移。
二、独立发布插件(适用于跨仓库多项目)
如果要给不同仓库的项目复用,需要把插件发布到Maven仓库(本地或公司私服):
- 创建独立插件项目
新建一个单独的Gradle项目,结构和上述buildSrc类似,在build.gradle里添加发布配置:
plugins { id 'groovy' id 'java-gradle-plugin' id 'maven-publish' } // ... 保留前面的依赖和gradlePlugin配置 ... publishing { repositories { maven { // 发布到本地仓库,或替换成公司私服地址 url = uri("file://${System.properties['user.home']}/.m2/repository") } } }
发布插件
执行./gradlew publish将插件推送到目标仓库。在其他项目中引入插件
在目标项目的settings.gradle配置插件仓库,再在build.gradle里应用插件:
// settings.gradle pluginManagement { repositories { mavenLocal() // 或公司私服地址 gradlePluginPortal() } } // build.gradle plugins { id 'com.yourcompany.liquibase-migration' version '1.0.0' } // 可选:覆盖默认属性 ext.url = 'jdbc:postgresql://prod-db:5432/prod'
额外提示
- 如果用Kotlin写Gradle脚本,把插件类改成Kotlin版本即可,逻辑完全一致。
- 可以把数据库驱动(比如PostgreSQL)也封装到插件里,避免每个项目重复引入。
内容的提问来源于stack exchange,提问作者Isaev Maxim
相关产品推荐
相关产品推荐

