- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有多个项目并使用不同的 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/
我是一名优秀的程序员,十分优秀!