Gradle:无法从'11.0.2'确定Java版本。

229
我运行了以下评论:
./gradlew app:installDebug

只见日志中出现了以下内容:
FAILURE: Build failed with an exception.

* What went wrong:
Could not determine java version from '11.0.2'.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

* Get more help at https://help.gradle.org

当我运行./gradlew --version时,我得到了以下结果:
FAILURE: Build failed with an exception.

* What went wrong:
Could not determine java version from '11.0.2'.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

* Get more help at https://help.gradle.org

我的 .../gradle/wrapper/gradle-wrapper.properties 包含以下内容,包括 distributionUrl=.../gradle-4.1-rc-1-all.zip:
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-rc-1-all.zip

5
根据这个错误报告,你的Gradle Wrapper可能过期了,这是可能的吗? - Roddy of the Frozen Peas
2
你运行命令./gradlew,它会启动与该特定项目相关联的Gradle版本。不能保证项目的版本与你安装的版本(5.1.1)相同。 - tryman
1
这个版本信息是由 gradle --version 还是 ./gradlew --version 命令得出的?基于 Gradle 的项目通常使用 wrapper 来使不同的开发者可以使用相同的 Gradle 版本来构建项目,这也使得构建更加稳定。 - Slaw
这是 gradle --version 的版本。 - lesley2958
你能否前往你的项目文件夹并打开文件:.../gradle/wrapper/gradle-wrapper.properties?请使用简单的文本编辑器打开它。里面的“distributionUrl”应该告诉我们包装程序的版本。 - tryman
已更新我的回答并附上了内容!看起来包装器是在4.1上,所以这就是我的问题? - lesley2958
29个回答

201

您的系统中有两个不同的Gradle应用程序。

  1. 系统范围内的Gradle
    该应用程序通过gradle(参数)调用。

  2. gradle-wrapper
    gradle-wrapper特定于每个项目,只能在项目目录内使用命令./gradlew(参数)调用。

您的系统范围内的Gradle版本为5.1.1(正如OP在评论中解释的那样,运行命令gradle --version返回版本5.1.1)。

然而,失败是对gradle-wrapper(./gradlew)的调用结果。请检查您项目的gradle wrapper版本。为此,请在包含gradlew和gradlew.bat文件的项目文件夹中执行./gradlew --version命令。

更新1:
由于运行./gradlew --version失败,您可以通过打开文件手动检查您的wrapper版本:

