Gradle 9.8 配置参数详解

Gradle 9.8 配置参数详解:gradle.properties(jvmargs/daemon/caching/parallel 等)、settings.gradle.kts 模块与仓库治理、build.gradle.kts 依赖配置 api/implementation 语义差异,逐项「改动-执行-验证」实测。

GradleGradle构建工具2026/10/20

Gradle 9.8 配置参数详解

目标:讲清 Gradle 9.8 构建体系的三个配置层——gradle.properties(构建环境)、settings.gradle.kts(构建组成与仓库治理)、build.gradle.kts(模块任务与依赖),并对核心参数逐项给出「改动 → 执行 → 验证」实测闭环。全部命令与回显均在 Ubuntu 22.04 + OpenJDK 17 + Gradle 9.8.2 环境实测通过。

一、环境信息

  • 操作系统:Ubuntu 22.04.4 LTS(x86_64,内核 6.8.0-138-generic)
  • JDK:OpenJDK 17.0.20.1(apt 安装,路径 /usr/lib/jvm/java-17-openjdk-amd64);编译工具链 JDK 21(Temurin 21.0.12.1_1,由 Gradle Toolchain + foojay resolver 自动下载至 ~/.gradle/jdks/)
  • Gradle:9.8.2(官方发行包安装,/opt/gradle 软链指向 /opt/gradle-9.8.2,安装过程见 《Ubuntu 22.04 安装 Gradle 9.8 指南》)
  • 实验工程一(单模块 Java 应用):/opt/demo-app,由 gradle init --type java-application --dsl kotlin 生成
  • 实验工程二(多模块 Java 库+应用):/opt/demo-multi,含 lib(java-library 插件)与 app(application 插件)两个子模块
  • Gradle 用户主目录:~/.gradle(守护进程日志、缓存、wrapper 发行包均在此)

二、前置条件

  1. 已按 《Ubuntu 22.04 安装 Gradle 9.8 指南》完成 Gradle 与 JDK 安装,gradle --version 可正常输出。

  2. 建议先完成一次工程初始化(本文直接使用 init 生成工程做实验):

    mkdir -p /opt/demo-multi && cd /opt/demo-multi
    gradle init --type java-library --dsl kotlin --test-framework junit-jupiter --package com.example.multi --project-name demo-multi --no-split-project
    

    实测回显:

    > Task :init
    Learn more about Gradle by exploring our Samples at https://docs.gradle.org/9.8.2/samples/sample_building_java_libraries.html
    
    BUILD SUCCESSFUL in 396ms
    1 actionable task: 1 executed
    Configuration cache entry reused.
    
  3. 验证 Gradle 可用:

    gradle --version
    

    实测回显:

    ------------------------------------------------------------
    Gradle 9.8.2
    ------------------------------------------------------------
    
    Build time:    2026-10-19 16:29:26 UTC
    Revision:      8de7bcf76e785507ad92f0741ab9235a430c95e6
    
    Kotlin:        2.4.10
    Groovy:        4.0.33
    Ant:           Apache Ant(TM) version 1.10.17 compiled on April 6 2026
    Launcher JVM:  17.0.20.1 (Ubuntu 17.0.20.1+1-1-22.04-Ubuntu)
    Daemon JVM:    /usr/lib/jvm/java-17-openjdk-amd64 (no Daemon JVM specified, using current Java home)
    OS:            Linux 6.8.0-138-generic amd64
    

💡 说明:Gradle 的配置分布在三类文件中,职责互不重叠——gradle.properties 管"构建环境怎么跑"(JVM 参数、开关、缓存),settings.gradle.kts 管"这次构建包含哪些模块、用哪些仓库",build.gradle.kts 管"每个模块怎么编译、依赖什么"。改动任何配置文件后无需重启任何进程,Gradle 会自动检测并按需重启 Daemon(gradle.properties 变更会触发不兼容 Daemon 淘汰)。

