MeteorCat / Gradle使用

Created Sat, 09 Aug 2025 15:51:12 +0800 Modified Wed, 29 Oct 2025 23:25:00 +0800
1546 Words

最近后续项目可能要做 Android 客户端对接, 为了前后端统一后续可能采用 gradle + java 方案, 所以先做好一定知识积累方便后续从 maven 转为 gradle.

gradle 主要有两种方式:

  • 全局二进制命令行 : https://gradle.org/releases 下载 GRADLE_HOME 和 GRADLE_HOME/bin 设为全局命令
  • Gradle Wrapper: 把二进制放置在项目之中, 加入版本库保证所有团队成员使用相同版本构建和启动

建议采用 Gradle Wrapper 方式, 这样可以避免团队成员可能因为不同版本导致构建打包问题, 打包可以用以下配置提高构建性能:

  • 启用构建缓存:org.gradle.caching=true
  • 配置适当的 JVM 内存:org.gradle.jvmargs=-Xmx2g
  • 使用并行构建:org.gradle.parallel=true

目前 gradle 引入两种打包构建脚本:

  • Gradle-Groovy: 更像是传统脚本语言, 采用空格隔开作为每个参数
  • Gradle-Kotlin: 类型安全并且对于客户端支持更加稳健, 官方比较推荐的打包脚本

Gradle-Kotlin 创建初始化之后会默认带有两个打包文件:

  • build.gradle.kts: 打包构建脚本
  • settings.gradle.kts: 属性参数清单

之前 gradle 在国内远不如 maven, 我这边采用 IDEA 直接初始化, 主要看下 build.gradle.kts 配置说明:

// 声明项目采用的打包语言
plugins {
    id("java")
}

// 打包程序包名
group = "com.meteorcat.api"

// 打包程序版本
version = "1.0-SNAPSHOT"


// 采用的第三方包仓库
repositories {
    mavenCentral()

    // 国内可能需要配置其他第三方镜像仓库
}

// 采用的第三方包
dependencies {
    testImplementation(platform("org.junit:junit-bom:5.10.0"))
    testImplementation("org.junit.jupiter:junit-jupiter")
}

// 启动测试单元是否的启动入口
tasks.test {
    // 采用 JUnit 来做测试
    useJUnitPlatform()
}

之后就是 settings.gradle.kts 属性清单就更加简单:

rootProject.name = "payments" // 程序名称

需要注意, 因为国内镜像仓库问题导致下载打包缓慢甚至卡顿, 所以需要按照以下流程转为国内镜像地址:

  1. 找到项目根目录下 gradle/wrapper/gradle-wrapper.properties
  2. 文件的 distributionUrl 设置为国内 gradle-wrapper 地址
  3. 设置地址 distributionUrl=https\://mirrors.aliyun.com/gradle/distributions/v8.13.0/gradle-8.13-all.zip

这样就能明显加速 gradle-wrapper 下载速度, 之后就是配置第三方镜像库:

// 采用的第三方包仓库, 删除原来的 repositories 区块

// 打包系统的配置仓库
buildscript {
    repositories {
        // 国内镜像仓库(优先)
        maven { url = uri("https://maven.aliyun.com/repository/google") } // 替代 google()
        maven { url = uri("https://maven.aliyun.com/repository/central") } // 替代 mavenCentral()
        maven { url = uri("https://maven.aliyun.com/repository/gradle-plugin") } // 替代 Gradle 插件仓库
        maven { url = uri("https://maven.aliyun.com/repository/public") } // 综合仓库

        // 保留原仓库(作为 fallback,可选)
        google()
        mavenCentral()
        gradlePluginPortal()
    }
}

// 子模块的仓库配置
allprojects {
    repositories {
        maven { url = uri("https://maven.aliyun.com/repository/google") }
        maven { url = uri("https://maven.aliyun.com/repository/central") }
        maven { url = uri("https://maven.aliyun.com/repository/public") }
        mavenLocal()
        mavenCentral()
    }
}

