java - 如何使用具有多个 jdk 版本的 gradle 构建多个项目?

标签 java gradle build.gradle

我有多个项目并使用不同的 jdks(IBM、SUN)和版本(1.6、1.7、1.8)构建。

在每个项目的 gradle 脚本中,我都定义了 sourceCompatibility 和 targetCompatibility。如何定义每个项目特定的 org.gradle.java.home

如果我在我的主项目 gradle.properties 文件中将 IBM jdk 6 定义为 org.gradle.java.home,其他项目构建将失败。

我只有 gradle.properties 文件主要 gradle 项目。

我不想使用 JAVA_HOME 类路径变量来运行我的 gradle 脚本。 我正在使用 gradle 2.3。

请提供一些解决此问题的建议?

最佳答案

从 Gradle 6.7 开始,Gradle 引入了 toolchains for the JVM 的概念. 工具链 允许定义用于编译/运行项目的 JDK 版本,这是一个不同于运行 gradle 的 JDK。

这就像在构建脚本中编写一样简单:

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(15)
    }
}

Gradle 将在通常的标准本地路径上查找请求的工具链(您也可以通过 org.gradle.java.installations.paths 属性提供您自己的查找位置),并最终可以下载它。它甚至支持多个 OpenJDK 供应商。他们的documentation解释一切。

因此对于多项目设置,您可以执行以下操作:

.
├── jdk11
│   ├── build.gradle
│   └── src
├── jdk16
│   ├── build.gradle
│   └── src
├── jdk17
│   ├── build.gradle
│   └── src
├── build.gradle
├── gradle.properties
└── settings.gradle
  • settings.gradle

    rootProject.name = 'THE-project'    
    include("jdk11", "jdk16", "jdk17")
    
  • build.gradle

    subprojects {
      apply(plugin: "java-library") // or whatever applies to the sub-project
    
      // repositories, test, ...
    }
    ``
    
    
  • gradle.properties 该属性是可选的,只有在需要额外的查找路径时才会出现

    org.gradle.java.installations.paths=/path to panama jdk,/path to loom jdk,etc
    
  • jdk11/build.gradle

    java {
      toolchain {
        languageVersion = JavaLanguageVersion.of(11)
      }
    }
    
    tasks.withType(JavaCompile) {
      options.release.set(11)
    }
    
    // dependencies, etc.
    
  • jdk16/build.gradle

    java {
      toolchain {
        languageVersion = JavaLanguageVersion.of(16)
      }
    }
    
    tasks.withType(JavaCompile) {
      options.release.set(16)
    }
    
    // dependencies, etc.
    
  • jdk17/build.gradle

    java {
      toolchain {
        languageVersion = JavaLanguageVersion.of(17)
      }
    }
    
    tasks.withType(JavaCompile) {
      options.release.set(17)
      options.compilerArgs = ['--add-modules=jdk.incubator.foreign',
                              '--enable-preview',
                              '-Xlint:preview']
    }
    
    // dependencies, etc.
    

我不知道 Eclipse,但这在 IntelliJ IDEA 2021.1 中工作得很好。 我使用 JDK 11 在 shell 中运行 gradle,IntelliJ IDEA 也设置为使用 JDK 11 运行 Gradle(设置 | 构建工具 | Gradle)。


目前唯一的缺点是 JavaExec 任务必须配置正确的启动器(例如使用(子)项目的工具链)。 IntelliJ 使用 JavaExec 任务运行主类,这也将从中受益。

tasks.withType(JavaExec){
    javaLauncher.set(javaToolchains.launcherFor(java.toolchain))
}

跟踪gradle/gradle#14363关于这件事。


关于java - 如何使用具有多个 jdk 版本的 gradle 构建多个项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30527193/

相关文章:

java - 在 HTML 中查找子元素的 xpath 时出错

java - 了解第三方库的测试和编译依赖关系

android - 使用 android studio 与 ./gradlew assemble[FlavourName]Release 生成 flavor 签名 APK 提供不同的结果

android - Gradle 同步失败 : Could not determine artifacts for com. android.support :recyclerview-v7:24. 0.0

android - Android Studio:由于gradle分发网址错误而无法构建应用

java - 如何在 Gradle 中创建两个任务

java - 当我在 fragment 中后按时按钮不可见

java - LuaJ 和 Android : cannot bind class

java - 在 Android 中以度为单位绘制三角函数

Android Gradle 任务在构建后复制文件