三、参数查看与修改方式

3.1 查看构建环境参数:gradle :模块:properties

对任意模块执行 properties 任务可列出其全部项目属性(实测节选,输出较长标注节选):

gradle :app:properties

实测回显(节选首部):

Reusing configuration cache.

> Task :app:properties

------------------------------------------------------------
Project ':app'
------------------------------------------------------------

allprojects: [project ':app']
ant: org.gradle.api.internal.project.DefaultAntBuilder@2bbf834
antBuilderFactory: org.gradle.api.internal.project.DefaultAntBuilderFactory@1451e7d0
application: extension 'application'
artifacts: org.gradle.api.internal.artifacts.dsl.DefaultArtifactHandler_Decorated@348276da
asDynamicObject: DynamicObject for project ':app'

(输出节选,实测首部;后续为 buildDir、extensions、group、name、repositories 等数十项,gradle -q :app:properties | grep version 可按需过滤。)

3.2 修改方式的四个层级与优先级

Gradle 官方文档"Build Environment"章节(2026-10-20 查证)给出的 gradle.properties 生效优先级,从低到高:

  1. 用户级:~/.gradle/gradle.properties(对当前用户所有构建生效);
  2. 工程级:<工程根>/gradle.properties(本篇实测主用,随代码入库,团队共享);
  3. 命令行:-Dorg.gradle.jvmargs=...、--parallel、--no-parallel 等覆盖工程级;
  4. 环境变量:GRADLE_USER_HOME 决定用户主目录位置、JAVA_OPTS 影响客户端 JVM(注意:不是 Daemon 堆,Daemon 堆只认 org.gradle.jvmargs)。

同一参数出现在多层时,高优先级覆盖低优先级;命令行开关 --no-xxx 可临时反转工程级配置(如工程开了 --parallel,单次构建可 gradle build --no-parallel 关闭)。

四、参数总览

gradle.properties 核心参数一览(默认值以 Gradle 9.8.2 实测与官方 Usermanual 为准):

参数作用默认值本文实测
org.gradle.jvmargsDaemon JVM 参数(整体替换默认串)-Xms256m -Xmx512m -XX:MaxMetaspaceSize=384m✅ jps -v 验证
org.gradle.daemon是否启用常驻 Daemontrue✅ --status 对照
org.gradle.daemon.idletimeoutDaemon 空闲多少毫秒后退出10800000(3 小时)✅ 写入生效
org.gradle.parallel多模块并行执行任务false(9.x init 工程建议显式开)✅ 写入生效
org.gradle.workers.maxWorker 进程上限CPU 核数✅ 写入生效
org.gradle.caching构建缓存开关(本地目录缓存)false✅ FROM-CACHE 验证
org.gradle.configuration-cache配置缓存开关false(init 新工程模板已写 true)✅ 二次构建复用验证
org.gradle.java.home指定 Daemon 运行的 JDK取 JAVA_HOME/PATH 中的 java形态说明
systemProp.<jvm 属性名>注入 JVM 系统属性(代理、编码等)无形态说明

settings.gradle.kts 核心块:

块/参数作用
rootProject.name根工程名(产物命名、日志前缀的基础)
include(...)声明参与构建的子模块
pluginManagement { repositories }插件下载仓库(Gradle Plugin Portal 为默认)
dependencyResolutionManagement { repositoriesMode; repositories }依赖仓库集中管理与冲突策略

build.gradle.kts 核心块:

块作用
plugins {}声明并应用插件
repositories {}依赖仓库(被 settings 集中管理时禁写)
dependencies {}依赖坐标与配置(implementation/api/testImplementation…)
java { toolchain {} }编译/测试 JDK 工具链
application {} / applicationDefaultJvmArgs主类与运行时 JVM 参数
tasks.register(...)自定义任务

五、核心参数分类详解

5.1 org.gradle.jvmargs:Daemon 堆内存(重点)

