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.
请提出一些建议来解决这个问题?
从 Gradle 6.7 开始,Gradle 引入了JVM工具链的概念。工具链允许定义用于编译/运行项目的 JDK 版本,该版本与运行 gradle 的 JDK 不同。
\n这就像在构建脚本中编写一样简单:
\njava {\n toolchain {\n languageVersion = JavaLanguageVersion.of(15)\n }\n}\nRun Code Online (Sandbox Code Playgroud)\nGradle 将在通常的标准本地路径上查找请求的工具链(您甚至可以通过属性提供您自己的查找位置org.gradle.java.installations.paths),并最终下载它。它甚至支持多个 OpenJDK 供应商。他们的文档解释了这一切。
因此,对于多项目设置,您可以执行以下操作:
\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\nRun Code Online (Sandbox Code Playgroud)\nsettings.gradle
rootProject.name = \'THE-project\' \ninclude("jdk11", "jdk16", "jdk17")\nRun Code Online (Sandbox Code Playgroud)\nbuild.gradle
subprojects {\n apply(plugin: "java-library") // or whatever applies to the sub-project\n\n // repositories, test, ...\n}\n``\n\nRun Code Online (Sandbox Code Playgroud)\ngradle.properties该属性是可选的,仅当需要额外的查找路径时才使用
org.gradle.java.installations.paths=/path to panama jdk,/path to loom jdk,etc\nRun Code Online (Sandbox Code Playgroud)\njdk11/build.gradle
java {\n toolchain {\n languageVersion = JavaLanguageVersion.of(11)\n }\n}\n\ntasks.withType(JavaCompile) {\n options.release.set(11)\n}\n\n// dependencies, etc.\nRun Code Online (Sandbox Code Playgroud)\njdk16/build.gradle
java {\n toolchain {\n languageVersion = JavaLanguageVersion.of(16)\n }\n}\n\ntasks.withType(JavaCompile) {\n options.release.set(16)\n}\n\n// dependencies, etc.\nRun Code Online (Sandbox Code Playgroud)\njdk17/build.gradle
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.\nRun Code Online (Sandbox Code Playgroud)\n我不了解 Eclipse,但这在 IntelliJ IDEA 2021.1 中工作得很好。\n我使用 JDK 11 在 shell 中运行 gradle,并且 IntelliJ IDEA 也设置为使用 JDK 11 运行 Gradle(设置 |构建工具) | 摇篮)。
\n目前唯一的缺点是JavaExec必须使用正确的启动器配置任务(例如使用(子)项目的工具链)。IntelliJ 使用 JavaExec 任务运行主类,这也将从中受益。
tasks.withType(JavaExec){\n javaLauncher.set(javaToolchains.launcherFor(java.toolchain))\n}\nRun Code Online (Sandbox Code Playgroud)\n跟踪gradle/gradle#14363关于此事。
\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)
| 归档时间: |
|
| 查看次数: |
1269 次 |
| 最近记录: |