【发布时间】:2022-07-21 05:13:41
【问题描述】:
我刚刚将内部库的 JDK 升级到 JDK 17,我有点困惑,因为我在机器上构建的内容和 CI 管道构建的内容似乎有所不同,而两者都应该使用 JDK 17。
在库中,这是一个多模块(它实际上构建了 2 个 jar)我在顶部的 gradle.build 文件中定义了这个:
allprojects {
java {
toolchain {
languageVersion = JavaLanguageVersion.of(11)
}
}
}
我正在使用'net.researchgate.release' version '3.0.0'插件发布。
当我在本地构建它时,这是我的 Gradle 配置:
gradlew -v
------------------------------------------------------------
Gradle 7.4.2
------------------------------------------------------------
Build time: 2022-03-31 15:25:29 UTC
Revision: 540473b8118064efcc264694cbcaa4b677f61041
Kotlin: 1.5.31
Groovy: 3.0.9
Ant: Apache Ant(TM) version 1.10.11 compiled on July 10 2021
JVM: 17.0.1 (Amazon.com Inc. 17.0.1+12-LTS)
OS: Windows 10 10.0 amd64
所以我使用的是 Java 17...
然后我使用 gradlew clean build publishToMavenLocal 在本地构建我的库,它会生成一个 jar 和一个包含以下内容的模块文件:
...
"createdBy": {
"gradle": {
"version": "7.4.2"
}
},
"variants": [
{
"name": "apiElements",
"attributes": {
"org.gradle.category": "library",
"org.gradle.dependency.bundling": "external",
"org.gradle.jvm.version": 11,
"org.gradle.libraryelements": "jar",
"org.gradle.usage": "java-api"
....
这里的重要部分是
"org.gradle.jvm.version": 11
现在,当我在 Jenkins(也使用 JDK 17)上构建完全相同的代码时,使用
gradlew clean build sonarqube
后跟:
gradlew release --stacktrace -Prelease.useAutomaticVersion=true
它向 Nexus 发布了一个类似的模块文件,但我注意到它有
"org.gradle.jvm.version": 17
我现在遇到的问题是我的 JDK 11 应用程序无法使用 Jenkins 构建的库:我明白了:
Incompatible because this component declares a component compatible with Java 17 and the consumer needed a component compatible with Java 11
但是如果我使用本地构建的版本就可以了,这与lib本身的版本没有区别。
当我在本地将java工具链更改为17时,模块文件显示为17,所以它似乎真的是控制模块文件中值的那个属性。
当我在 Jenkins 中运行它时,有什么可以解释这种行为差异的想法吗?是否可以设置一个 gradle 标志以获取有关其构建方式的更多详细信息?
【问题讨论】: