以编程方式获取当前 Gradle 版本支持的最新 Java 版本

Dan*_*ini 5 java automation build gradle kotlin

我目前的问题如下:我希望能够检测出哪个是我目前用于构建某个项目的 Gradle 版本的最新官方支持的Java 版本。我找不到相应的 API,GradleVersion没有提供有关最大支持的 Java 工具链的信息。我找到信息的唯一地方是在 Javadoc 文档中JavaVersion.java

...
    /**
     * Java 16 major version.
     *
     * @since 6.3
     */
    VERSION_16,

    /**
     * Java 17 major version.
     * Not officially supported by Gradle. Use at your own risk.
     *
     * @since 6.3
     */
    VERSION_17,
...
Run Code Online (Sandbox Code Playgroud)

尚未支持的版本有Not officially supported by Gradle. Use at your own risk.一行,但以这种方式检测最大支持的版本对于我的范围来说太脆弱了。

换句话说,我希望能够编写以下 Kotlin 扩展函数:

/**
  * Returns 16 for Gradle 7.2, Returns 13 for Gradle 6.0, etc.
  */
fun GradleVersion.latestSupportedJava(): JavaVersion = ...
Run Code Online (Sandbox Code Playgroud)

对于我的范围,如果该函数只能为 Gradle 7.2+ 定义(即,如果它使用的 API 在以前版本的 Gradle 中不存在),那就太好了。


我正在添加一个细节:目前我发现的不太糟糕的方法是抓取这个 URL:docs.gradle.org/current/userguide/compatibility.html,它仍然相当脆弱。这个函数可以工作,但是,如上所述,设计上很脆弱,甚至忘记通过正则表达式抓取页面通常不是一个好主意。

fun latestSupportedJava(): JavaLanguageVersion =
    Regex("""<tr.*>[\s|\n|\r]*<td.*>.*?(\d+).*?<\/td>[\s|\n|\r]*<td.*>.*?(\d+(?:\.\d+)).*?<\/td>""")
        .findAll(URL("https://docs.gradle.org/current/userguide/compatibility.html").readText())
        .map {
            val (javaVersion, gradleVersion) = it.destructured
            JavaLanguageVersion.of(javaVersion) to GradleVersion.version(gradleVersion)
        }
        .filter { (_, gradleVersion) -> GradleVersion.current() >= gradleVersion }
        .maxByOrNull { (_, gradleVersion) -> gradleVersion }
        ?.first
        ?: JavaLanguageVersion.of(16)
Run Code Online (Sandbox Code Playgroud)

更新:我向 Gradle 人员提出了一个功能请求