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)