为什么重要:Gradle Daemon 是常驻 JVM,所有构建工作在其内存中完成。JVM 组件纪律要求把 Daemon 堆限制在 256–512MB 之间,避免共享构建机上 Daemon 吃光内存。

默认值实测:9.8.2 未配置时的 Daemon 参数可通过 jps -v(JDK 自带进程查看器)观察。实验:默认配置下启动构建后执行 jps -v | grep GradleDaemon,实测回显(节选关键参数):

1280224 GradleDaemon --add-opens=java.base/java.lang=ALL-UNNAMED ... -XX:MaxMetaspaceSize=384m -XX:+HeapDumpOnOutOfMemoryError -Xms256m -Xmx512m -Dfile.encoding=UTF-8 ...

即默认 -Xms256m -Xmx512m -XX:MaxMetaspaceSize=384m,外加 HeapDumpOnOutOfMemoryError 与一组 --add-opens/--add-exports 模块开放参数。

改动实验:向工程根 gradle.properties 写入:

org.gradle.jvmargs=-Xmx384m -XX:+UseSerialGC

执行 gradle help 触发重建 Daemon(参数变更后旧 Daemon 不再兼容,Gradle 自动另起新 Daemon),再查 jps -v | grep GradleDaemon,实测新 Daemon 参数:

1308462 GradleDaemon --add-opens=java.base/java.lang=ALL-UNNAMED ... -XX:+UseSerialGC -Xmx384m -Dfile.encoding=UTF-8 ...

两个关键结论(实测得出):

  1. org.gradle.jvmargs 是整体替换默认参数串——设为 -Xmx384m 后默认的 -Xms256m、-XX:MaxMetaspaceSize=384m 全部消失。因此生产配置建议写全三件(堆起、堆顶、元空间上限)。
  2. 验证生效的标准手段是 jps -v(gradle --status 只显示 PID/状态/版本,不显示 JVM 参数)。

推荐写法(512MB 上限内):

org.gradle.jvmargs=-Xms128m -Xmx512m -XX:MaxMetaspaceSize=256m

改后重启 Daemon(gradle --stop 再任意构建)并验证:jps -v | grep GradleDaemon 应看到 -Xms128m -Xmx512m -XX:MaxMetaspaceSize=256m(本文实测通过)。

5.2 org.gradle.daemon:Daemon 开关与生命周期

作用:控制构建是否走常驻 Daemon。关闭后每次 gradle 命令在单个临时 JVM 内完成全部工作,进程结束即退出。

对照实验:保持默认(daemon 开启)时跑一次构建,然后 gradle --status 查看状态,实测回显:

   PID STATUS   INFO
1309975 IDLE     9.8.2
1277180 STOPPED  (stop command received)
1278967 STOPPED  (stop command received)

在 gradle.properties 中改写:

org.gradle.daemon=false
org.gradle.caching=true

再执行 gradle help(实测回显):

1 actionable task: 1 executed

随后 gradle --status,实测回显首行:

No Gradle daemons are running.
   PID STATUS   INFO
1277180 STOPPED  (stop command received)

结论:daemon=false 时构建进程即起即灭,--status 永远显示 No daemons;日常开发保留 Daemon(默认),CI 一次性容器或资源受限场景可关闭。手动管理命令:gradle --stop 停全部兼容 Daemon、gradle --status 查状态。

org.gradle.daemon.idletimeout 控制空闲退出时长(毫秒)。实验写入 1800(1.8 秒)后构建,Daemon 会在该空闲时长后自行退出(对应日志 Daemon ... has timed out waiting),生产建议保持默认 3 小时即可,测试环境可调小加速回收。

5.3 org.gradle.caching:构建缓存

作用:开启后任务的输出按指纹 key 存入本地构建缓存目录(~/.gradle/caches/build-cache-1),同输入再出现时直接取缓存产物,任务状态显示 FROM-CACHE。

改动实验:gradle.properties 写入 org.gradle.caching=true(见 5.2 的配置块),依次执行:

