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

时间:2015-05-29 10:24:48

标签: java gradle build.gradle

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:1)

从 Gradle 6.7 开始,Gradle 引入了 toolchains 的概念。 工具链允许定义用于编译/运行项目的 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 中运行(设置 | 构建工具 | Gradle)。

答案 1 :(得分: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"
   }
相关问题