【问题标题】:when building a jar, where does Gradle pick the org.gradle.jvm.version from?构建 jar 时,Gradle 从哪里选择 org.gradle.jvm.version?
【发布时间】: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 标志以获取有关其构建方式的更多详细信息?

【问题讨论】:

    标签: java gradle


    【解决方案1】:

    我认为我不明白“为什么”,但我发现了一些简单的方法:我没有在 allprojects 块中使用 java 工具链,而是在 subprojects 中使用它:

    subprojects {
      java {
        toolchain {
          languageVersion = JavaLanguageVersion.of(11)
        }
      }
    }
    

    现在 Jenkins 和本地构建都生成与 JDK 11 兼容的相同库。

    希望这对其他人有所帮助,即使我无法理解原因。随意添加解释它的响应。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-09
      • 2021-03-18
      • 2020-04-10
      • 2023-03-29
      • 1970-01-01
      • 2018-03-31
      • 2019-06-10
      相关资源
      最近更新 更多