(project's root folder)/gradle/wrapper/gradle-wrapper.properties可以使用简单的文本编辑器打开。其中的"distributionUrl"应该告诉我们wrapper的版本。
更新2: 根据OP的更新问题,gradle-wrapper的版本是4.1RC1。 Gradle 在Gradle 5.0中添加了对JDK 11的支持。因此,由于4.1RC不支持在JDK 11上运行,这绝对是一个问题。
明显的方法是将您的项目gradle-wrapper更新到5.0版本。
但在更新之前,请尝试运行gradle app:installDebug。这将使用您系统范围内安装的Gradle,其版本为5.1.1并支持在Java 11上运行。如果成功,则您的buildscript(文件build.gradle)不受v.4.1RC1和v.5.1.1之间任何破坏性更改的影响,然后可以通过在项目文件夹内从命令行执行以下操作来更新包装程序:gradle wrapper --gradle-version=5.1.1 [*]。
如果gradle app:installDebug无法正确执行,则可能需要升级Gradle buildscript。对于从v.4.1RC1升级到5.1.1,Gradle项目提供了一个指南(1, 2),其中列出了次要版本之间的破坏性更改和弃用功能,以便您逐步更新到最新版本。

或者,如果由于某些原因您无法或不想升级Gradle buildscript,您始终可以选择降级到一种Gradle 4.1RC1支持运行的Java版本。

[*] 正如@lupchiazoem在答案中正确指出的那样,使用gradle wrapper --gradle-version=5.1.1(而不是我最初错误地发布的./gradlew)。原因是Gradle在Java上运行。您可以使用任何工作的Gradle分发版来更新gradle-wrapper,无论是系统范围内安装的Gradle还是gradle-wrapper本身。但是,在这种情况下,您的包装程序与已安装的Java版本不兼容,因此您必须使用系统范围的Gradle(即gradle而不是./gradlew)。


2
@tryman,谢谢!对我来说,是你提供的更新2帮了我大忙。作为一个经验法则,我想我会一直检查gradle版本。 - Avid Programmer
1
你没有明确说明错误的原因。是不同的版本引起的吗? - João Pimentel Ferreira
1
什么?我认为更新2已经很清楚了。她试图使用JDK11运行版本为4.1RC1的Gradle包装器。Gradle在5.0版本中添加了对JDK11的支持。那么@JoãoPimentelFerreira,你到底是什么困惑呢?这就是原因,其余的解决方案是如何将项目的包装器更新到支持JDK11的较新版本。 - tryman
1
现在轮到我感到困惑了。如果您的项目文件夹中确实同时存在Gradle包装器和系统范围内的Gradle安装,则上述逐步解决方案应该适用于您。您是否尝试通过在项目文件夹内执行更新命令 gradle wrapper --gradle-version=5.0 来升级您的包装器?将5.0替换为您想要的版本,我认为现在最新的是5.4。 - tryman
1
然而需要注意的是:在您的包装器(wrapper)版本3.3与任何5.x版本之间,肯定会有一些破坏性的更改,您可能遇到也可能不遇到。这就是为什么在我的回答中,我建议您先使用系统范围内的Gradle构建项目,以验证您要升级到的5.x版本是否能够平稳运行,然后再更新项目的wrapper。如果您很着急(我感受到了您的紧迫感),您可以直接使用系统gradle,或降级到较旧的JDK,稍后再跟上升级wrapper的步伐。 - tryman
显示剩余6条评论

51

由于distributionUrl仍然指向旧版本,因此请使用以下命令升级Gradle包装器:

gradle wrapper --gradle-version 5.1.1

注意:使用gradle而不是gradlew


7
或者只需替换gradle/wrapper/gradle-wrapper.properties中的版本号:distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip使用JDK12安装的6版本似乎无法运行。5.1.1版本可以正常工作,谢谢。 - Liam Kernighan

31

我遇到类似问题,通过将gradle/wrapper/gradle-wrapper.properties的版本更新为以下内容来解决:

distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip

19
在我的情况下,JAVA_HOME变量被设置为/usr/lib/jvm/jdk-11.0.2/。只需要像这样取消设置变量即可:$ export JAVA_HOME=

1
这也解决了我的问题。jenv 可能最初引起了我的问题。 - jokarl
对我来说,GRADLE_HOME 已经被更新(到5.4.1),但是 Gradle 版本仍然指向旧版本 4.3,这很奇怪,但重新启动终端可以解决问题。对于 source ~/.bash_profile 来说也有一些奇怪的问题。 - prayagupa

15

tl;dr: 运行update-alternatives降级Java。


我的系统 gradle 版本是 4.4.1,gradle wrapper 版本是 4.0。在运行其他答案给出的命令后:

gradle wrapper --gradle-version 4.4.1

我仍然遇到了相同的错误:

FAILURE: Build failed with an exception.

* What went wrong:
Could not determine java version from '11.0.4'.

结果发现直到Gradle 4.8版本才支持Java 11,而我的软件仓库只有4.4.1。(升级到更新的Gradle版本可能与我尝试编译的包不兼容。)

答案是降级Java。我的系统实际上已经安装了Java 8,通过运行此命令并按照说明进行操作,可以轻松地在Java版本之间切换:

sudo update-alternatives --config java

6

我这里也遇到了同样的问题。

在我的情况下,我需要使用旧版本的JDK。我正在使用sdkmanager管理JDK版本,因此我将虚拟机的版本更改为1.8。

sdk use java 8.0.222.j9-adpt

之后,应用程序在这里按预期运行。


5
由于您的包装器版本不支持11+,因此您可以通过简单的技巧永久欺骗新版本的InteliJ
  press3x Shift -> type "Switch Boot JDK" -> and change for java 8. 

如果您想使用Java 11+进行工作,只需更新包装器版本为4.8+即可。


3
提醒一下,不要尝试在Android Studio上使用这个解决方案,否则会导致破坏。 - Mauricio Sartori

5
简而言之,使用系统的 gradle 工具升级你的 gradlew。请注意,即使你的系统 gradle 版本为 < 5,下面的升级方法也适用。
gradle wrapper --gradle-version=5.1.1

4

在Windows中我遇到了同样的问题,我的gradle配置是使用JDK1.8,但JAVA_HOME配置为使用另一个JDK。

解决方案:

根据你在gradle中配置的JDK正确设置JAVA_HOME

enter image description here


这是目前在Windows 10上为我正常工作的唯一解决方案。Sdkman 如此处所建议也可以解决问题,但在Windows下有点棘手。 - Cadoiz

4
我遇到了同样的问题。将gradle升级到5.0版本后,问题得到解决。 这个链接提供了安装gradle 5.0的详细步骤。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接