我们很高兴宣布 Gradle 8.14 发布(发布日期 2025-04-25)。
Gradle 现在支持 Java 24。
此版本增加了对选择 GraalVM Native Image 工具链的支持,并包含了 测试报告增强功能,以便在跳过测试(例如,因为假设)时显示原因。
Gradle 8.14 引入了 延迟依赖配置初始化,以提高配置性能和内存使用率。Problems API 进行了扩展,以支持任意结构化数据,使得 IDE 通过 Tooling API 消费丰富的诊断信息更加容易。
此外,配置缓存包含一个新的完整性检查模式,用于改进调试。
我们要感谢以下社区成员对 Gradle 此版本的贡献:Aurimas, Ben Bader, Björn Kautler, chandre92, Daniel Hammer, Danish Nawab, Florian Dreier, Ivy Chen, Jendrik Johannes, jimmy1995-gu, Madalin Valceleanu, Na Minhyeok。
请务必查看 公共路线图,了解未来版本的计划。
通过更新项目中的 Wrapper,将你的构建切换到使用 Gradle 8.14
./gradlew wrapper --gradle-version=8.14 && ./gradlew wrapper
请参阅 Gradle 8.x 升级指南,了解升级到 Gradle 8.14 时的废弃项、重大更改和其他注意事项。
有关 Java、Groovy、Kotlin 和 Android 的兼容性信息,请参阅 完整兼容性说明。
通过此版本,Gradle 支持 Java 24。这意味着除了用于 工具链 之外,你现在还可以将 Java 24 用于 daemon。
第三方工具与 Java 24 的兼容性可能仍然有限。如果你正在使用 Tooling API,由于它使用 JNI,你需要在启动时启用原生访问。详情请参阅 JEP 472。
更多详情请参阅 兼容性文档。
Gradle 的 工具链支持 允许为项目构建(编译代码、运行测试,甚至运行 Gradle 本身)提供和选择特定的 JDK 版本。
通过此版本,工具链选择已扩展到支持 GraalVM Native Image 功能。
java {
toolchain {
languageVersion = JavaLanguageVersion.of(21)
nativeImageCapable = true
}
}
这使得 Gradle 在解析工具链时可以仅选择支持 Native Image 的 JDK。更多详情请参阅 工具链文档。
注意:daemon 工具链 也支持 Native Image 功能选择。
当测试因假设违例而被跳过时,Gradle 现在会在 HTML 和 JUnit XML 报告中都包含原因。这适用于 JUnit 4、JUnit Platform 和 TestNG。例如,JUnit Platform 提供了一个 Assumptions API 来有条件地跳过测试。
package org.example;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assumptions.*;
class LibraryTest {
@Test
void someLibraryMethodReturnsTrue() {
assumeTrue(canExecute(), "missing requirements to run this test");
// Code for the rest of the test
}
}
如果 assumeTrue 检查失败,原因(“缺少运行此测试的要求”)现在在 XML 和 HTML 测试报告中可见。
此功能由 Ivy Chen 和 Aurimas Liutikas 贡献。
Gradle 提供 丰富的 API,供插件作者和构建工程师开发自定义构建逻辑。
从此版本开始,应用 base
插件——无论是直接应用还是通过其他插件(如 Java 或 Kotlin 插件)应用——不再实例化所有使用 register
方法或孵化中的基于角色的工厂方法(如 configurations.resolvable(...)
)声明的配置。
此更改可以减少某些构建的配置时间并降低内存使用。
为了利用此改进,请确保在声明配置时使用 register
方法而不是 create
。
configurations {
// Eager: this configuration is realized immediately
create("myEagerConfiguration")
// Lazy: this configuration is only realized when needed
register("myLazyConfiguration")
}
Gradle 8.13 在 Problems API 中引入了对 附加数据 的支持,允许用户为报告的问题附加额外上下文——尽管存在一些限制。
此版本消除了这些限制。你现在可以在问题报告中包含 任何 任意数据。
此增强功能对于同时管理插件及其通过 Tooling API 集成的 IDE 实现者来说尤其有价值,因为在此场景下,传达丰富、结构化的诊断信息至关重要。
例如,自定义 worker 任务可以报告问题并附加详细的附加数据——包括基本类型字段、列表和复合对象。
public abstract class ProblemWorkerTask implements WorkAction<ProblemsWorkerTaskParameter> {
// Use the Problems interface to report problems
@Inject
public abstract Problems getProblems();
// Use the ObjectFactory to create instances of classes for composition
@Inject
public abstract ObjectFactory getObjectFactory();
@Override
public void execute() {
ProblemId problemId = ProblemId.create("type", "label", ProblemGroup.create("generic", "Generic"));
getProblems().getReporter().report(problemId, problem -> problem
.additionalData(SomeData.class, dataInstance -> {
// Provider API properties can be used as arbitrary data
dataInstance.getSome().set("some");
// Getters and setters can be used as arbitrary data
dataInstance.setName("someData");
// Collections can be used as arbitrary data
dataInstance.setNames(Collections.singletonList("someMoreData"));
SomeOtherData compositionDataInstance = getObjectFactory().newInstance(SomeOtherData.class);
compositionDataInstance.setOtherName("otherName");
// Composition can be used as arbitrary data
dataInstance.setOtherData(compositionDataInstance);
})
);
}
}
附加到问题的数据使用 plain interface 进行建模,并在适用时使用 Gradle 类型。
import org.gradle.api.problems.AdditionalData;
import org.gradle.api.provider.Property;
import java.util.List;
public interface SomeData extends AdditionalData {
Property<String> getSome();
String getName();
void setName(String name);
List<String> getNames();
void setNames(List<String> names);
SomeOtherData getOtherData();
void setOtherData(SomeOtherData otherData);
}
public interface SomeOtherData {
String getOtherName();
void setOtherName(String name);
}
通过此增强功能,Problems API 成为一个更强大的诊断工具——能够在构建、IDE 和 Tooling API 层中传递丰富、结构化和类型化的上下文。
Tooling API (TAPI) 中的新方法 CustomAdditionalData.get()
允许消费者检索与 Gradle 构建期间报告的构建问题(或其他事件)相关的附加数据。
以前,Tooling API 的消费者在检查问题或构建事件时只能访问一组固定的预定义字段。通过此新方法,Gradle 可以在构建期间序列化丰富、结构化的数据,并将其作为类型安全的视图接口暴露给 Tooling API。
在接收端,你可以像这样访问此数据:
void someMethod(List<Problem> problems) {
SomeDataView view = problems.get(0).getAdditionalData().get(SomeDataView.class);
System.out.println(view.getName());
System.out.println(view.getNames().get(0));
System.out.println(view.getOtherData().getOtherName());
}
这些视图接口反映了构建逻辑生成的数据结构。
interface SomeOtherDataView {
String getOtherName();
}
interface SomeDataView {
String getSome();
String getName();
List<String> getNames();
SomeOtherDataView getOtherData();
}
这些类型提供了一种安全、结构化的方式,可以在 IDE 或其他基于 TAPI 的工具中消费自定义数据,而无需依赖脆弱的解析或对内部数据格式的假设。
配置缓存 通过缓存配置阶段的结果并在后续构建中重用它来缩短构建时间。此功能可以显著提高构建性能。
为了帮助诊断隐晦的配置缓存加载错误,你现在可以使用 org.gradle.configuration-cache.integrity-check
属性启用更严格的 完整性检查。
此模式提供更详细的错误消息,以精确指出构建中序列化失败的部分。
例如,你可能不再看到像这样晦涩难懂的错误:
Index 4 out of bounds for length 3
而现在可能看到:
Configuration cache state could not be cached: field `user` of task `:greet` of type `GreetTask`: The value cannot be decoded properly with 'JavaObjectSerializationCodec'. It may have been written incorrectly or its data is corrupted.
注意:启用完整性检查会增加配置缓存的大小并减慢缓存读写速度。仅用于故障排除,不要在常规构建中使用。
已知问题是指发布后发现的与此版本所做更改直接相关的问题。
我们非常欢迎 Gradle 社区的贡献。有关贡献的信息,请参阅 gradle.org/contribute。
如果你发现此版本有问题,请按照我们的 issue 指南在 GitHub Issues 上提交 bug。如果你不确定是否遇到了 bug,请使用 论坛。