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

use*_*599 9 java gradle build.gradle

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

在我的每个项目的gradle脚本中,我定义了sourceCompatibility和targetCompatibility.如何定义每个项目的具体内容org.gradle.java.home

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

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

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

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

Bri*_*ice 5

从 Gradle 6.7 开始,Gradle 引入了JVM工具链的概念。工具链允许定义用于编译/运行项目的 JDK 版本,该版本与运行 gradle 的 JDK 不同。

\n

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

\n
java {\n    toolchain {\n        languageVersion = JavaLanguageVersion.of(15)\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

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

\n
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 jdk11\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 build.gradle\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 src\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 jdk16\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 build.gradle\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 src\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 jdk17\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 build.gradle\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 src\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 build.gradle\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 gradle.properties\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 settings.gradle\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  • settings.gradle

    \n
    rootProject.name = \'THE-project\'    \ninclude("jdk11", "jdk16", "jdk17")\n
    Run Code Online (Sandbox Code Playgroud)\n
  • \n
  • build.gradle

    \n
    subprojects {\n  apply(plugin: "java-library") // or whatever applies to the sub-project\n\n  // repositories, test, ...\n}\n``\n\n
    Run Code Online (Sandbox Code Playgroud)\n
  • \n
  • gradle.properties该属性是可选的,仅当需要额外的查找路径时才使用

    \n
    org.gradle.java.installations.paths=/path to panama jdk,/path to loom jdk,etc\n
    Run Code Online (Sandbox Code Playgroud)\n
  • \n
  • jdk11/build.gradle

    \n
    java {\n  toolchain {\n    languageVersion = JavaLanguageVersion.of(11)\n  }\n}\n\ntasks.withType(JavaCompile) {\n  options.release.set(11)\n}\n\n// dependencies, etc.\n
    Run Code Online (Sandbox Code Playgroud)\n
  • \n
  • jdk16/build.gradle

    \n
    java {\n  toolchain {\n    languageVersion = JavaLanguageVersion.of(16)\n  }\n}\n\ntasks.withType(JavaCompile) {\n  options.release.set(16)\n}\n\n// dependencies, etc.\n
    Run Code Online (Sandbox Code Playgroud)\n
  • \n
  • jdk17/build.gradle

    \n
    java {\n  toolchain {\n    languageVersion = JavaLanguageVersion.of(17)\n  }\n}\n\ntasks.withType(JavaCompile) {\n  options.release.set(17)\n  options.compilerArgs = [\'--add-modules=jdk.incubator.foreign\',\n                          \'--enable-preview\',\n                          \'-Xlint:preview\']\n}\n\n// dependencies, etc.\n
    Run Code Online (Sandbox Code Playgroud)\n
  • \n
\n

我不了解 Eclipse,但这在 IntelliJ IDEA 2021.1 中工作得很好。\n我使用 JDK 11 在 shell 中运行 gradle,并且 IntelliJ IDEA 也设置为使用 JDK 11 运行 Gradle(设置 |构建工具) | 摇篮)。

\n
\n

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

\n
tasks.withType(JavaExec){\n    javaLauncher.set(javaToolchains.launcherFor(java.toolchain))\n}\n
Run Code Online (Sandbox Code Playgroud)\n

跟踪gradle/gradle#14363关于此事。

\n
\n


小智 0

我不是 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"
   }
Run Code Online (Sandbox Code Playgroud)