设置完成之后重新 gradle 同步即可, 可以有效加速国内的镜像资源的获取, 这里提供比较基础的配置文件:

// 声明项目采用的插件
// java(常规), java-library(库), application(应用)
plugins {
    id("java")
}

// 打包程序包名
group = "com.meteorcat.api"

// 打包程序版本
version = "1.0-SNAPSHOT"

// 应用详情
description = "测试 gradle 打包项目"


// 打包系统的配置仓库
buildscript {
    repositories {
        // 国内镜像仓库(优先)
        maven { url = uri("https://maven.aliyun.com/repository/google") } // 替代 google()
        maven { url = uri("https://maven.aliyun.com/repository/central") } // 替代 mavenCentral()
        maven { url = uri("https://maven.aliyun.com/repository/gradle-plugin") } // 替代 Gradle 插件仓库
        maven { url = uri("https://maven.aliyun.com/repository/public") } // 综合仓库

        // 保留原仓库(作为 fallback,可选)
        google()
        mavenCentral()
        gradlePluginPortal()
    }
}

// 子模块的仓库配置
allprojects {
    repositories {
        maven { url = uri("https://maven.aliyun.com/repository/google") }
        maven { url = uri("https://maven.aliyun.com/repository/central") }
        maven { url = uri("https://maven.aliyun.com/repository/public") }
        mavenLocal()
        mavenCentral()
    }
}

// 采用的第三方包
dependencies {
    testImplementation(platform("org.junit:junit-bom:5.10.0"))
    testImplementation("org.junit.jupiter:junit-jupiter")
}

// Java 编译细节
//java {
//    sourceCompatibility = JavaVersion.VERSION_17 // 源代码兼容版本, 默认我采用 Java17-LTS
//    targetCompatibility = JavaVersion.VERSION_17 // 目标字节码版本, 同上
//}
// 编译的编码格式
//tasks.withType<JavaCompile> {
//    options.encoding = "UTF-8" // UTC-8编码
//}
// 以上两个可以直接合并简单配置
tasks.compileJava {
    sourceCompatibility = JavaVersion.VERSION_17.toString()
    targetCompatibility = JavaVersion.VERSION_17.toString()
    options.encoding = "UTF-8"

    // 追加其他编译配置细节
    options.compilerArgs.add("-parameters")
}


// 启动测试单元是否的启动入口
tasks.test {
    // 采用 JUnit 来做测试
    useJUnitPlatform()

    // 单元测试失败的是否是否执行其他测试
    ignoreFailures = false

    // 配置是否输出测试错误报告
    reports {
        html.required.set(false) // 生成 HTML 报告
    }

    // 测试的 JVM 参数
    jvmArgs("-Xmx1g")
}

// Jar 打包任务输出配置
tasks.jar {
    // 自定义输出 Jar 包名称
    archiveFileName.set("${project.name}-${version}.jar")

    // 排除不需要的文件, 打包的时候记得把包内部的 application.yaml 开发配置文件清除
    exclude("META-INF/*.SF", "META-INF/*.DSA")
}

settings.gradle.kts 则是用来划分多个模块功能配置, 这部分可以当作多个模块时候的扩展知识点来进阶处理;
一般来说比较简单的需求 build.gradle.kts 足够处理, 如果是项目之间依赖程度比较高就需要 settings.gradle.kts 来做模块启动.

这里第三方包的依赖也是比较简单, 比如 lombok 的依赖:

// 测试引入 lombok 依赖, 减少样板代码编写时间
// 去 maven repository 找最新版本 lombok 选择引入
// https://mvnrepository.com/artifact/org.projectlombok/lombok
dependencies {
    compileOnly("org.projectlombok:lombok:1.18.36") // Lombok 核心依赖(仅编译时需要)
    annotationProcessor("org.projectlombok:lombok:1.18.36") // 注解处理器(编译时生成代码)
}

因为 Lombok 的代码生成发生在编译期, 所以没办法在开发过程就看出问题, 后续可以用 Java16+ 提供 Record 来替代