Java 如何使gradle在编译时使用正确的JDK?

Java 如何使gradle在编译时使用正确的JDK?,java,gradle,build.gradle,gradlew,Java,Gradle,Build.gradle,Gradlew,我们使用gradle构建Java项目,一些基于JDK7,一些基于JDK8。我知道org.gradle.java.home属性,但在我看来它似乎有缺陷 如果我在“~/.gradle/gradle.properties”中配置它,这将迫使我对所有gradle项目使用相同的JDK 如果我在“/my git project/gradle.properties”中配置它,这将迫使我在共享git存储库中放置对本地JDK安装的引用。JDK的路径不属于那里 我基本上希望在“~/.gradle/gradle.pr

我们使用gradle构建Java项目,一些基于JDK7,一些基于JDK8。我知道org.gradle.java.home属性,但在我看来它似乎有缺陷

如果我在“~/.gradle/gradle.properties”中配置它,这将迫使我对所有gradle项目使用相同的JDK

如果我在“/my git project/gradle.properties”中配置它,这将迫使我在共享git存储库中放置对本地JDK安装的引用。JDK的路径不属于那里

我基本上希望在“~/.gradle/gradle.properties”中有类似的内容:

systemProp.jdk8=/my/local/path/to/jdk8
systemProp.jdk7=/my/local/path/to/jdk7
org.gradle.java.home=$systemProp.jdk8
在“/my git project/gradle.properties”的源代码管理下:

systemProp.jdk8=/my/local/path/to/jdk8
systemProp.jdk7=/my/local/path/to/jdk7
org.gradle.java.home=$systemProp.jdk8

这方面的最佳解决方案/解决方法是什么?

我们这样处理这个问题:

The one who starts the build is responsible for properly setting JAVA_HOME

在开发人员的机器上,这可能是脆弱的。但是,如果您从专用构建服务器构建和部署,它工作得非常好。

这更多的是一个过程问题,而不是一个Gradle或Java问题。最终,您必须强制每个人指定他们的各种JAVA_主页,而不必过于繁重。您有几个选择:

  • 命令行:./gradlew-Dorg.gradle.java.home=/path\u to\ujdk\u目录
  • 但是,当然,现在每个人在每次运行构建时都必须在命令行中键入一些可怕的垃圾

  • gradle.properties并签入路径。然后,让每个人都使用相同的路径
  • 不是每个人都想使用相同的路径,特别是如果你有Mac/Unix和PC用户的话

    2b。每个人都可以使用其自定义值修改其本地gradle.properties,而不是使用相同的路径,然后再也不签入其修改

    主要问题是:有人完全会签入他们的本地值,把CI和其他人搞砸

  • gradle.properties.template签入,每个人都创建自己的gradle.properties;将gradle.properties放入.gitignore中

  • 这可能是你最好的选择。您有一个签入的模板文件,但每个人都必须将其复制到gradle.properties并填写其特定值。您需要设置CI以执行类似的操作,或者签入gradle.CI.properties之类的内容并让CI使用它。但是,每个人只需要做一次,而不是每次构建一次。不幸的是,他们将不得不在每次模板更改时更新他们的个人文件(除非您编写一些代码来这样做)。

    这实际上是一个java问题,而不是gradle问题,如果java不提供切换jdk或查询可用jdk版本的机制,我看不出gradle如何处理这个问题——事实上它也没有。任何基于java的工具都存在着完全相同的问题,一切都取决于java_HOME。我等不及要支持JDKsI正在做的工作(3),这很好。如果您是从Android的角度来看这一点的话,还可以使用sourceTarget和compileTarget枚举编译选项{}闭包。