【问题标题】:How build multiple projects with gradle with multiple jdk versions?如何使用多个 jdk 版本的 gradle 构建多个项目?
【发布时间】:2015-05-29 10:24:47
【问题描述】:

我有多个项目并使用不同的 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。

请给一些建议来解决这个问题?

【问题讨论】:

  • 使用if else条件根据项目更改java版本。例如,如果您在构建 xml 中有 Project A 、 B 和 C ,您将 java home 路径定义为 null 并根据您更改 java home 的项目。我认为这将帮助您解决问题。
  • @stacktome 我正在使用 gradle。我该如何添加它?可以给点样品吗?
  • 您唯一的选择是修改JavaCompile 任务。在 2.3 中,您必须查看记录不佳的 JavaToolChaindocs.gradle.org/2.3/dsl/…docs.gradle.org/2.3/javadoc/org/gradle/jvm/toolchain/… 但是工具链已被 2.4 中记录更差的工具解析器所取代:docs.gradle.org/2.4/dsl/…

标签: java gradle build.gradle


【解决方案1】:

从 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


【讨论】:

    【解决方案2】:

    我不是 gradle 大师或专家,但是,

    其实你应该考虑关于 gradle 的两件事:

    如果您想使用 gradle.properties 针对特定的 JVM 编译您的项目,您应该知道,

    "...配置按以下顺序应用(如果选项是 在多个位置配置,最后一个获胜):

    来自项目构建目录中的 gradle.properties。
    来自 gradle 用户主页中的 gradle.properties。
    从系统属性,例如当 -Dsome.property 是 在命令行中设置。”

    https://docs.gradle.org/current/userguide/userguide_single.html#build_environment

    其次,如果您想动态配置编译器,这可能会对您有所帮助,

    apply plugin: "java"
       sourceSets.main.java.srcDirs = ["MyProject/src"]
       dependencies {
          compile fileTree(dir: "MyProject/lib/jar")
       }
       tasks.withType(JavaCompile) {
           options.fork = true
           options.forkOptions.executable = "path/to/javac"
       }
    

    【讨论】:

      猜你喜欢
      • 2014-11-18
      • 1970-01-01
      • 2012-08-22
      • 1970-01-01
      • 2012-06-24
      • 2023-03-21
      • 2011-10-30
      • 1970-01-01
      • 2015-04-26
      相关资源
      最近更新 更多