最近后续项目可能要做 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" // 程序名称
需要注意, 因为国内镜像仓库问题导致下载打包缓慢甚至卡顿, 所以需要按照以下流程转为国内镜像地址:
- 找到项目根目录下
gradle/wrapper/gradle-wrapper.properties - 文件的
distributionUrl设置为国内gradle-wrapper地址 - 设置地址
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 来替代