我有多个项目并使用不同的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。
请提出一些建议来解决这个问题?
答案 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编译你的项目,你应该知道,
https://docs.gradle.org/current/userguide/userguide_single.html#build_environment 中的“...配置按以下顺序应用(如果选项是 在多个位置配置,最后一个获胜):
来自项目构建目录中的gradle.properties。
来自gradle用户主页中的gradle.properties。
来自系统属性,例如当-Dsome.property是 在命令行上设置。“
其次,如果您想动态配置编译器,这可能会对您有所帮助,
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"
}