我有一个项目,其中有一个
build.gradle
文件,看起来(部分)像这样:
tasks.named('jar') {
manifest {
attributes('Implementation-Title': project.name,
'Build-Jdk' : "${System.properties['java.version']} (${System.properties['java.vendor']} ${System.properties['java.vm.version']})",
'Build-Jdk2' : project.java.toolchain,
)
}
}
// Apply a specific Java toolchain to ease working on different environments.
java {
toolchain {
languageVersion = JavaLanguageVersion.of(21)
}
}
JDK 的系统版本是 ZuluFX 11。但是,根据
languageVersion
设置,该项目是针对 ZuluFX 21 构建的。
生成的
MANIFEST.MF
包括:
Build-Jdk: 11.0.21 (Azul Systems, Inc. 11.0.21+9-LTS)
Build-Jdk2: {languageVersion=21, vendor=any, implementation=vendor-specific}
也就是说,它显示的是用于执行 Gradle 的 JDK,而不是用于构建项目的 JDK。我可以包含 toolchain
设置,但这些只是用于查找要构建的 JDK 的设置,而不是找到的 JDK 的详细信息。 如何包含实际用于构建项目的 JDK 的标识?
JavaToolchainService
(
docs) 的扩展上提供的
javaToolchains
。
首先,您可以确保对您正在使用的工具链规范的引用:
def projectToolchain = java.toolchain {
languageVersion = JavaLanguageVersion.of(21)
}
然后使用通过 JavaCompiler
方法提供的
compilerFor
以您需要的格式获取和排列详细信息:
tasks.named('jar') {
manifest {
attributes(
'Implementation-Title': project.name,
'Build-Jdk': javaToolchains.compilerFor(projectToolchain).get().metadata.with {
"$languageVersion ($vendor $javaRuntimeVersion)"
}
)
}
}