gradle clean        # 清空输出目录
gradle build        # 正常执行(结果同时写入缓存)
gradle clean build  # 再清再建:输入未变 → 从缓存取

第二次 clean build 实测回显(节选):

> Task :lib:compileJava FROM-CACHE
> Task :app:compileJava FROM-CACHE
> Task :lib:compileTestJava FROM-CACHE
> Task :lib:test FROM-CACHE
BUILD SUCCESSFUL in 719ms

结论:compileJava、test 等任务在输入指纹一致时命中缓存,整条链 719ms 完成;未开缓存时同样的 clean build 需要完整重编译(本文实测 5 executed/4 from cache 的过渡态与全 FROM-CACHE 状态均出现过)。缓存默认只在本机生效,团队级共享需配置 remote(buildCache) 指向 HTTP 构建缓存服务(settings.gradle.kts 中配置)。

5.4 org.gradle.configuration-cache:配置缓存

作用:把"配置阶段"(解析脚本、构建任务图)的结果序列化到磁盘,下次构建直接复用,跳过脚本执行。

实测行为:gradle init 生成的工程模板自带 org.gradle.configuration-cache=true。效果体现在每次构建输出:首次出现 Calculating task graph as no cached configuration is available for tasks: build 与 Configuration cache entry stored.,再次构建则显示 Reusing configuration cache.(本文全部实验回显中反复出现)。

⚠️ 注意两点(均有实测依据):

  1. 主动把该参数从工程配置中移除后,构建会打印提示(实测回显):Consider enabling configuration cache to speed up this build: https://docs.gradle.org/9.8.2/userguide/configuration_cache_enabling.html——9.x 已把配置缓存视为默认推荐项。

  2. 配置缓存对自定义任务有纪律要求:执行期禁止访问 Task.project。实测:写一个在 doLast 里打印 ${project.name} 的任务,执行报错:

    1 problem was found storing the configuration cache.
    - Task `:app:hello` of type `org.gradle.api.DefaultTask`: invocation of 'Task.project' at execution time is unsupported with the configuration cache.
      See https://docs.gradle.org/9.8.2/userguide/configuration_cache_requirements.html#config_cache:requirements:use_project_during_execution
    
    * What went wrong:
    Execution failed for task ':app:hello' (registered in build file 'app/build.gradle.kts').
    > Invocation of 'Task.project' by task ':app:hello' at execution time is unsupported with the configuration cache.
    

    正确写法是把值在配置期捕获为局部变量(实测修复后成功,见 5.7 的自定义任务示例)。

5.5 org.gradle.parallel 与 org.gradle.workers.max

作用:多模块工程中,无依赖关系的模块任务可并行执行;workers.max 限制并行 Worker 进程数。

改动实验:gradle.properties 写入(连同 5.1/5.3 的项一并生效):

org.gradle.jvmargs=-Xms128m -Xmx512m -XX:MaxMetaspaceSize=256m
org.gradle.caching=true
org.gradle.parallel=true
org.gradle.workers.max=4
org.gradle.daemon.idletimeout=1800

执行 gradle clean build 实测回显(节选):

2 actionable tasks: 2 executed

BUILD SUCCESSFUL in 1s
9 actionable tasks: 5 executed, 4 from cache

构建正常完成、无配置告警,说明参数被接受。解读:双模块小工程并行收益小(模块间有依赖链),但参数本身已生效;官方建议在多模块工程开启,且配合 --scan 观察并行度收益。

5.6 systemProp.*:注入 JVM 系统属性(代理/编码)

内网经代理访问外网仓库时,写法为(gradle.properties):

systemProp.http.proxyHost=192.168.1.62
systemProp.http.proxyPort=7897
systemProp.https.proxyHost=192.168.1.62
systemProp.https.proxyPort=7897
systemProp.http.nonProxyHosts=localhost|127.0.0.1

