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

Gradle Kotlin DSL:如何跨多仓库共享工具函数

可行的复用方案

方案1:打包成二进制Gradle插件(首推)

脚本插件容易踩类路径的坑,二进制插件是多仓库复用工具代码最稳定的方式,完全适配你50+仓库的场景。

步骤1:搭建插件项目

新建一个独立的Gradle项目,配置build.gradle.kts:

plugins {
    `java-gradle-plugin`
    kotlin("jvm") version "1.9.0"
    `maven-publish`
}

group = "com.yourcompany.gradle"
version = "1.0.0"

gradlePlugin {
    plugins {
        create("systemPropertiesHelper") {
            id = "com.yourcompany.gradle.system-properties-helper"
            implementationClass = "com.yourcompany.gradle.SystemPropertiesHelperPlugin"
        }
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation(kotlin("stdlib-jdk8"))
}

步骤2:编写插件逻辑与扩展函数

在src/main/kotlin/com/yourcompany/gradle/下创建两个文件:

// SystemPropertiesHelperPlugin.kt
import org.gradle.api.Plugin
import org.gradle.api.Project

class SystemPropertiesHelperPlugin : Plugin<Project> {
    override fun apply(project: Project) {
        // 插件空实现即可,核心是把扩展函数带入类路径
    }
}
// SystemPropertiesExtensions.kt
import java.util.Properties

// 顶层扩展函数,引入插件后全局可用
fun Properties.toStringMap(): Map<String, String> =
    this.toMap().map { it.key.toString() to it.value.toString() }.toMap()

步骤3:发布插件

将插件推送到内部Maven仓库,或先本地测试:

./gradlew publishToMavenLocal

步骤4:业务项目中使用

先在settings.gradle.kts添加仓库地址:

pluginManagement {
    repositories {
        mavenLocal() // 本地测试用
        maven { url = uri("https://你的内部仓库地址") }
        gradlePluginPortal()
    }
}

然后在build.gradle.kts引入插件:

plugins {
    id("com.yourcompany.gradle.system-properties-helper") version "1.0.0"
}

// 直接复用你的原代码
tasks.withType<JavaExec> {
    systemProperties = System.getProperties().toStringMap()
}

方案2:使用共享buildSrc(小范围快速复用)

如果不想搞独立插件,用buildSrc共享代码也能快速实现复用,适合内部团队小范围场景。

步骤1:创建共享buildSrc项目

单独搭建一个buildSrc项目,目录结构如下:

buildSrc/
├── build.gradle.kts
└── src/main/kotlin/
    └── SystemPropertiesExtensions.kt

build.gradle.kts配置:

plugins {
    kotlin("jvm") version "1.9.0"
}

repositories {
    mavenCentral()
}

SystemPropertiesExtensions.kt直接放入你的扩展函数:

import java.util.Properties

fun Properties.toStringMap(): Map<String, String> =
    this.toMap().map { it.key.toString() to it.value.toString() }.toMap()

步骤2:业务项目引入

在业务项目的settings.gradle.kts中添加:

includeBuild("../path/to/你的共享buildSrc")

之后业务项目的构建脚本就能直接调用toStringMap(),无需额外配置。

方案3:修复脚本插件问题

你之前尝试脚本插件失败,大概率是类路径处理不当,试试以下写法:

步骤1:编写脚本插件文件system-properties-helper.gradle.kts

import java.util.Properties

// 直接定义扩展函数,脚本应用后全局可见
fun Properties.toStringMap(): Map<String, String> =
    this.toMap().map { it.key.toString() to it.value.toString() }.toMap()

// 可选:自动给所有JavaExec任务配置,省去每个项目重复写代码
tasks.withType<JavaExec> {
    systemProperties = System.getProperties().toStringMap()
}

步骤2:共享脚本

将该脚本上传到内部Git仓库或HTTP服务器,业务项目直接引用:

apply(from = "https://你的内部服务器地址/scripts/system-properties-helper.gradle.kts")

这种方式比二进制插件灵活,但稳定性稍差(比如脚本地址变更会导致失败),适合临时复用场景。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 18:37:42