gradle自定义插件通过buildsrc或独立二进制方式复用构建逻辑,结合version catalogs统一依赖、gradlerunner保障可靠性。

在 Gradle 中编写自定义 Plugin,核心目标是把重复的构建逻辑(比如统一依赖版本、代码检查规则、打包方式、发布流程)抽出来,让多个项目或模块能一致调用,避免每个 build.gradle 里粘贴复制。
用 buildSrc 快速封装可复用插件
buildSrc 是 Gradle 内置的“本地插件开发区”,目录结构类似普通 Java/Kotlin 项目,Gradle 会自动编译它并加入构建类路径。适合企业内部单体或多模块项目快速落地统一逻辑。
- 在项目根目录下新建
buildSrc文件夹,按标准结构组织:buildSrc/src/main/kotlin/MyCompanyJavaPlugin.kt - 插件类实现
Plugin<project></project>接口,在apply方法中配置任务、扩展 DSL、修改依赖解析等 - 在
buildSrc/src/main/resources/META-INF/gradle-plugins/下添加属性文件(如com.example.java-conventions.properties),内容为implementation-class=com.example.MyCompanyJavaPlugin - 其他模块只需
plugins { id("com.example.java-conventions") }即可启用
用独立二进制插件支持跨项目共享
当需要在多个不相关的 Git 仓库间复用(比如不同业务线的 Android 和后端服务),推荐发布为独立的二进制插件 JAR,托管在私有 Maven 仓库(如 Nexus 或 Artifactory)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 新建一个 Gradle 子项目(如
gradle-plugins),用java-gradle-plugin插件声明其为插件工程 - 编写插件类时,可利用
project.extensions.create()暴露配置闭包,让使用者灵活调整(例如javaConventions { strictVersion = true }) - 通过
publishToMavenLocal本地验证,再用publish推送到私仓 - 下游项目在
settings.gradle的pluginManagement块中声明仓库地址和插件 ID 映射
结合 Version Catalogs 统一依赖管理
插件本身不硬编码版本号,而是配合 libs.versions.toml 实现版本集中声明,提升可维护性。
- 在插件中通过
project.extensions.findByType<versioncatalogsextension>()</versioncatalogsextension>获取 catalog 实例 - 用
libs.findLibrary("junit").get()动态引用依赖,避免插件与具体版本耦合 - 企业可在 catalog 中定义 BOM(如
spring-boot-bom),插件自动platform(...)导入,确保模块间依赖对齐
加 GradleRunner 测试保证插件可靠性
插件行为不能只靠“跑一下看有没有报错”,要用 GradleRunner 编写集成测试,模拟真实构建场景。
- 在插件项目的
src/test/kotlin中创建测试类,用GradleRunner.create().withProjectDir(testProjectDir).withArguments("build").build() - 验证关键输出:是否生成了预期的 JAR、是否执行了 Checkstyle 任务、是否拒绝了未声明的 SNAPSHOT 依赖等
- 测试数据可放在
src/test/resources/sample-project,覆盖 Java、Kotlin、Android 等典型结构