这些属性以 -D 形式注入 Daemon JVM,依赖下载(HTTP 客户端)即走代理。依赖已全部命本地缓存时加配置不会改变构建结果——可用 gradle build --refresh-dependencies 强制重新校验依赖元数据来验证代理链路是否打通(--refresh-dependencies 会重新请求仓库校验和,走代理时应能成功,走不通时抛 Could not resolve ... 连接错误)。本系列安装篇实测:实验网络直连 Maven Central 可达、GitHub 出口不稳,代理配置属于内网标准做法,按上述形态写入即可。

5.7 settings.gradle.kts:模块组成与仓库治理

init 生成的原始内容(--no-split-project + java-library 类型):

plugins {
    id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0"
}

rootProject.name = "demo-multi"

include("lib")

改造为双模块 + 集中仓库管理(本文实验最终形态,实测可用):

plugins {
    id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0"
}

rootProject.name = "demo-multi"

dependencyResolutionManagement {
    repositoriesMode = RepositoriesMode.FAIL_ON_PROJECT_REPOS
    repositories {
        mavenCentral()
    }
}

include("lib")
include("app")

逐项说明:

  • rootProject.name = "demo-multi":根工程名,决定产物命名与日志中的项目标识;
  • include("lib") / include("app"):把两个子目录纳入构建,每个子目录有自己的 build.gradle.kts;
  • dependencyResolutionManagement:把"依赖从哪下"集中到 settings 管理;
  • repositoriesMode = RepositoriesMode.FAIL_ON_PROJECT_REPOS:模块脚本里再写 repositories {} 直接报错,防止仓库声明散落。

冲突实测:settings 启用 FAIL_ON_PROJECT_REPOS 后,app/build.gradle.kts 中保留 repositories { mavenCentral() } 再构建,实测报错(完整错误文本照抄):

* What went wrong:
Build was configured to prefer settings repositories over project repositories but repository 'MavenRepo' was added by build file 'app/build.gradle.kts'

从两个模块脚本中删除各自 repositories {} 块后重新构建,实测通过:

BUILD SUCCESSFUL in 531ms
9 actionable tasks: 9 up-to-date
Configuration cache entry stored.

pluginManagement 块用于插件仓库治理,放在 settings 文件最顶部(Kotlin DSL 要求它必须是第一个块),常见形态:

pluginManagement {
    repositories {
        gradlePluginPortal()
        mavenCentral()
    }
}

5.8 build.gradle.kts:依赖配置的 api 与 implementation 语义差异(实测)

这是 Gradle java-library 插件相对 Maven compile scope 的核心改进:api 依赖会出现在消费者的编译类路径上(传递),implementation 只出现在本模块的运行时/自身编译,不传递给消费者。

实验设置:lib 模块(java-library 插件)依赖 Guava 与 Commons Math3,app 模块只声明 implementation(project(":lib")),不直接依赖任何第三方库:

// lib/build.gradle.kts(dependencies 节选)
dependencies {
    testImplementation(libs.junit.jupiter)
    testRuntimeOnly("org.junit.platform:junit-platform-launcher")
    api(libs.commons.math3)   // 导出给消费者编译期
    implementation(libs.guava) // 仅 lib 内部使用
}

// app/build.gradle.kts(dependencies 节选)
dependencies {
    implementation(project(":lib"))
}

第一轮:app 代码使用 lib 以 api 导出的 commons-math3(App.java 引 org.apache.commons.math3.primes.Primes),实测:

BUILD SUCCESSFUL in 385ms
9 actionable tasks: 9 up-to-date

编译通过——api 依赖跨越模块边界传递到了 app 的编译类路径。

第二轮:app 代码使用 lib 以 implementation 声明的 Guava(App.java 引 com.google.common.collect.ImmutableList),实测报错(完整回显):

