如何通过Gradle将实际构建项目的JDK信息写入MANIFEST.MF
解决方法
要将实际用于构建项目的JDK标识信息写入MANIFEST.MF,需要通过Gradle的JavaToolchainService解析工具链配置,获取真实匹配的JDK详情,而非直接使用运行Gradle的系统JDK信息或工具链配置模板。具体修改如下:
修改后的build.gradle配置
// 获取Gradle工具链服务实例 def toolchainService = project.services.get(JavaToolchainService.class) // 根据项目工具链配置,解析出实际使用的JDK实例 def actualToolchain = toolchainService.resolveToolchain(project.java.toolchain) tasks.named('jar') { manifest { attributes( 'Implementation-Title': project.name, 'Build-Jdk': "${actualToolchain.languageVersion} (${actualToolchain.vendor.get().displayName} ${actualToolchain.vmVersion.get()})", 'Build-Jdk-Vendor': actualToolchain.vendor.get().displayName, 'Build-Jdk-Version': actualToolchain.languageVersion ) } } // 项目工具链配置(保持不变) java { toolchain { languageVersion = JavaLanguageVersion.of(21) } }
关键说明
JavaToolchainService.resolveToolchain()会根据你的工具链配置,找到本地实际可用的JDK实例,包含真实的版本号、厂商名称、VM版本等核心信息- 不再使用
System.properties(这是执行Gradle的系统JDK信息),也不再直接引用project.java.toolchain(这只是工具链的匹配规则,不是实际JDK详情) - 可按需扩展字段,比如添加
actualToolchain.installationPath获取JDK安装路径,或actualToolchain.vmName获取VM名称
生成的MANIFEST.MF示例
Implementation-Title: your-project-name Build-Jdk: 21 (Azul Systems, Inc. 21.0.1+12-LTS) Build-Jdk-Vendor: Azul Systems, Inc. Build-Jdk-Version: 21
内容的提问来源于stack exchange,提问作者Will
相关产品推荐
相关产品推荐

