在 Gradle 7.6 及以上版本中,Gradle 提供了一种在插件中定义 Java 工具链自动供应逻辑的方法。本页面解释了如何编写一个工具链解析器插件。有关工具链自动供应如何与这些插件交互的详细信息,请参见工具链

提供下载 URI

工具链解析器插件提供了将工具链请求映射到下载响应的逻辑。目前,下载响应只包含下载 URL,但未来可能会扩展。

对于下载 URL,只接受安全的协议,例如 https。这是为了确保在下载过程中没有人能够篡改下载内容。

这些插件通过 JavaToolchainResolver 的实现提供了映射逻辑。

JavaToolchainResolverImplementation.java
public abstract class JavaToolchainResolverImplementation
        implements JavaToolchainResolver { (1)

    public Optional<JavaToolchainDownload> resolve(JavaToolchainRequest request) { (2)
        return Optional.empty(); // custom mapping logic goes here instead
    }
}
1 此类是 abstract 的,因为 JavaToolchainResolver 是一个构建服务。Gradle 在运行时为某些抽象方法提供了动态实现。
2 映射方法返回一个包装在 Optional 中的下载响应。如果解析器实现无法提供匹配的工具链,则封闭的 Optional 包含一个空值。

在插件中注册解析器

使用 settings 插件 (Plugin<Settings>) 注册 JavaToolchainResolver 实现。

JavaToolchainResolverPlugin.java
public abstract class JavaToolchainResolverPlugin implements Plugin<Settings> { (1)
    @Inject
    protected abstract JavaToolchainResolverRegistry getToolchainResolverRegistry(); (2)

    public void apply(Settings settings) {
        settings.getPluginManager().apply("jvm-toolchain-management"); (3)

        JavaToolchainResolverRegistry registry = getToolchainResolverRegistry();
        registry.register(JavaToolchainResolverImplementation.class);
    }
}
1 该插件使用了属性注入,因此它必须是 abstract 类且是一个 settings 插件。
2 要注册解析器实现,请使用属性注入来访问 JavaToolchainResolverRegistry Gradle 服务。
3 解析器插件必须应用 jvm-toolchain-management 基础插件。这会将 jvm 块动态添加到 toolchainManagement 中,从而使注册的工具链仓库可以在构建中使用。