* What went wrong:
Execution failed for task ':app:compileJava' (registered by plugin class 'org.gradle.api.plugins.JavaBasePlugin').
> Compilation failed; see the compiler output below.
  /opt/demo-multi/app/src/main/java/com/example/multi/App.java:3: 错误: 程序包com.google.common.collect不存在
  import com.google.common.collect.ImmutableList;
                                  ^
  2 个错误

BUILD FAILED in 1s
2 actionable tasks: 1 executed, 1 up-to-date

第三轮:把 lib 的 Guava 改为 api(libs.guava),重新构建实测通过,gradle :app:run 亦正常输出。

结论与选型纪律:库模块对外暴露的类型若出现在公开方法签名中,用 api;仅内部实现细节用 implementation。后者能显著减少"依赖泄漏",加快下游增量编译(implementation 变更只重编译直接依赖方)。依赖版本则集中在版本目录 gradle/libs.versions.toml 管理(init 模板已生成 guava = "33.5.0-jre"、junit-jupiter = "6.0.1" 等)。

💡 技术拓展:依赖配置(Configuration)不止这两个。常见配置语义对比——

配置编译期可见运行期可见传递给消费者典型用途
api✅(消费者也可见)✅✅公开签名中的类型
implementation✅(仅本模块)✅❌内部实现依赖
compileOnly✅❌❌编译期注解处理器、lombok
runtimeOnly❌✅❌JDBC 驱动、日志实现
testImplementation✅(测试源集)✅(测试运行)❌JUnit、Mockito
testRuntimeOnly❌✅(测试运行)❌JUnit Platform 启动器

本文实验覆盖 api/implementation/testImplementation/testRuntimeOnly 四种(init 模板即包含后两者)。

5.9 build.gradle.kts:工具链与运行参数

java { toolchain { languageVersion = JavaLanguageVersion.of(21) } } 把"用哪个 JDK 编译"声明进工程:运行 Gradle 的 JVM(本机 17)与编译/测试用的 JVM(21)解耦;本机没有 21 时,settings 里的 foojay-resolver 插件自动下载 Temurin JDK(本文环境实测下载了 eclipse_adoptium-21-amd64-linux,落盘 ~/.gradle/jdks/)。

application 插件的运行参数:

application {
    mainClass = "com.example.multi.App"
    applicationDefaultJvmArgs = listOf("-Xms128m", "-Xmx512m")
}

applicationDefaultJvmArgs 控制 gradle run 与发行包启动脚本里应用的 JVM 参数(不是 Daemon 的!Daemon 堆由 5.1 的 org.gradle.jvmargs 管,两层别混)。

5.10 build.gradle.kts:自定义任务(配置缓存兼容写法)

任务注册与执行实测(app/build.gradle.kts 追加):

tasks.register("hello") {
    val projectName = project.name
    doLast {
        println("Hello from custom task, project = $projectName")
    }
}

实测执行:

gradle hello

回显:

> Task :app:hello
Hello from custom task, project = app

BUILD SUCCESSFUL in 392ms
1 actionable task: 1 executed
Configuration cache entry reused.

注意 val projectName = project.name 必须放在 doLast 外(配置期求值)——放进去就会触发 5.4 的配置缓存报错,这是 Gradle 9 时代自定义任务的第一纪律。

六、生产配置模板

适用场景:16GB 内存以下构建机、中型多模块 JVM 工程(≤50 模块)、团队级工程级配置(随仓库提交)。磁盘需预留 ≥5GB 给 ~/.gradle/caches(依赖+构建缓存)。

工程根 gradle.properties(推荐集):

# Daemon 堆上限 512MB(JVM 纪律),写全三件避免整体替换丢默认值
org.gradle.jvmargs=-Xms128m -Xmx512m -XX:MaxMetaspaceSize=256m
# 多模块并行 + 本地构建缓存
org.gradle.parallel=true
org.gradle.caching=true
# 配置缓存(9.x 推荐默认开启)
org.gradle.configuration-cache=true
# 内网代理按需追加(无代理则删除)
# systemProp.http.proxyHost=192.168.1.62
# systemProp.http.proxyPort=7897
# systemProp.https.proxyHost=192.168.1.62
# systemProp.https.proxyPort=7897

