如何使用 Gradle 将构建的 JDK 包含在 MANIFEST.MF 中

问题描述 投票:0回答:1

我有一个项目,其中有一个

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 的标识?

java gradle build.gradle
1个回答
0
投票
您可以使用名为

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)" } ) } }
    
© www.soinside.com 2019 - 2024. All rights reserved.