Gradle 是一个基于 Groovy 和 Kotlin DSL(领域特定语言)的开源构建自动化工具,主要用于 Java、Kotlin、Android 等项目的构建、测试、部署等任务。它结合了 Apache Ant 的灵活性和 Apache Maven 的约定优于配置(Convention over Configuration)理念,同时引入了强大的依赖管理和增量构建机制。
声明式构建脚本
使用 Groovy 或 Kotlin DSL 编写脚本,语法简洁直观。例如:
plugins {
id 'java' // 应用 Java 插件
}
dependencies {
implementation 'org.springframework:spring-core:5.3.0' // 声明依赖
}
增量构建(Incremental Build)
仅重新编译修改过的文件,大幅提升构建速度。
多项目支持
支持模块化项目,通过 include
和 settings.gradle
管理子项目。
依赖管理
兼容 Maven 和 Ivy 仓库,支持传递性依赖和冲突解决。
插件化架构
通过插件扩展功能(如 java
、application
、android
等)。
Groovy vs. Kotlin DSL
Groovy DSL 更成熟,Kotlin DSL 类型安全但学习曲线略高。初学者建议从 Groovy 开始。
依赖冲突
多个依赖库版本不一致时,需通过 resolutionStrategy
强制指定版本:
configurations.all {
resolutionStrategy.force 'com.google.guava:guava:30.1.1-jre'
}
构建缓存
默认开启的缓存可能导致问题,可通过 --no-build-cache
禁用。
build.gradle
文件:
plugins {
id 'java'
}
repositories {
mavenCentral() // 使用 Maven 中央仓库
}
dependencies {
testImplementation 'junit:junit:4.13.2' // 测试依赖
}
常用命令:
gradle build
:编译并打包。gradle test
:运行测试。gradle clean
:清理构建目录。gradlew
(Wrapper)保证团队环境一致。org.gradle.jvmargs
调整 JVM 内存参数。Gradle 使用 领域特定语言(DSL) 进行构建脚本编写,支持 Groovy 和 Kotlin 两种语法:
示例(Groovy DSL):
plugins {
id 'java'
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web:2.7.0'
}
Gradle 通过 任务输入/输出分析 实现增量构建:
示例:
dependencies {
implementation('com.google.guava:guava:31.1-jre') {
exclude group: 'org.checkerframework', module: 'checker-qual'
}
}
allprojects
或 subprojects
统一配置。示例:
// 根项目 build.gradle
allprojects {
repositories {
mavenCentral()
}
}
// 子项目 build.gradle
dependencies {
implementation project(':core-module')
}
示例(应用 Spring Boot 插件):
plugins {
id 'org.springframework.boot' version '2.7.0'
}
gradlew
(Wrapper)确保环境一致。doFirst
、doLast
干预任务执行。示例(自定义任务):
task deployToTest(type: Copy) {
from 'build/libs'
into '/opt/test-server'
dependsOn build
}
// 示例:定义一个任务
task hello {
doLast {
println 'Hello, Gradle!'
}
}
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-compiler-pluginartifactId>
<version>3.8.1version>
plugin>
<target name="compile">
<javac srcdir="src" destdir="build"/>
target>
1.0.+
)和细粒度排除规则。dependencies {
implementation 'org.springframework:spring-core:5.3.0'
testImplementation 'junit:junit:4.13'
}
管理,依赖范围(如 compile
、test
)明确。<dependencies>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.13version>
<scope>testscope>
dependency>
dependencies>
配置插件,导致构建时间过长。
的版本统一作用。ant.importBuild
逐步替换。gradle init
自动转换 pom.xml
,再优化 DSL 逻辑。Gradle 最初是为 Java 项目设计的构建工具,能够高效地编译、测试、打包和发布 Java 应用。它支持多模块项目,并能与 Maven 和 Ivy 仓库无缝集成。
plugins {
id 'java'
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web:2.5.0'
testImplementation 'junit:junit:4.13'
}
Gradle 是 Android 官方推荐的构建工具,用于配置 Android 应用的编译、打包和签名流程。通过 Android Gradle 插件(AGP),开发者可以灵活定制构建变体(如 debug/release)。
android {
compileSdkVersion 30
defaultConfig {
applicationId "com.example.app"
minSdkVersion 21
}
}
通过插件支持 Kotlin、Groovy、C++ 等语言:
id 'org.jetbrains.kotlin.jvm'
id 'cpp-application'
Gradle 脚本可集成到 Jenkins、GitLab CI 等工具中,实现自动化构建、测试和部署:
./gradlew clean build publish
适用于需要动态决策的构建场景,例如:
task deployProd {
doLast {
if (project.hasProperty('release')) {
println "Deploying to production"
}
}
}
在多模块微服务项目中,Gradle 能高效管理子模块的依赖关系和构建顺序:
// settings.gradle
include 'user-service', 'order-service', 'gateway'
支持开发自定义 Gradle 插件,复用构建逻辑(如统一代码风格检查)。
利用增量构建(Incremental Build)和构建缓存(Build Cache)加速大型项目构建。
java -version
验证)。# 解压到 /opt/gradle(需 sudo 权限)
sudo unzip -d /opt/gradle gradle-8.5-bin.zip
编辑 ~/.bashrc
或 ~/.zshrc
,添加:
export GRADLE_HOME=/opt/gradle/gradle-8.5
export PATH=$GRADLE_HOME/bin:$PATH
生效配置:
source ~/.bashrc
gradle -v # 输出版本信息即成功
C:\gradle
等目录。GRADLE_HOME=C:\gradle\gradle-8.5
Path
中添加 %GRADLE_HOME%\bin
gradle -v
验证。GRADLE_HOME
环境变量指向新路径。gradle -v
sdk install gradle 8.5
sdk use gradle 8.5
~/.gradle/gradle.properties
中添加:systemProp.http.proxyHost=proxy.example.com
systemProp.http.proxyPort=8080
创建 build.gradle
文件:
task hello {
doLast {
println 'Gradle installed successfully!'
}
}
运行任务:
gradle hello
环境变量是操作系统或应用程序运行时使用的动态值,用于存储系统路径、配置信息等。在 Gradle 中,环境变量常用于配置 Java 路径、代理设置或自定义构建参数。
JAVA_HOME
C:\Program Files\Java\jdk-17
# 临时设置(仅当前会话有效)
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk
# 永久设置(添加到 ~/.bashrc 或 ~/.zshrc)
echo 'export JAVA_HOME=/usr/lib/jvm/java-17-openjdk' >> ~/.bashrc
source ~/.bashrc
// build.gradle 中读取环境变量
task printEnv {
doLast {
println "JAVA_HOME: ${System.getenv('JAVA_HOME')}"
println "自定义变量: ${System.getenv('MY_VAR')}"
}
}
C:\\Path\\To\\JDK
)GRADLE_USER_HOME/gradle.properties
存储# 检查环境变量是否生效
gradle printEnv
# 或直接查看
echo $JAVA_HOME # Linux/macOS
echo %JAVA_HOME% # Windows
安装完成后,可以通过以下命令验证 Gradle 是否正确安装:
gradle -v
或
gradle --version
如果安装成功,命令行会显示类似以下信息:
------------------------------------------------------------
Gradle 8.5
------------------------------------------------------------
Build time: 2023-11-28 15:24:16 UTC
Revision: d90a1c9b7b554f6f5d0f3002aed5a1d7d317d4d3
Kotlin: 1.9.20
Groovy: 3.0.17
Ant: Apache Ant(TM) version 1.10.13 compiled on January 4 2023
JVM: 17.0.9 (Oracle Corporation 17.0.9+9-LTS-211)
OS: Windows 10 10.0 amd64
输出信息中包含以下关键内容:
如果命令执行失败,可能的原因包括:
可以进一步创建一个简单的构建脚本验证 Gradle 是否能正常运行:
mkdir test-project
cd test-project
gradle init --type basic
gradle build
如果这些命令能成功执行,说明 Gradle 安装完全正确。
Gradle Wrapper 是一个用于自动化 Gradle 版本管理的工具,它允许项目在不预先安装 Gradle 的情况下,通过一个脚本自动下载并使用指定的 Gradle 版本进行构建。它的核心目标是确保构建环境的一致性,避免因开发人员本地 Gradle 版本不同而导致构建失败。
Gradle Wrapper 由以下几个文件组成:
gradlew
(Unix/Linux/macOS 脚本)gradlew.bat
(Windows 批处理脚本)gradle/wrapper/gradle-wrapper.properties
(配置文件)gradle/wrapper/gradle-wrapper.jar
(Wrapper 核心逻辑实现)gradlew
即可开始构建。gradle-wrapper.properties
即可升级或降级 Gradle 版本,无需全局安装。如果项目尚未包含 Wrapper,可以通过以下命令生成(需已安装 Gradle):
gradle wrapper --gradle-version 8.5
这会创建 Wrapper 文件并指定 Gradle 版本为 8.5。
./gradlew build # Unix/Linux/macOS
gradlew.bat build # Windows
./gradlew clean
./gradlew tasks
编辑 gradle-wrapper.properties
文件:
distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip
distributionUrl
:指定 Gradle 发行版的下载地址。
-bin.zip
:仅包含运行时(推荐大多数场景)。-all.zip
:包含源码和文档(适合需要调试的场景)。可以通过环境变量 GRADLE_USER_HOME
修改 Wrapper 下载的 Gradle 存储路径(默认在用户目录的 .gradle/wrapper/dists
下)。
services.gradle.org
(或配置镜像仓库)。gradlew
添加可执行权限:chmod +x gradlew
mkdir my-project && cd my-project
gradle init --type java-application
gradle wrapper --gradle-version 8.5 --distribution-type bin
./gradlew build
此时项目目录会包含 Wrapper 文件,其他成员克隆后可直接运行 ./gradlew build
。
在 Gradle 中,项目(Project) 和 任务(Task) 是两个核心概念,构成了构建逻辑的基本单元。
项目(Project)
build.gradle
或 build.gradle.kts
文件定义其属性和行为。任务(Task)
compileJava
、test
、jar
都是常见的内置任务。单项目构建
直接通过任务执行构建操作,例如:
gradle build # 执行默认任务链(编译、测试、打包)
gradle test # 仅运行测试任务
多项目构建
通过 settings.gradle
定义子项目,并在根项目中管理任务依赖:
// settings.gradle
include 'app', 'library' # 包含两个子项目
自定义任务
在 build.gradle
中定义新任务:
task hello {
doLast {
println "Hello, Gradle!"
}
}
任务配置与执行顺序
doLast
或 doFirst
)仅在执行阶段(Execution Phase)运行。task wrongExample {
println "This runs during configuration!" // 错误:配置阶段即执行
doLast {
println "This runs during execution."
}
}
任务依赖循环
避免任务 A 依赖任务 B,同时任务 B 又依赖任务 A,否则会导致构建失败。
任务输入/输出声明
为任务显式声明输入和输出以支持增量构建:
task processFiles {
inputs.files fileTree("src/data")
outputs.dir "build/processed"
doLast {
// 处理文件逻辑
}
}
多任务依赖
task compile {
doLast {
println "Compiling source code..."
}
}
task test(dependsOn: compile) {
doLast {
println "Running tests..."
}
}
task deploy(dependsOn: test) {
doLast {
println "Deploying application..."
}
}
执行 gradle deploy
会按顺序触发 compile
→ test
→ deploy
。
动态任务创建
3.times { index ->
task "task$index" {
doLast {
println "I'm task $index"
}
}
}
生成 task0
、task1
、task2
三个任务。
build.gradle
是 Gradle 构建工具的核心配置文件,采用 Groovy 或 Kotlin DSL(领域特定语言)编写。它定义了项目的构建逻辑,包括依赖管理、任务定义、插件应用等。Gradle 通过解析该脚本自动执行构建流程。
// 示例:根项目的 build.gradle
buildscript {
repositories {
google()
mavenCentral()
}
dependencies {
classpath "com.android.tools.build:gradle:7.0.0"
}
}
app/
),配置模块特定的构建规则。// 示例:Android 模块的 build.gradle
plugins {
id 'com.android.application'
}
android {
compileSdkVersion 31
}
plugins
块引入功能(如 Java、Android 或 Spring Boot 插件)。plugins {
id 'java' // Java 项目基础插件
id 'org.springframework.boot' version '2.5.0' // Spring Boot 插件
}
dependencies
块中声明库依赖,支持多种作用域(如 implementation
、testImplementation
)。dependencies {
implementation 'org.apache.commons:commons-lang3:3.12.0'
testImplementation 'junit:junit:4.13.2'
}
task hello {
doLast {
println 'Hello, Gradle!'
}
}
android.buildTypes.each { type ->
type.buildConfigField 'String', 'API_KEY', '"123456"'
}
ext
块定义全局变量供多脚本共享。// 根项目 build.gradle
ext {
kotlinVersion = '1.6.0'
}
// 子模块引用
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion"
依赖作用域混淆:
implementation
:当前模块私有依赖。api
:暴露依赖给其他模块。脚本执行顺序:
buildscript
块优先执行。Groovy 语法陷阱:
def version = '1.0'
println "Version: $version" // 正确插值
println 'Version: $version' // 输出字面量
gradle tasks --all
。logger
对象或 println
。tasks.register('debugTask') {
doLast {
logger.quiet('自定义日志级别输出')
}
}
apply from: 'path/to/script.gradle'
复用配置。inputs
/outputs
标记任务输入输出以优化性能。Gradle 构建过程分为三个主要阶段:
Project
实例build.gradle
),配置任务对象和依赖关系settings.gradle
文件build.gradle
脚本doFirst
/doLast
)Action
),按 doFirst
和 doLast
顺序执行可以通过 API 监听构建生命周期事件:
// 项目评估前
gradle.beforeProject { project ->
println "准备配置项目: $project"
}
// 任务图就绪后
gradle.taskGraph.whenReady { graph ->
println "任务图已就绪,将执行${graph.allTasks.size()}个任务"
}
// 构建完成后
gradle.buildFinished { result ->
println "构建${result.failure ? '失败' : '成功'}"
}
task A {
dependsOn 'B'
doLast { println "执行A" }
}
task B {
doLast { println "执行B" }
}
task C {
mustRunAfter 'D'
doLast { println "执行C" }
}
task D {
doLast { println "执行D" }
}
configure-on-demand
模式(只配置相关项目)--profile
参数生成构建性能报告@Input
/@Output
注解)dependsOn
和 mustRunAfter
subprojects
或 allprojects
时要谨慎依赖管理是构建工具的核心功能之一,用于声明、解析和传递项目所需的第三方库或模块。在Gradle中,依赖管理通过声明依赖关系来自动下载所需的JAR文件,并处理版本冲突等问题。
Gradle使用**配置(Configurations)**来定义依赖的作用范围,常见配置包括:
implementation
:编译和运行时依赖(推荐默认使用)compileOnly
:仅编译时依赖(如注解处理器)runtimeOnly
:仅运行时依赖(如数据库驱动)testImplementation
:测试代码的依赖dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web:2.7.0'
testImplementation 'junit:junit:4.13.2'
}
implementation group: 'com.google.guava', name: 'guava', version: '31.1-jre'
implementation project(':core-module')
implementation files('libs/local-lib.jar')
Gradle从预定义的仓库下载依赖,默认使用Maven Central:
repositories {
mavenCentral()
// 或自定义仓库
maven { url 'https://maven.aliyun.com/repository/public' }
}
failOnVersionConflict()
:默认立即失败configurations.all {
resolutionStrategy.force 'com.google.guava:guava:31.1-jre'
}
compile
:已被implementation
取代,后者能减少不必要的编译类路径泄露1.0.+
等动态版本,推荐明确版本号gradle dependencies
plugins {
id 'java'
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.apache.commons:commons-lang3:3.12.0'
testImplementation 'org.junit.jupiter:junit-jupiter:5.8.1'
}
Groovy
Groovy 是一种基于 JVM 的动态类型编程语言,语法与 Java 兼容但更简洁。在 Gradle 中,Groovy 是传统的 DSL(领域特定语言)实现方式,通过闭包和动态特性实现灵活的构建脚本编写。
Kotlin DSL
Kotlin DSL 是 Gradle 官方支持的另一种脚本编写方式,基于静态类型的 Kotlin 语言。它提供类型安全、更好的 IDE 支持(如代码补全和重构),并且语法更接近现代编程风格。
Groovy DSL 适用场景
Kotlin DSL 适用场景
依赖声明
dependencies {
implementation 'com.android.support:appcompat-v7:28.0.0'
testImplementation 'junit:junit:4.12'
}
dependencies {
implementation("com.android.support:appcompat-v7:28.0.0")
testImplementation("junit:junit:4.12")
}
任务定义
task hello {
doLast {
println 'Hello, Gradle!'
}
}
tasks.register("hello") {
doLast {
println("Hello, Gradle!")
}
}
Groovy DSL 的陷阱
it
默认参数和括号省略可能导致初学者困惑。Kotlin DSL 的挑战
通用建议
build.gradle.kts
和 build.gradle
共存实现过渡。IDE 支持
构建速度
在 Gradle 中,任务(Task) 是最基本的执行单元,代表构建过程中的一个独立操作。每个任务可以包含一系列动作(Action),用于完成特定的构建工作,例如编译代码、运行测试或打包项目。
任务可以通过以下方式定义:
task hello {
doLast {
println 'Hello, Gradle!'
}
}
TaskContainer
的 create
方法tasks.create('hello') {
doLast {
println 'Hello, Gradle!'
}
}
task copyFiles(type: Copy) {
from 'src/main/resources'
into 'build/resources'
}
任务配置用于定义任务的属性、依赖关系和执行逻辑。常见的配置方式包括:
动作(Action)
doFirst
:在任务执行开始时运行。doLast
(或 <<
):在任务执行结束时运行。task hello {
doFirst {
println 'Starting hello task'
}
doLast {
println 'Hello, Gradle!'
}
}
依赖关系
通过 dependsOn
指定任务依赖的其他任务:
task compile {
doLast {
println 'Compiling source code'
}
}
task test(dependsOn: compile) {
doLast {
println 'Running tests'
}
}
任务属性
可以配置任务的描述、分组等属性:
task hello {
group = 'Custom'
description = 'Prints a greeting message'
doLast {
println 'Hello, Gradle!'
}
}
动态任务
可以通过编程方式动态创建任务:
3.times { i ->
task "task$i" {
doLast {
println "Executing task $i"
}
}
}
任务配置与执行顺序
doFirst
或 doLast
中。任务依赖循环
taskA
依赖 taskB
,而 taskB
又依赖 taskA
。任务名称冲突
惰性配置
tasks.register
(惰性注册)而非 tasks.create
(立即创建):tasks.register('hello') {
doLast {
println 'Hello, Gradle!'
}
}
以下是一个完整的任务定义与配置示例:
task compile {
group = 'Build'
description = 'Compiles the source code'
doLast {
println 'Compiling source code...'
}
}
task test(dependsOn: compile) {
group = 'Verification'
description = 'Runs the unit tests'
doLast {
println 'Running tests...'
}
}
task build(dependsOn: test) {
group = 'Build'
description = 'Builds the project'
doLast {
println 'Building the project...'
}
}
运行 gradle build
时,任务将按以下顺序执行:
compile
test
build
依赖声明是 Gradle 构建脚本中用于指定项目所需外部库或模块的部分。通过声明依赖,Gradle 可以自动下载和管理这些外部资源,确保项目能够正确编译和运行。
在 Gradle 中,依赖通常在 dependencies
块中声明,格式如下:
dependencies {
implementation 'group:name:version'
testImplementation 'group:name:version'
}
dependencies {
// Spring Boot Web 依赖
implementation 'org.springframework.boot:spring-boot-starter-web:2.7.0'
// Lombok 注解处理器
compileOnly 'org.projectlombok:lombok:1.18.24'
annotationProcessor 'org.projectlombok:lombok:1.18.24'
// JUnit 测试框架
testImplementation 'junit:junit:4.13.2'
}
1.+
)仓库配置指定了 Gradle 从哪里获取依赖项。Gradle 支持多种类型的仓库,包括 Maven 中央仓库、JCenter、本地仓库以及自定义仓库。
~/.m2/repository
仓库通常在 repositories
块中配置:
repositories {
mavenCentral()
google()
mavenLocal()
maven {
url 'https://custom.repo.com/repository'
}
}
repositories {
// 阿里云镜像仓库(推荐国内使用)
maven { url 'https://maven.aliyun.com/repository/public' }
maven { url 'https://maven.aliyun.com/repository/google' }
// 公司私有仓库
maven {
url 'https://nexus.company.com/repository/maven-releases'
credentials {
username 'user'
password 'password'
}
}
// 本地仓库
mavenLocal()
}
Gradle 插件是一种用于扩展 Gradle 构建系统功能的模块化组件。插件可以封装一系列任务(Tasks)、依赖项(Dependencies)、配置(Configurations)和扩展属性(Extensions),以便在多个项目中复用。通过应用插件,开发者可以快速引入预定义的功能,而无需手动编写大量构建逻辑。
java
、application
插件,用于编译 Java 代码或打包可执行应用。junit
插件,用于运行单元测试。checkstyle
、pmd
插件,用于静态代码分析。maven-publish
插件,用于将构建产物发布到 Maven 仓库。plugins
块)或特定子项目(subprojects
块)。java
插件)plugins {
id 'java' // 应用 Java 插件
}
spring-boot
插件)plugins {
id 'org.springframework.boot' version '3.1.0' // 指定插件版本
}
subprojects {
apply plugin: 'java' // 为所有子项目应用 Java 插件
}
plugins {
id 'java'
}
java {
toolchain {
languageVersion = JavaLanguageVersion.of(11) // 配置 Java 版本
}
}
id
和版本号引用(如 id 'java'
)。apply from: 'path/to/script.gradle'
引入外部脚本。buildSrc
目录中定义的自定义插件。Gradle 提供了一系列内置的构建命令,用于执行常见的构建任务。这些命令可以通过命令行或集成开发环境(IDE)来调用。以下是几个最常用的构建命令及其详细说明:
build
是 Gradle 中最常用的命令之一,用于执行项目的完整构建流程。它会依次执行编译、测试、打包等任务。
使用场景:
执行方式:
gradle build
注意事项:
build
是一个聚合任务,它会依赖其他任务(如 compileJava
、test
、jar
等)。build
任务会终止并报错。clean
命令用于清理项目的构建输出目录(通常是 build
目录),删除所有生成的构建文件。
使用场景:
执行方式:
gradle clean
注意事项:
clean
后,所有中间文件和最终构建产物都会被删除,下次构建需要重新生成。build
使用,如 gradle clean build
,表示先清理再重新构建。test
命令用于执行项目中的单元测试。
使用场景:
执行方式:
gradle test
注意事项:
build/reports/tests
目录下,包括 HTML 和 XML 格式的报告。--continue
参数)。run
命令用于运行应用程序的主类。
使用场景:
执行方式:
gradle run
注意事项:
run
任务需要配置主类(mainClassName
),通常在 application
插件中指定。public static void main
方法)。assemble
命令用于编译和打包项目,但不运行测试。
使用场景:
执行方式:
gradle assemble
注意事项:
assemble
是 build
的子集,它只包含编译和打包任务,不包含测试。build/libs
目录下。check
命令用于运行所有的验证任务,通常包括测试和代码质量检查(如静态分析)。
使用场景:
执行方式:
gradle check
注意事项:
check
依赖于 test
和其他代码质量插件(如 checkstyle
、pmd
)的任务。check
失败。dependencies
:显示项目的依赖树。gradle dependencies
tasks
:列出项目中所有可用的任务。gradle tasks
jar
:仅打包生成 JAR 文件。gradle jar
以下是一个简单的 build.gradle
文件,展示了如何配置 application
插件和主类:
plugins {
id 'application'
}
application {
mainClassName = 'com.example.Main'
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.apache.commons:commons-lang3:3.12.0'
testImplementation 'junit:junit:4.13.2'
}
通过这些命令,可以高效地管理和构建 Gradle 项目。
在 Gradle 中,任务(Task)是构建过程中的基本执行单元。通过查看项目中的所有任务,可以更好地理解构建流程。以下是查看任务的常用方式:
查看所有任务
在项目根目录下执行以下命令:
gradle tasks
这会列出所有可用的任务,并按类别分组(如 Build tasks、Documentation tasks 等)。
查看特定任务组的任务
使用 --group
参数可以过滤特定组的任务:
gradle tasks --group=build
查看任务的详细信息
通过 --all
参数可以显示任务的详细描述和依赖关系:
gradle tasks --all
执行单个任务
直接指定任务名称即可执行:
gradle build
执行多个任务
可以一次性执行多个任务,按顺序排列:
gradle clean build
任务名称缩写
Gradle 支持任务名称的驼峰式缩写。例如:
gradle b
如果只有一个任务以 b
开头(如 build
),则会执行该任务。
排除任务
使用 -x
参数可以排除某个任务:
gradle build -x test
这会执行 build
任务,但跳过 test
任务。
强制执行任务
使用 --rerun-tasks
可以强制重新执行任务,即使任务已经是最新状态:
gradle build --rerun-tasks
任务名称区分大小写
Gradle 任务名称是区分大小写的。例如 build
和 Build
是两个不同的任务。
任务依赖关系
某些任务可能依赖于其他任务。执行时,Gradle 会自动解析依赖关系并按顺序执行。例如:
gradle assemble
可能会先执行 compileJava
和 processResources
任务。
增量构建
Gradle 默认支持增量构建,如果任务的输入和输出未发生变化,则不会重新执行。可以通过 --rerun-tasks
强制重新运行。
并行执行
使用 --parallel
可以并行执行独立任务以提升构建速度:
gradle build --parallel
以下是一个简单的 build.gradle
文件,定义了几个自定义任务:
task hello {
doLast {
println 'Hello, Gradle!'
}
}
task compile(type: Exec) {
commandLine 'javac', 'src/main/java/App.java'
}
task run(type: Exec, dependsOn: 'compile') {
commandLine 'java', '-cp', 'src/main/java', 'App'
}
执行示例:
gradle hello # 执行 hello 任务
gradle run # 执行 run 任务(会自动先执行 compile)
gradle tasks --all # 查看所有任务及其依赖关系
通过以上方法,可以高效地查看和执行 Gradle 任务,从而更好地管理构建流程。
命令行参数(Command Line Arguments)是在执行 Gradle 构建任务时,通过命令行传递给 Gradle 的额外配置选项或参数。这些参数可以控制构建的行为、配置项目属性或传递自定义值。
--debug
)、跳过测试(-x test
)等。-P
传递自定义属性(如 -Pversion=1.0
)。-D
设置 JVM 系统属性(如 -Dorg.gradle.debug=true
)。gradle build
)或任务组合(gradle clean build
)。--help
或 -h
:显示帮助信息。--version
:显示 Gradle 版本。--quiet
或 -q
:减少日志输出。--info
:显示详细日志。--debug
或 -d
:启用调试模式。-P=
:传递项目属性。gradle build -Penv=prod -Pversion=2.0
在 build.gradle
中可通过 project.properties['env']
访问。-D=
:设置 JVM 系统属性。gradle test -Dorg.gradle.parallel=true
在代码中可通过 System.getProperty("org.gradle.parallel")
获取。-x
:排除指定任务。gradle build -x test # 跳过测试任务
--rerun-tasks
:强制重新运行所有任务(忽略缓存)。build.gradle
中使用命令行参数task printArgs {
doLast {
// 访问项目属性
println "Environment: ${project.properties.get('env', 'dev')}"
// 访问系统属性
println "Parallel mode: ${System.getProperty('org.gradle.parallel')}"
}
}
执行命令:
gradle printArgs -Penv=prod -Dorg.gradle.parallel=true
-P
和 -D
)需在任务名前指定。gradle -Pkey=value taskName # 正确
gradle taskName -Pkey=value # 可能无效
-Pflag=true
会被解析为字符串,需显式转换:def flag = Boolean.parseBoolean(project.properties.get('flag', 'false'))
-P
)可能影响任务缓存键,导致不必要的重建。构建缓存是 Gradle 的核心优化机制,用于存储和复用先前构建任务的输出结果。当相同的输入(如源代码、依赖项)再次出现时,Gradle 可以直接从缓存中获取结果,避免重复执行任务。
.gradle/build-cache
中。clean
后重新构建时加速构建settings.gradle
)buildCache {
local {
directory = new File(rootDir, 'build-cache')
removeUnusedEntriesAfterDays = 30
}
remote(HttpBuildCache) {
url = 'https://example.com/cache/'
credentials {
username = 'user'
password = 'secret'
}
}
}
@Input
注解)增量构建指 Gradle 仅重新执行受更改影响的任务及其下游任务,而非完整重建。通过对比输入/输出的变化决定任务是否需要执行。
UP-TO-DATE
task processTemplates(type: Copy) {
inputs.property("version", project.version)
inputs.dir("src/templates")
outputs.dir("$buildDir/generated")
from("src/templates")
into("$buildDir/generated")
expand(version: project.version)
}
gradle build --info # 查看任务跳过原因
gradle clean # 强制全量重建
特性 | 构建缓存 | 增量构建 |
---|---|---|
作用范围 | 跨构建/跨机器 | 当前构建 |
存储内容 | 任务输出归档 | 输入/输出快照 |
主要优势 | 避免重复计算 | 减少任务执行数量 |
典型应用 | CI 环境共享 | 本地开发迭代 |
在 Gradle 构建工具中,依赖配置(Dependency Configuration)用于定义项目中依赖项的作用范围和传递性。不同的配置决定了依赖项在编译、测试和运行时的可见性,以及是否会被传递给依赖该项目的其他模块。
implementation
dependencies {
implementation 'com.google.guava:guava:31.1-jre'
}
api(旧称 compile)
api
会导致依赖传递链过长,增加构建时间和冲突风险。dependencies {
api 'org.apache.commons:commons-lang3:3.12.0'
}
compileOnly
dependencies {
compileOnly 'org.projectlombok:lombok:1.18.24'
}
runtimeOnly(旧称 runtime)
dependencies {
runtimeOnly 'mysql:mysql-connector-java:8.0.28'
}
testImplementation
dependencies {
testImplementation 'junit:junit:4.13.2'
}
testCompileOnly / testRuntimeOnly
compileOnly
和 runtimeOnly
,但仅作用于测试代码。implementation
:除非依赖需要暴露给其他模块,否则默认使用 implementation
以减少依赖传递。api
:仅在依赖项是模块公共接口的一部分时使用。compileOnly
避免将仅需编译的依赖打包到输出。runtimeOnly
确保依赖仅在运行时加载。混淆 implementation
和 api
:
api
会导致依赖传递链膨胀,增加冲突风险。api
可能污染依赖者的类路径。误用 compileOnly
:
compileOnly
依赖在运行时是必需的(如 Lombok 未配置注解处理器),会导致运行时错误。忽略测试依赖的作用域:
implementation
会污染生产代码的依赖。假设模块 A
依赖模块 B
:
B
使用 api
声明依赖 X
,则 A
会间接依赖 X
。B
使用 implementation
声明依赖 X
,则 A
不会感知 X
的存在。正确选择依赖配置是 Gradle 构建优化的关键。通过合理使用 implementation
、api
、compileOnly
等配置,可以:
仓库(Repository)是 Gradle 用于存储和检索依赖项(如 JAR 文件、插件等)的集中存储位置。Gradle 支持多种仓库类型,最常见的是 Maven 仓库 和 Ivy 仓库。仓库可以是本地的(如本地文件系统)或远程的(如 Maven Central、JCenter 或私有仓库服务器)。
Maven 仓库:
~/.m2/repository
)或远程仓库(如 Maven Central、JCenter 或公司私有仓库)。mavenCentral()
、mavenLocal()
或 maven { url }
配置。Ivy 仓库:
ivy { url }
配置。Flat Directory 仓库:
flatDir { dirs }
配置。从公共仓库获取依赖:
私有仓库配置:
本地开发与缓存:
mavenLocal()
可以复用本地 Maven 缓存的依赖,避免重复下载。离线模式:
以下是一个典型的 build.gradle
文件中的仓库配置:
repositories {
// 1. Maven Central 仓库
mavenCentral()
// 2. 本地 Maven 仓库(~/.m2/repository)
mavenLocal()
// 3. 自定义 Maven 仓库(如公司私有仓库)
maven {
url "https://repo.example.com/releases"
// 可选:认证信息
credentials {
username "user"
password "password"
}
}
// 4. Ivy 仓库
ivy {
url "https://repo.example.com/ivy-repo"
layout "pattern", {
artifact "[organisation]/[module]/[revision]/[artifact]-[revision].[ext]"
}
}
// 5. Flat Directory 仓库(本地目录)
flatDir {
dirs "libs"
}
}
仓库顺序:
认证问题:
gradle.properties
)。仓库镜像:
maven { url "https://maven.aliyun.com/repository/public" }
依赖冲突:
dependencyInsight
任务排查:gradle dependencyInsight --dependency <dependency-name>
仓库声明位置:
settings.gradle
的 dependencyResolutionManagement
)或模块级(build.gradle
)配置。全局配置对所有模块生效。仓库过滤:
repositories {
maven {
url "https://repo.example.com/releases"
content {
includeGroup "com.example"
}
}
}
仓库元数据缓存:
pom
文件)。可以通过 --refresh-dependencies
强制刷新:gradle build --refresh-dependencies
仓库替换规则:
resolutionStrategy
替换特定依赖的仓库:configurations.all {
resolutionStrategy {
dependencySubstitution {
substitute module("org.old:lib") using module("org.new:lib:1.0")
}
}
}
依赖冲突是指项目中的多个依赖项(包括传递性依赖)引入了相同库的不同版本,导致构建或运行时出现异常。例如:
libA:1.0
和 libB:2.0
,而 libB
又传递依赖 libA:2.0
NoSuchMethodError
或 ClassNotFoundException
通过 exclude
移除特定依赖的传递性依赖:
implementation('org.example:libB:2.0') {
exclude group: 'org.example', module: 'libA' // 排除libB对libA的依赖
}
在 build.gradle
中统一版本:
configurations.all {
resolutionStrategy {
force 'org.example:libA:2.0' // 强制所有依赖使用libA 2.0
}
}
在 dependencies
块中添加约束(Gradle 5.0+):
dependencies {
implementation 'org.example:libB:2.0'
constraints {
implementation('org.example:libA:2.0') // 约束libA版本
}
}
configurations.all {
resolutionStrategy {
preferProjectModules() // 优先使用项目声明的版本
failOnVersionConflict() // 冲突时直接失败(严格模式)
}
}
gradle dependencies > deps.txt # 输出依赖树到文件
gradle build --scan # 生成HTML报告(需联网)
testImplementation
)也可能引发冲突。implementation
而非 compile
(避免泄漏传递依赖)。gradle dependencyUpdates
检查过时依赖。build.gradle
中统一管理版本:ext {
libAVersion = '2.0'
}
// 子模块通过 rootProject.libAVersion 引用
依赖版本管理是 Gradle 构建工具中用于统一管理项目依赖项版本号的机制。它允许开发者在一个集中位置定义依赖库的版本号,然后在多个模块或构建脚本中引用这些版本号,避免版本号硬编码带来的维护问题。
Gradle 提供了几种方式实现依赖版本管理:
// 在根项目的 build.gradle 中定义版本号
ext {
springBootVersion = '2.7.0'
junitVersion = '5.8.2'
}
// 在子模块中引用
dependencies {
implementation "org.springframework.boot:spring-boot-starter-web:$springBootVersion"
testImplementation "org.junit.jupiter:junit-jupiter-api:$junitVersion"
}
# gradle.properties
springBootVersion=2.7.0
junitVersion=5.8.2
// 在构建脚本中引用
dependencies {
implementation "org.springframework.boot:spring-boot-starter-web:$springBootVersion"
}
// settings.gradle
dependencyResolutionManagement {
versionCatalogs {
libs {
version('spring-boot', '2.7.0')
version('junit', '5.8.2')
library('spring-boot-starter-web', 'org.springframework.boot', 'spring-boot-starter-web').versionRef('spring-boot')
library('junit-jupiter-api', 'org.junit.jupiter', 'junit-jupiter-api').versionRef('junit')
}
}
}
// build.gradle
dependencies {
implementation libs.spring.boot.starter.web
testImplementation libs.junit.jupiter.api
}
版本冲突:
./gradlew dependencies
查看依赖树resolutionStrategy
强制指定版本缓存问题:
./gradlew --refresh-dependencies
多模块项目同步:
平台依赖管理:
// 使用平台统一管理相关依赖版本
implementation platform('org.springframework.boot:spring-boot-dependencies:2.7.0')
// settings.gradle
dependencyResolutionManagement {
versionCatalogs {
libs {
// 定义版本号
version('spring', '5.3.20')
version('hibernate', '6.1.0.Final')
// 定义库
library('spring-core', 'org.springframework', 'spring-core').versionRef('spring')
library('hibernate-core', 'org.hibernate', 'hibernate-core').versionRef('hibernate')
// 定义插件版本
plugin('spring-boot', 'org.springframework.boot').version('2.7.0')
}
}
}
// build.gradle
plugins {
alias(libs.plugins.spring.boot)
}
dependencies {
implementation libs.spring.core
implementation libs.hibernate.core
}
Gradle 的核心插件(Core Plugins)是 Gradle 构建工具自带的一组基础插件,它们提供了构建 Java 项目所需的基本功能。这些插件通常以 java
、application
、war
等命名,并且不需要额外配置依赖即可直接使用。核心插件的主要目的是简化常见项目的构建配置,例如 Java 应用程序、库或 Web 应用。
java
插件
适用于标准的 Java 项目,提供编译、测试和打包 JAR 文件的功能。
src/main/java
和 src/test/java
目录结构。compileJava
、test
和 jar
等任务。示例配置:
plugins {
id 'java'
}
application
插件
适用于可执行的 Java 应用程序,扩展了 java
插件,并提供了运行和分发功能。
mainClassName
属性指定主类。run
任务直接运行程序。distZip
和 distTar
任务)。示例配置:
plugins {
id 'application'
}
application {
mainClassName = 'com.example.Main'
}
war
插件
适用于 Java Web 应用程序(Servlet 项目),扩展了 java
插件,并支持生成 WAR 文件。
src/main/webapp
目录存放 Web 资源(如 JSP、HTML)。war
任务打包 Web 应用。示例配置:
plugins {
id 'war'
}
java-library
插件
适用于 Java 库项目,扩展了 java
插件,并支持 API 和实现分离。
api
和 implementation
依赖,优化编译和运行时类路径。示例配置:
plugins {
id 'java-library'
}
dependencies {
api 'org.apache.commons:commons-lang3:3.12.0'
implementation 'com.google.guava:guava:30.1.1-jre'
}
java
插件:适用于纯 Java 库或工具项目。application
插件:适用于带主类的可执行程序(如命令行工具)。war
插件:适用于传统的 Java Web 项目(如 Servlet/JSP)。java-library
插件:适用于需要明确区分公开 API 和内部实现的库项目。混淆 java
和 java-library
java
插件不区分 api
和 implementation
依赖,可能导致依赖泄漏。java-library
插件。忽略 mainClassName
配置
application
插件时,必须指定 mainClassName
,否则 run
任务会失败。误用 war
插件
war
插件仅适用于传统 Web 项目,现代 Spring Boot 项目通常使用 jar
打包。以下是一个使用 java-library
插件的完整示例:
plugins {
id 'java-library'
}
repositories {
mavenCentral()
}
dependencies {
api 'org.apache.commons:commons-math3:3.6.1'
implementation 'com.google.code.gson:gson:2.8.9'
testImplementation 'junit:junit:4.13.2'
}
tasks.named('test') {
useJUnitPlatform()
}
Gradle 第三方插件是指由 Gradle 社区或第三方开发者提供的、用于扩展 Gradle 功能的模块。这些插件通常封装了特定的构建逻辑、任务或配置,帮助开发者简化构建流程。例如,java
插件用于 Java 项目构建,spring-boot
插件用于 Spring Boot 项目。
java
插件)。spring-boot
插件自动配置主类)。java
、application
)。com.github.spotbugs
)。plugins
DSL(推荐)在 build.gradle
中声明:
plugins {
id 'java' // 核心插件
id 'org.springframework.boot' version '3.1.0' // 社区插件(需指定版本)
}
buildscript
(传统方式)buildscript {
repositories {
gradlePluginPortal() // 或 mavenCentral()
}
dependencies {
classpath 'org.springframework.boot:spring-boot-gradle-plugin:3.1.0'
}
}
apply plugin: 'org.springframework.boot'
plugins {
id 'java'
}
plugins {
id 'org.springframework.boot' version '3.1.0'
}
plugins {
id 'com.bmuschko.docker-java-application' version '7.4.0'
}
jar
任务)。gradlePluginPortal()
在 repositories
中。gradle plugin [功能关键词]
(如 “gradle plugin docker”)Gradle 自定义插件是用户根据项目需求编写的可复用构建逻辑模块。它允许你将常用的构建逻辑封装起来,供多个项目共享或在不同构建阶段调用。插件可以包含任务定义、依赖管理、文件操作等任何 Gradle 支持的操作。
// 在 build.gradle 中直接定义
class GreetingPlugin implements Plugin<Project> {
void apply(Project project) {
project.task('hello') {
doLast {
println 'Hello from custom plugin!'
}
}
}
}
// 应用插件
apply plugin: GreetingPlugin
在项目根目录创建 buildSrc
文件夹
标准目录结构:
buildSrc/
├── build.gradle
└── src/main/groovy/
└── com/example/
└── MyPlugin.groovy
示例插件代码:
package com.example
import org.gradle.api.Plugin
import org.gradle.api.Project
class MyPlugin implements Plugin<Project> {
void apply(Project project) {
project.extensions.create("myPluginConfig", MyPluginExtension)
project.task('customTask') {
doLast {
println "Message: ${project.myPluginConfig.message}"
}
}
}
}
class MyPluginExtension {
String message = 'Default message'
}
build.gradle
中应用:plugins {
id 'com.example.my-plugin'
}
myPluginConfig {
message = 'Custom configuration'
}
使用 gradle init
选择 Gradle Plugin
类型
主要文件结构:
src/main/groovy/
└── com/example/
├── MyPlugin.groovy
└── MyPluginExtension.groovy
需要发布到仓库(Maven Local 或远程仓库)
通过扩展对象实现可配置的插件:
// 定义扩展
class MyExtension {
String target = 'World'
}
// 在插件中使用扩展
class MyPlugin implements Plugin<Project> {
void apply(Project project) {
def extension = project.extensions.create('mySettings', MyExtension)
project.task('greet') {
doLast {
println "Hello, ${extension.target}!"
}
}
}
}
com.example.plugin
)PluginAware
API 处理不同作用域ServiceRegistry
共享服务ObjectFactory
创建配置对象TaskContainer
进行任务管理Gradle 插件发布与共享是指将自定义开发的 Gradle 插件打包并发布到公共或私有仓库,以便其他项目或开发者能够方便地引用和使用。通过发布插件,可以实现代码复用、标准化构建流程以及团队协作。
确保插件项目已经正确配置,并且已经通过测试。插件项目通常需要包含以下内容:
build.gradle
或 build.gradle.kts
文件plugin id
)在插件的 build.gradle
文件中,添加 maven-publish
插件,并配置发布信息:
plugins {
id 'java-gradle-plugin'
id 'maven-publish'
}
group 'com.example'
version '1.0.0'
publishing {
publications {
maven(MavenPublication) {
from components.java
}
}
repositories {
maven {
url = uri("https://your-repo-url.com/repository/maven-releases/")
credentials {
username = project.findProperty("repoUsername") ?: ""
password = project.findProperty("repoPassword") ?: ""
}
}
}
}
运行以下命令将插件发布到配置的仓库:
./gradlew publish
Gradle 提供了一个官方的插件门户(Gradle Plugin Portal),开发者可以将插件发布到这里,供全球用户使用。
发布到 Gradle 插件门户的步骤:
build.gradle
中配置 gradlePlugin
块:gradlePlugin {
plugins {
myPlugin {
id = 'com.example.myplugin'
implementationClass = 'com.example.MyPlugin'
}
}
}
gradle-plugin-publish
插件:plugins {
id 'com.gradle.plugin-publish' version '1.1.0'
}
pluginBundle {
website = 'https://example.com'
vcsUrl = 'https://github.com/example/myplugin'
tags = ['gradle', 'plugin', 'example']
}
./gradlew publishPlugins
如果只是临时共享给团队成员,可以将插件打包到本地 Maven 仓库:
./gradlew publishToMavenLocal
其他开发者可以通过在 settings.gradle
或 build.gradle
中引用本地仓库来使用插件:
pluginManagement {
repositories {
mavenLocal()
gradlePluginPortal()
}
}
插件 ID 唯一性:发布到 Gradle 插件门户时,插件 ID 必须是全局唯一的。通常使用反向域名(如 com.example.myplugin
)来避免冲突。
版本管理:遵循语义化版本控制(SemVer),确保版本号清晰表达插件的变更(如 MAJOR.MINOR.PATCH
)。
依赖管理:确保插件的依赖范围正确,避免传递依赖冲突。可以使用 api
或 implementation
来明确依赖关系。
文档与示例:发布插件时,提供清晰的文档和示例代码,帮助其他开发者快速上手。
兼容性:注明插件支持的 Gradle 版本和 Java 版本,避免用户在不兼容的环境中使用。
以下是一个简单的插件发布示例:
package com.example;
import org.gradle.api.Plugin;
import org.gradle.api.Project;
public class MyPlugin implements Plugin<Project> {
@Override
public void apply(Project project) {
project.task("hello").doLast(task -> {
System.out.println("Hello from MyPlugin!");
});
}
}
build.gradle
配置:plugins {
id 'java-gradle-plugin'
id 'maven-publish'
}
gradlePlugin {
plugins {
myPlugin {
id = 'com.example.myplugin'
implementationClass = 'com.example.MyPlugin'
}
}
}
group 'com.example'
version '1.0.0'
publishing {
repositories {
maven {
url = uri("https://your-repo-url.com/repository/maven-releases/")
credentials {
username = project.findProperty("repoUsername")
password = project.findProperty("repoPassword")
}
}
}
}
./gradlew publish
多项目结构(Multi-Project Build)是指在一个 Gradle 构建中包含多个相互关联的子项目(subprojects),这些子项目可以独立构建,也可以作为整体的一部分协同工作。多项目结构通常用于大型项目或模块化开发,允许开发者将代码拆分为逻辑上独立的模块,每个模块可以有自己的构建配置和依赖关系。
app
模块依赖 core
模块)。一个典型的多项目结构目录如下:
root-project/
├── build.gradle // 根项目的构建脚本
├── settings.gradle // 定义包含的子项目
├── core/ // 子项目1
│ ├── build.gradle
│ └── src/
├── app/ // 子项目2
│ ├── build.gradle
│ └── src/
└── shared/ // 子项目3
├── build.gradle
└── src/
settings.gradle
在根项目的 settings.gradle
中声明包含的子项目:
include ':core', ':app', ':shared'
include
用于指定子项目的路径。:core
对应 core/
目录)。根项目的 build.gradle
可以定义所有子项目的公共配置(通过 subprojects
或 allprojects
):
subprojects {
apply plugin: 'java'
repositories {
mavenCentral()
}
}
子项目的 build.gradle
每个子项目可以有自己的构建配置。例如,app
模块依赖 core
模块:
dependencies {
implementation project(':core')
}
路径错误
settings.gradle
中声明的子项目路径必须与实际目录一致。core-module
,但 settings.gradle
中写为 include ':core'
。循环依赖
A
依赖 B
,B
又依赖 A
),否则构建会失败。配置泄露
build.gradle
中过度使用 allprojects
,否则可能将不必要的配置应用到所有子项目。项目依赖替换
如果子项目依赖外部库,但在多项目构建中希望替换为本地子项目,可以使用依赖替换:
configurations.all {
resolutionStrategy.dependencySubstitution {
substitute module('com.example:core') with project(':core')
}
}
自定义构建逻辑
可以通过 gradle.projectsEvaluated
在构建完成后执行自定义逻辑:
gradle.projectsEvaluated {
subprojects {
// 检查所有子项目的配置
}
}
以下是一个完整的多项目构建配置示例:
settings.gradle
rootProject.name = 'multi-project-demo'
include ':core', ':app'
根项目的 build.gradle
plugins {
id 'base'
}
subprojects {
apply plugin: 'java'
repositories {
mavenCentral()
}
}
core/build.gradle
dependencies {
implementation 'org.apache.commons:commons-lang3:3.12.0'
}
app/build.gradle
dependencies {
implementation project(':core')
}
子项目配置(Subproject Configuration)是 Gradle 多项目构建(Multi-project Build)中的核心概念,用于管理包含多个子模块的项目结构。通过子项目配置,可以在父项目中统一管理所有子项目的构建逻辑、依赖关系和共享配置。
core
、web
、utils
等),每个子模块独立开发。web
依赖 core
)。典型的目录结构如下:
root-project/
├── build.gradle // 父项目构建脚本
├── settings.gradle // 定义子项目
├── core/
│ └── build.gradle // 子项目配置
└── web/
└── build.gradle
settings.gradle
声明子项目include ':core', ':web' // 包含子项目
build.gradle
)通过 subprojects
或 allprojects
块对所有子项目应用配置:
subprojects {
// 公共插件
apply plugin: 'java'
// 公共依赖
repositories {
mavenCentral()
}
// 自定义属性
ext {
lombokVersion = '1.18.24'
}
}
web/build.gradle
)dependencies {
implementation project(':core') // 依赖其他子项目
implementation 'org.springframework:spring-web:5.3.0'
}
A
依赖 B
,B
又依赖 A
)会导致构建失败。allprojects
中配置非必要的属性可能污染所有子项目。settings.gradle
中使用错误的子项目路径(如 include ':wrong-path'
)。通过 project
对象判断子项目名称,动态调整配置:
subprojects {
if (project.name == 'web') {
apply plugin: 'war'
}
}
在子项目中访问父项目定义的属性:
// 父项目 build.gradle
ext.sharedVersion = '1.0'
// 子项目 build.gradle
version = rootProject.ext.sharedVersion
项目间依赖(Inter-project Dependencies)指的是在 Gradle 构建系统中,一个项目(Project)依赖于另一个项目的输出(如 JAR 文件、类文件或其他构建产物)。这种依赖关系允许在多模块项目中,模块之间相互引用,实现代码复用和模块化开发。
core
模块提供基础功能,而 web
模块依赖于 core
模块。在 Gradle 中,项目间依赖通常通过 settings.gradle
和 build.gradle
文件配置。
在 settings.gradle
中声明包含的子项目:
include 'core', 'web'
在依赖方的 build.gradle
文件中(例如 web
模块),通过 project()
方法声明对另一个项目(如 core
)的依赖:
dependencies {
implementation project(':core')
}
project()
方法中使用的路径(如 :core
)必须与 settings.gradle
中定义的名称一致。假设有一个多模块项目结构如下:
my-project/
├── settings.gradle
├── core/
│ └── build.gradle
└── web/
└── build.gradle
rootProject.name = 'my-project'
include 'core', 'web'
plugins {
id 'java'
}
dependencies {
// core 模块的依赖
}
plugins {
id 'java'
}
dependencies {
implementation project(':core') // 依赖 core 模块
}
project(path, configuration)
指定依赖的配置(如 testFixtures
):dependencies {
testImplementation project(path: ':core', configuration: 'testFixtures')
}
dependencies {
if (someCondition) {
implementation project(':moduleA')
} else {
implementation project(':moduleB')
}
}
通过合理使用项目间依赖,可以更好地组织大型项目的代码结构,提高构建效率和可维护性。
共享构建逻辑(Shared Build Logic)是指将 Gradle 构建脚本中重复使用的配置、任务或插件逻辑提取出来,封装成可复用的模块。通过这种方式,可以避免代码重复,提高构建脚本的可维护性和一致性。
Gradle 提供了多种方式实现共享构建逻辑:
buildSrc
目录buildSrc
是 Gradle 的约定目录,用于存放构建逻辑的源代码。Gradle 会自动编译并将其添加到构建脚本的类路径中。
project-root/
├── buildSrc/
│ ├── src/main/java/com/example/MyCustomPlugin.java
│ └── build.gradle
├── app/
│ └── build.gradle
└── settings.gradle
在 buildSrc/build.gradle
中定义插件:
plugins {
id 'java-gradle-plugin'
}
gradlePlugin {
plugins {
myPlugin {
id = 'com.example.myplugin'
implementationClass = 'com.example.MyCustomPlugin'
}
}
}
在子模块中使用:
plugins {
id 'com.example.myplugin'
}
通过 includeBuild
将另一个 Gradle 项目作为插件引入。
在 settings.gradle
中:
includeBuild 'shared-build-logic'
将共享逻辑写入 .gradle
文件,然后通过 apply from
引入。
创建 shared-config.gradle
:
android {
compileSdkVersion 33
defaultConfig {
minSdkVersion 21
}
}
在模块中引入:
apply from: "$rootDir/shared-config.gradle"
buildSrc
不能依赖主项目的代码。buildSrc
或复合构建,而非脚本插件(后者难以维护)。构建缓存是 Gradle 的核心功能之一,它通过缓存任务输出(如编译后的类文件、生成的资源文件等)来加速后续构建过程。当 Gradle 检测到输入(如源代码、依赖项)未发生变化时,会直接复用缓存中的结果,避免重复执行相同的任务。
~/.gradle/caches
)和远程缓存(如团队共享的 CI 服务器缓存)。gradle build
的第二次运行)。在 gradle.properties
中启用本地缓存:
org.gradle.caching=true
或在 settings.gradle
中配置远程缓存:
buildCache {
remote(HttpBuildCache) {
url = 'https://cache.example.com'
credentials {
username = 'user'
password = 'secret'
}
}
}
tasks.register("nonCacheableTask") {
outputs.doNotCacheIf("Has random output") { true }
}
gradle cleanBuildCache
)。并行构建(Parallel Build)是指 Gradle 在构建过程中同时执行多个独立的任务,以充分利用多核 CPU 的计算能力,从而显著缩短构建时间。Gradle 通过分析任务之间的依赖关系图,自动识别可以并行执行的任务。
java.util.concurrent
线程池,任务会被分配到不同线程。org.gradle.workers.max
参数限制最大并行线程数。在 gradle.properties
中配置:
# 启用并行构建
org.gradle.parallel=true
# 可选:设置最大并行线程数(默认为CPU核心数)
org.gradle.workers.max=4
或通过命令行参数:
./gradlew build --parallel --max-workers=4
org.gradle.jvmargs=-Xmx2g
--profile
参数生成构建报告,分析并行效果:./gradlew build --parallel --profile
--dry-run
查看任务执行顺序:./gradlew build --parallel --dry-run
@ParallelizableTask
注解。假设项目结构:
project
├── moduleA
├── moduleB
└── moduleC
串行构建时序:
:moduleA:compileJava -> :moduleB:compileJava -> :moduleC:compileJava
并行构建时序:
:moduleA:compileJava
:moduleB:compileJava ← 同时执行
:moduleC:compileJava
dependsOn
和 mustRunAfter
。--console=plain
参数:./gradlew build --parallel --console=plain
org.gradle.caching=true
org.gradle.cache.key=hash(${projectDir})
增量构建(Incremental Build)是构建工具(如 Gradle)的一种优化机制,指在项目构建过程中仅重新编译或处理发生变化的源文件,而非每次都执行完整的构建流程。Gradle 通过智能的任务依赖分析和输入/输出跟踪,自动跳过未变更的任务,显著提升构建效率。
通过 inputs
和 outputs
显式声明任务的增量特性:
task processTemplates(type: Copy) {
inputs.property("version", project.version) // 输入属性
from 'src/templates'
into 'build/processed'
expand(version: project.version) // 使用动态内容
outputs.upToDateWhen { !source.empty } // 输出条件
}
tasks.named("generateReport") {
outputs.upToDateWhen { false } // 强制每次执行
}
dependsOn
动态添加的任务可能破坏增量性。clean
任务会清除所有输出,导致下次全量构建。gradle build --info | grep "UP-TO-DATE"
gradle build --rerun-tasks
gradle :taskName --console=verbose
性能监控与调优是指通过工具和技术手段,对应用程序的运行状态进行实时或定期监测,分析性能瓶颈,并采取优化措施以提高系统响应速度、资源利用率和整体性能的过程。
JVM 自带工具:
jps
:查看 Java 进程jstat
:监控 JVM 统计信息jstack
:获取线程堆栈jmap
:生成堆转储快照jconsole
:图形化监控工具VisualVM
:功能更强大的图形化工具第三方工具:
JVM 调优:
-Xms
, -Xmx
)-XX:MaxGCPauseMillis
)代码优化:
数据库优化:
并发优化:
public class PerformanceTest {
public static void main(String[] args) {
// 模拟内存泄漏
List<byte[]> list = new ArrayList<>();
while (true) {
byte[] data = new byte[1024 * 1024]; // 1MB
list.add(data);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
一个标准的 Gradle Java 项目通常包含以下目录结构:
project-root/
├── build.gradle
├── settings.gradle
├── gradlew
├── gradlew.bat
└── src/
├── main/
│ ├── java/ # 主 Java 源代码
│ └── resources/ # 主资源文件
└── test/
├── java/ # 测试 Java 源代码
└── resources/ # 测试资源文件
plugins {
id 'java' // 应用 Java 插件
}
group 'com.example' // 项目组标识
version '1.0.0' // 项目版本
repositories {
mavenCentral() // 使用 Maven 中央仓库
}
dependencies {
implementation 'org.apache.commons:commons-lang3:3.12.0' // 主代码依赖
testImplementation 'junit:junit:4.13.2' // 测试代码依赖
}
在 settings.gradle
中定义模块:
rootProject.name = 'my-project'
include 'core', 'web', 'utils'
每个子模块有自己的 build.gradle
,例如 core/build.gradle
:
plugins {
id 'java-library' // 适用于库模块
}
dependencies {
api project(':utils') // 暴露给其他模块的依赖
implementation 'com.google.guava:guava:31.1-jre'
}
task generateReport(type: JavaExec) {
classpath = sourceSets.main.runtimeClasspath
mainClass = 'com.example.ReportGenerator'
args '--output', 'build/reports'
}
// 将自定义任务绑定到构建生命周期
build.dependsOn generateReport
常用 Gradle 命令:
# 编译并运行测试
./gradlew build
# 只运行单元测试
./gradlew test
# 生成项目依赖树
./gradlew dependencies
# 清理构建产物
./gradlew clean
# 运行特定任务
./gradlew generateReport
jar {
manifest {
attributes 'Main-Class': 'com.example.Main'
}
from {
configurations.runtimeClasspath.collect {
it.isDirectory() ? it : zipTree(it)
}
}
}
dependencies {
implementation('org.library:some-lib:1.0') {
exclude group: 'com.unwanted', module: 'deprecated-module'
}
}
sourceSets {
prod {
java.srcDirs = ['src/prod/java']
}
staging {
java.srcDirs = ['src/staging/java']
}
}
依赖声明时:
implementation
:仅当前模块可见api
:会传递给依赖该模块的其他模块compileOnly
:仅编译时可用构建缓存:
--build-cache
启用远程缓存性能优化:
--parallel
并行构建--daemon
守护进程减少启动时间Web 项目构建是指使用构建工具(如 Gradle)将 Web 应用程序的源代码、资源文件和依赖项编译、打包并部署为可运行的 Web 应用程序的过程。通常包括以下步骤:
plugins {
id 'war' // 应用 war 插件
id 'java'
}
repositories {
mavenCentral()
}
dependencies {
// Servlet API 依赖
providedCompile 'javax.servlet:javax.servlet-api:4.0.1'
// 其他依赖
implementation 'org.apache.commons:commons-lang3:3.12.0'
}
war {
archiveFileName = 'mywebapp.war' // 指定生成的 WAR 文件名
from 'src/main/webapp' // 包含 webapp 目录内容
}
plugins {
id 'java'
id 'org.springframework.boot' version '3.1.0'
id 'io.spring.dependency-management' version '1.1.0'
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
bootJar {
archiveFileName = 'app.jar' // 指定生成的 JAR 文件名
}
// settings.gradle
include 'web', 'service', 'repository'
// web/build.gradle
plugins {
id 'war'
}
dependencies {
implementation project(':service') // 依赖其他模块
providedCompile 'javax.servlet:javax.servlet-api:4.0.1'
}
gradle build
- 执行完整构建(编译、测试、打包)gradle war
- 仅构建 WAR 文件(传统项目)gradle bootRun
- 运行 Spring Boot 应用gradle test
- 运行测试gradle clean
- 清理构建目录war {
// 根据环境包含不同的配置文件
def env = System.getProperty('env') ?: 'dev'
from("src/main/environments/$env") {
into 'WEB-INF/classes'
}
}
task copyFrontend(type: Copy) {
from 'frontend/dist'
into 'src/main/webapp/static'
}
war.dependsOn copyFrontend
依赖冲突:
gradle dependencies
查看依赖树exclude
排除冲突依赖:implementation('org.springframework.boot:spring-boot-starter-web') {
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat'
}
构建速度慢:
settings.gradle
中添加 enableFeaturePreview('BUILD_CACHE')
org.gradle.parallel=true
部署问题:
build.gradle
简洁,复杂逻辑封装到自定义插件中--scan
选项分析构建性能在 Android 项目中,Gradle 构建脚本通常由以下几个部分组成:
buildscript {
repositories {
google()
mavenCentral()
}
dependencies {
classpath "com.android.tools.build:gradle:7.0.4"
}
}
allprojects {
repositories {
google()
mavenCentral()
}
}
app/
),配置特定模块的构建选项。plugins {
id 'com.android.application'
}
android {
compileSdkVersion 31
defaultConfig {
applicationId "com.example.myapp"
minSdkVersion 21
targetSdkVersion 31
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation 'androidx.appcompat:appcompat:1.4.0'
implementation 'com.google.android.material:material:1.4.0'
}
Gradle 为 Android 项目提供了标准构建任务:
# 清理构建产物
./gradlew clean
# 构建所有变体
./gradlew build
# 安装调试版到设备
./gradlew installDebug
# 构建特定变体(如 release 版本)
./gradlew assembleRelease
# 构建特定产品风味的 debug 版本
./gradlew assembleFreeDebug
对于包含多个模块的项目(如 app
, library
),需要在 settings.gradle
中声明:
include ':app', ':library'
模块间依赖通过 dependencies
配置:
// 在 app 模块中引用 library 模块
implementation project(':library')
android {
buildTypes {
staging {
initWith debug
manifestPlaceholders = [hostName:"stage.example.com"]
}
}
}
android {
flavorDimensions "version"
productFlavors {
free {
dimension "version"
applicationIdSuffix ".free"
}
paid {
dimension "version"
applicationIdSuffix ".paid"
}
}
}
android.applicationVariants.all { variant ->
variant.outputs.all {
outputFileName = "app-${variant.name}-${variant.versionName}.apk"
}
}
Gradle 版本兼容性:
gradle-wrapper.properties
中的 Gradle 版本与 Android Gradle 插件版本兼容构建性能优化:
org.gradle.caching=true
org.gradle.daemon=true
依赖管理最佳实践:
1.+
)implementation
而非 compile
(已废弃)./gradlew dependencyUpdates
检查依赖更新常见问题处理:
./gradlew cleanBuildCache
./gradlew dependencies
./gradlew --stacktrace --info
多模块项目构建是指将一个大型项目拆分成多个相互关联的子模块(Module),每个子模块可以独立编译、测试和打包,同时又能作为一个整体进行构建。Gradle 通过 settings.gradle
和 build.gradle
文件来管理多模块项目的依赖关系和构建逻辑。
以下是一个典型的多模块项目目录结构:
my-multi-module-project/
├── settings.gradle # 定义包含哪些子模块
├── build.gradle # 根项目的构建配置
├── module-core/ # 核心模块
│ ├── build.gradle
│ └── src/
├── module-web/ # Web 模块
│ ├── build.gradle
│ └── src/
└── module-data/ # 数据访问模块
├── build.gradle
└── src/
rootProject.name = 'my-multi-module-project' // 根项目名称
// 包含的子模块
include 'module-core'
include 'module-web'
include 'module-data'
// 公共配置(所有子模块共享)
subprojects {
apply plugin: 'java'
apply plugin: 'maven-publish'
group = 'com.example'
version = '1.0.0'
repositories {
mavenCentral()
}
dependencies {
testImplementation 'junit:junit:4.13.2'
}
}
// 单独配置某个子模块
project(':module-web') {
dependencies {
implementation project(':module-core') // 依赖 core 模块
}
}
dependencies {
implementation project(':module-core') // 依赖 core 模块
implementation 'org.hibernate:hibernate-core:5.6.0.Final'
}
implementation project(':module-core')
compile
)。api project(':module-common')
testImplementation 'org.mockito:mockito-core:3.12.4'
gradle build
gradle :module-core:build
gradle dependencies
build.gradle
中使用 ext
定义公共版本号:ext {
springBootVersion = '2.7.0'
}
子模块中引用:implementation "org.springframework.boot:spring-boot-starter:$springBootVersion"
compileOnly
或 runtimeOnly
减少重新编译范围。当需要集成外部独立项目时:
// settings.gradle
includeBuild '../external-library'
然后在依赖中直接引用:
implementation 'com.external:library:1.0'