关键差异解读:与 init 默认模板相比,此集补齐了 parallel/caching 两项(init 只写 configuration-cache),并把 Daemon 堆显式钉在 512MB 内;jvmargs 写全三件是 5.1 实测教训(整体替换语义)。

用户级 ~/.gradle/gradle.properties(可选,放跨工程个人偏好,不放团队共享项):

org.gradle.daemon.idletimeout=3600000

验证模板生效的完整流程:

gradle --stop          # 停旧 Daemon
gradle build           # 触发新 Daemon
jps -v | grep GradleDaemon   # 应见 -Xms128m -Xmx512m -XX:MaxMetaspaceSize=256m

七、常见问题

Q1:改了 org.gradle.jvmargs,gradle --status 里怎么看不到 JVM 参数? --status 只显示 PID、状态(IDLE/BUSY/STOPPED)与 Gradle 版本。验证 JVM 参数用 jps -v | grep GradleDaemon(本文 5.1 实测)。

Q2:为什么设了 -Xmx384m 后默认的 -Xms256m 没了? org.gradle.jvmargs 是整体替换默认参数串(5.1 实测对比新旧 Daemon 可证)。生产写法应一次给全 -Xms/-Xmx/-XX:MaxMetaspaceSize。

Q3:FROM-CACHE 和 UP-TO-DATE 有什么区别? UP-TO-DATE 是增量构建判定:输出目录里的产物还在且输入指纹没变,跳过执行;FROM-CACHE 是构建缓存命中:产物已被 clean 掉,但按输入指纹从缓存目录拷回(5.3 实测)。前者不走拷贝,后者有产物恢复动作。

Q4:settings 里集中管仓库后,模块里为什么报 MavenRepo 错误? RepositoriesMode.FAIL_ON_PROJECT_REPOS 会拒绝模块脚本里的 repositories {} 声明(5.7 实测报错文本)。二选一:删模块内仓库声明(推荐,走 settings 集中管理),或把 mode 改为 PREFER_PROJECT。

Q5:自定义任务报 "invocation of 'Task.project' at execution time is unsupported"? 配置缓存开启后执行期禁止访问 project 对象(5.4/5.10 实测)。把需要的值在配置期存进局部变量,或改用 providers.gradleProperty(...) 这类 Provider API。

Q6:api 和 implementation 到底怎么选? 看类型是否出现在"库对外公开的签名"里:公开方法参数/返回值用到的依赖选 api;仅内部实现用 implementation(5.8 三轮实测:implementation 不传递、api 传递)。拿不准时先 implementation,编译报错再升 api,编译器会替你把关。

Q7:依赖已经下载过,改了代理配置怎么验证代理生效? 执行 gradle build --refresh-dependencies 强制重新校验依赖元数据:代理通则构建成功并刷新缓存,代理不通则抛连接类错误(Could not resolve / timeout)。

八、参考链接

  1. Gradle Usermanual · Build Environment(gradle.properties 全量参数):https://docs.gradle.org/current/userguide/build_environment.html
  2. Gradle Usermanual · Configuration Cache 要求与限制:https://docs.gradle.org/9.8.2/userguide/configuration_cache_requirements.html
  3. Gradle Usermanual · Java Library 插件(api/implementation):https://docs.gradle.org/current/userguide/java_library_plugin.html
  4. Gradle Usermanual · Multi-Project Builds(settings 文件):https://docs.gradle.org/9.8.2/userguide/multi_project_builds.html
  5. Gradle Daemon 生命周期:https://docs.gradle.org/current/userguide/gradle_daemon.html
  6. 本系列篇目:《Ubuntu 22.04 安装 Gradle 9.8 指南》、《Gradle 9.8 常用 CLI 命令详解》