Kotlin在Java安装中找不到所需的JDK工具

106

当运行./gradlew clean build时,我得到以下消息:

> Task :compileKotlin FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':compileKotlin'.
> Kotlin could not find the required JDK tools in the Java installation '/usr/lib/jvm/java-8-openjdk-amd64/jre' used by Gradle. Make sure Gradle is running on a JDK, not JRE.

我已经安装了JDK,JAVA_HOME也设置正确,update-alternatives也是。

# java -version
openjdk version "1.8.0_191"
OpenJDK Runtime Environment (build 1.8.0_191-8u191-b12-2ubuntu0.16.04.1-b12)
OpenJDK 64-Bit Server VM (build 25.191-b12, mixed mode)
# update-alternatives --config java
There are 3 choices for the alternative java (providing /usr/bin/java).

  Selection    Path                                            Priority   Status
------------------------------------------------------------
* 0            /usr/lib/jvm/default-java/bin/java               1100      auto mode
  1            /usr/lib/jvm/default-java/bin/java               1100      manual mode
  2            /usr/lib/jvm/java-8-openjdk-amd64/bin/java       1         manual mode
  3            /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java   1081      manual mode

以下是启用堆栈跟踪的 Gradle 构建:

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':compileKotlin'.
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:110)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:77)
        at org.gradle.api.internal.tasks.execution.OutputDirectoryCreatingTaskExecuter.execute(OutputDirectoryCreatingTaskExecuter.java:51)
        at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:59)
        at org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:54)
        at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:59)
        at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:101)
        at org.gradle.api.internal.tasks.execution.FinalizeInputFilePropertiesTaskExecuter.execute(FinalizeInputFilePropertiesTaskExecuter.java:44)
        at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:91)
        at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:62)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:59)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54)
        at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:34)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.run(EventFiringTaskExecuter.java:51)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:46)
        at org.gradle.execution.taskgraph.LocalTaskInfoExecutor.execute(LocalTaskInfoExecutor.java:42)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareWorkItemExecutor.execute(DefaultTaskExecutionGraph.java:277)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareWorkItemExecutor.execute(DefaultTaskExecutionGraph.java:262)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$ExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:135)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$ExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:130)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$ExecutorWorker.execute(DefaultTaskPlanExecutor.java:200)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$ExecutorWorker.executeWithWork(DefaultTaskPlanExecutor.java:191)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$ExecutorWorker.run(DefaultTaskPlanExecutor.java:130)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.process(DefaultTaskPlanExecutor.java:74)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph.execute(DefaultTaskExecutionGraph.java:143)
        at org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:40)
        at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:40)
        at org.gradle.execution.DefaultBuildExecuter.access$000(DefaultBuildExecuter.java:24)
        at org.gradle.execution.DefaultBuildExecuter$1.proceed(DefaultBuildExecuter.java:46)
        at org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java:49)
        at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:40)
        at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:33)
        at org.gradle.initialization.DefaultGradleLauncher$ExecuteTasks.run(DefaultGradleLauncher.java:355)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
        at org.gradle.initialization.DefaultGradleLauncher.runTasks(DefaultGradleLauncher.java:219)
        at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:149)
        at org.gradle.initialization.DefaultGradleLauncher.executeTasks(DefaultGradleLauncher.java:124)
        at org.gradle.internal.invocation.GradleBuildController$1.call(GradleBuildController.java:77)
        at org.gradle.internal.invocation.GradleBuildController$1.call(GradleBuildController.java:74)
        at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:154)
        at org.gradle.internal.work.StopShieldingWorkerLeaseService.withLocks(StopShieldingWorkerLeaseService.java:38)
        at org.gradle.internal.invocation.GradleBuildController.doBuild(GradleBuildController.java:96)
        at org.gradle.internal.invocation.GradleBuildController.run(GradleBuildController.java:74)
        at org.gradle.tooling.internal.provider.ExecuteBuildActionRunner.run(ExecuteBuildActionRunner.java:28)
        at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
        at org.gradle.tooling.internal.provider.ValidatingBuildActionRunner.run(ValidatingBuildActionRunner.java:32)
        at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner$3.run(RunAsBuildOperationBuildActionRunner.java:50)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
        at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner.run(RunAsBuildOperationBuildActionRunner.java:45)
        at org.gradle.tooling.internal.provider.SubscribableBuildActionRunner.run(SubscribableBuildActionRunner.java:51)
        at org.gradle.launcher.exec.InProcessBuildActionExecuter$1.transform(InProcessBuildActionExecuter.java:47)
        at org.gradle.launcher.exec.InProcessBuildActionExecuter$1.transform(InProcessBuildActionExecuter.java:44)
        at org.gradle.composite.internal.DefaultRootBuildState.run(DefaultRootBuildState.java:79)
        at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:44)
        at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:30)
        at org.gradle.launcher.exec.BuildTreeScopeBuildActionExecuter.execute(BuildTreeScopeBuildActionExecuter.java:39)
        at org.gradle.launcher.exec.BuildTreeScopeBuildActionExecuter.execute(BuildTreeScopeBuildActionExecuter.java:25)
        at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:80)
        at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:53)
        at org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:62)
        at org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:34)
        at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:36)
        at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:25)
        at org.gradle.tooling.internal.provider.ParallelismConfigurationBuildActionExecuter.execute(ParallelismConfigurationBuildActionExecuter.java:43)
        at org.gradle.tooling.internal.provider.ParallelismConfigurationBuildActionExecuter.execute(ParallelismConfigurationBuildActionExecuter.java:29)
        at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:59)
        at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:31)
        at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:59)
        at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:44)
        at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:46)
        at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:30)
        at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:67)
        at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
        at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:37)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
        at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:26)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
        at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:34)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
        at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:74)
        at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:72)
        at org.gradle.util.Swapper.swap(Swapper.java:38)
        at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:72)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
        at org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:55)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
        at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:62)
        at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
        at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:81)
        at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
        at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:50)
        at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:295)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
        at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
        at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
Caused by: org.gradle.api.GradleException: Kotlin could not find the required JDK tools in the Java installation '/usr/lib/jvm/java-8-openjdk-amd64/jre' used by Gradle. Make sure Gradle is running on a JDK, not JRE.
        at org.jetbrains.kotlin.gradle.tasks.JarSearchingUtilKt.findToolsJar(jarSearchingUtil.kt:95)
        at org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile.execute(Tasks.kt:255)
        at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
        at org.gradle.api.internal.project.taskfactory.IncrementalTaskAction.doExecute(IncrementalTaskAction.java:50)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:39)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:26)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$1.run(ExecuteActionsTaskExecuter.java:131)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:120)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:99)
        ... 111 more
Caused by: java.lang.ClassNotFoundException: com.sun.tools.javac.util.Context
        at org.jetbrains.kotlin.gradle.tasks.JarSearchingUtilKt.findToolsJar(jarSearchingUtil.kt:92)
        ... 124 more

所以从我看到的情况来看,它在搜索tools.jar时失败了——而我已经将其放在/usr/lib/jvm/default-java/lib下,因为配置路径是JDK。

我的gradle.build文件如下:

plugins {
    id 'org.jetbrains.kotlin.jvm' version '1.3.11'
}

ext {
    ktorVersion = "1.1.2"
}

group 'com.example'
version '1.0-SNAPSHOT'

repositories {
    jcenter()
    mavenCentral()
}

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
    implementation "io.ktor:ktor-server-netty:$ktorVersion"
    implementation "io.ktor:ktor-jackson:$ktorVersion"
    implementation "io.ktor:ktor-freemarker:$ktorVersion"
    implementation "io.ktor:ktor-auth:$ktorVersion"
    implementation "ch.qos.logback:logback-classic:1.2.3"
    implementation 'io.github.microutils:kotlin-logging:1.6.22'
    implementation 'org.koin:koin-ktor:2.0.0-beta-3'
    implementation 'org.litote.kmongo:kmongo-coroutine:3.10.0'
}

compileKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
    kotlinOptions.jvmTarget = "1.8"
}

我真的不知所措,希望能得到些帮助。

如果需要更多信息,请让我知道,我会尽力提供。


2
你解决了吗?因为我已经在和它斗争了两天,还是搞不清楚问题出在哪里。 - redCuckoo
答案就在错误信息中!“确保Gradle在JDK上运行,而不是JRE。” JAVA_HOME必须指向JDK路径,而错误信息显示您的JAVA_HOME指向JRE。请参见https://dev59.com/Q-k5XIcBkEYKwwoY593M#63576967。 - Christian Davén
22个回答

140

我在 MacOS(Big Sur)中解决了一个类似的问题。我的情况是运行 React Native 项目并在尝试构建 Android 时出现以下错误:

* What went wrong:
Execution failed for task ':bugsnag_react-native:compileDebugKotlin'.
> Kotlin could not find the required JDK tools in the Java installation '/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home' used by G
radle. Make sure Gradle is running on a JDK, not JRE.

我遵循这篇文章来卸载MacOS上的JRE。稍作修改以使该过程可逆,以下是步骤:

cd /Library/Internet\ Plug-Ins/
mv JavaAppletPlugin.plugin DELETED-JavaAppletPlugin.plugin
cd /Library/PreferencePanes/
mv JavaControlPanel.prefPane DELETED-JavaControlPanel.prefPane

当你收到“Permission denied”时,在命令前使用“sudo”。

然后我清空了我的Gradle文件夹。我不知道这是否必要,但对我起作用了:

rm -rf ~/.gradle

最终,我重建了我的项目(react-native run-android),一切正常。

我不确定删除JRE是最好的解决方法,因为您可能需要JRE进行其他操作,但我没有注意到任何不良影响。此外,似乎我已经安装了JDK,而这并非所有Mac用户都是如此。

由于在Stack Overflow上没有很好的答案来解决这个问题,所以我想在这里发布我的解决方案。


8
在升级到Big Sur后,我也遇到了完全相同的问题。这篇文章让我免去了很多烦恼。 - 365SplendidSuns
1
卸载所有Java https://osxdaily.com/2017/06/16/uninstall-java-mac/ 并重新安装帮助我解决了在Big Sure上升级MacOS后遇到的问题。 - cosic
7
这对我有用,正如在MacOS Big Sur中所提到的。我还省略了清除gradle文件夹的步骤。感谢这个! - srinij
对我来说,“rm -rf ~/.gradle”是不必要的,因为我正在使用Android Studio和本地代码,我只是升级到了Big Sur,然后遇到了这个问题。 - dicarlomagnus
2
你救了我免受疯狂的挫败感。谢谢你,伙计。 - Emjey
显示剩余7条评论

61

Android Studio也提供了JDK。 如果您按照下面指定的方式指定JDK,它将成功。

export PATH=$PATH:/Applications/"Android Studio.app"/Contents/jre/jdk/Contents/Home/bin
export JAVA_HOME=/Applications/"Android Studio.app"/Contents/jre/jdk/Contents/Home

7
这应该是被接受的答案,不需要安装另一个JVM。 - M. Reza Nasirloo
18
这个之前对我来说是可以工作的,但是在 Android Studio 更新后出现了无效路径的错误。我需要将第二行更改为 export JAVA_HOME=/Applications/"Android Studio.app"/Contents/jre/Contents/Home - James
这对我有用,如果有人确定他有Java,那么这就是正确的答案。 - M.Nasri
这绝对是针对Mac的答案,带有@James的更新。 - maddesa
这个解决方案在我的MAC上帮了我很大的忙。谢谢。 - Yuseferi

41
在升级到Big Sur操作系统后,我遇到了与Tom Aranda先生相同的问题。经过进一步调查,我发现了这个SO帖子,这让我找到了这个radar。我不想像Tom的答案那样移除JRE,所以我通过其他帖子中的详细信息解决了自己的安装问题......

我之前在~/.zshrc中声明的JAVA_HOME如下:

export JAVA_HOME=`/usr/libexec/java_home -v 1.8`

但是,Big Sur似乎已经将默认的JRE版本更新为1.8版本。因此,我的JAVA_HOME需要更精确地进行过滤。

% /usr/libexec/java_home -V
Matching Java Virtual Machines (2):
    1.8.251.08 (x86_64) "Oracle Corporation" - "Java" /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home
    1.8.0_241 (x86_64) "Oracle Corporation" - "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home
/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home

现在我导出为:

export JAVA_HOME=`/usr/libexec/java_home -v 1.8.0_241`

现在这并不理想,因为下次我更新JDK时它就会出问题。

根据radar和其他SO帖子中的细节,我还需要确保在重新导出之前取消任何现有的导出的JAVA_HOME,因此我的~/.zshrc中的新条目现在变成了:

unset JAVA_HOME;export JAVA_HOME=`/usr/libexec/java_home -v 1.8.0_241` 

在终端重新启动后,我之前失败的gradlew命令现在可以像以前一样运行。

对我来说,这感觉更好,因为我没有删除任何库,并且只影响了从我的终端命令中指定的java home。遗憾的是,我需要指定精确版本,因为这将在未来的某个时候发生故障。


17

在BIG SUR上,遇到这个错误的人可能安装了自定义Java。请使用以下方法将其移除

sudo rm -fr /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin
sudo rm -fr /Library/PreferencesPanes/JavaControlPanel.prefPane
sudo rm -fr ~/Library/Application\ Support/Oracle/Java

在此之后,取消设置任何自定义的JAVA_HOME,并从您的shell中删除它,然后它应该可以正常工作。


这对我有用。我还从Oracle下载并安装了所需的JDK。直到我运行了上面的命令,我的命令仍然无法正常工作。 - speedynomads
谢谢,伙计!对我也管用! - provisota
我也一样 :P 非常感谢! - Ihar Paliashchuk
谢谢。我不得不删除自定义安装并设置Java主目录以使用Big Sur中的Java 8。 - giri-sh

11

在Windows上,将此添加到gradle.properties中,并附上您的jdk版本

org.gradle.java.home=C:\\Program Files\\Java\\jdk1.8.0_102

1
这是特定于Windows和某个Java版本的。 - Vegard Stikbakke
谢谢。我不记得我使用的Java版本是什么,但这解决了我的问题。 - kosher
非常感谢,兄弟...它像魔法一样工作了,你救了我的一天。 - Partha Paul

10

我遇到了完全相同的问题。我通过安装OpenJDK 8 JDK解决了这个问题。我的机器运行着centos,这是我的安装命令

sudo yum install java-1.8.0-openjdk-devel

我从这篇文章中学到了有两种不同的Java软件包,Java Runtime Environment (JRE) 和 Java Development Kit (JDK)。 JRE用于运行Java程序,而JDK用于开发Java应用程序。 我只安装了JRE,但没有安装JDK。 安装JDK后,我的构建顺利运行了。


@IgorGanapolsky,yum是CentOS的软件包管理器。 - Chris

9
> Kotlin could not find the required JDK tools in the Java installation '/usr/lib/jvm/java-8-openjdk-amd64/jre' used by Gradle. Make sure Gradle is running on a JDK, not JRE.

它被设置为/usr/lib/jvm/java-8-openjdk-amd64/jre

应该将JAVA_HOME设置为/usr/lib/jvm/java-8-openjdk-amd64/

如果您的操作系统是Ubuntu,请通过sudo apt-get install openjdk-8-jdk安装openjdk jdk。

sudo apt install openjdk-8-jre-headless将安装jre而不是jdk。


1
同时,在安装JDK之前,卸载JRE版本可能会有所帮助,因为它们共享相同的父路径。我曾经尝试过在不删除JRE的情况下安装JDK,并未解决问题。 - Katherine Chen

6

1. 安装Java

https://www.oracle.com/java/technologies/downloads/ enter image description here

2. 查找Java路径

/usr/libexec/java_home -V

enter image description here

3. 设置MAC环境变量

使用vim编辑 ~/.bash_profile 文件:

export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_321.jdk/Contents/Home
export CLASSPAHT=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$PATH:

执行命令:source ~/.bash_profile

4. 验证

@B-X24EQ05P-1937 jdk1.8.0_321.jdk % java -version         
java version "1.8.0_321"
Java(TM) SE Runtime Environment (build 1.8.0_321-b07)
Java HotSpot(TM) 64-Bit Server VM (build 25.321-b07, mixed mode)

我不得不从官方网站下载并安装正确的Java SDK,这解决了我的问题。 - Nasir

6
根据提供的数据,可以确定环境路径中有 java。但是,这并不能确认 JAVA_HOME 是否设置为 JDK 目录。您确定 JAVA_HOME 没有被设置为 /usr/lib/jvm/java-8-openjdk-amd64/jre 而不是 /usr/lib/jvm/java-8-openjdk-amd64 或者 /usr/lib/jvm/default-java 吗?
因为,如果已经设置了 JAVA_HOME,那么 gradlew 将会忽略环境路径中 java 的二进制文件,并执行 $JAVA_HOME/bin/java,后者将在 System.getProperty("java.home") 中记录,而该值在此异常中被记录下来(请参见 jarSearchingUtil.Kt)。
否则,您可以尝试直接在 gradlew 文件中声明JAVA_HOME。

5

在更新到Mac Big Sur之前,所有东西都正常运行。我在本地机器上使用了Jenkins和Fastlane 'sh Fastlane beta'来进行Firebase分发。这是一个Flutter项目。

我只是在gradle.properties中添加了org.gradle.java.home=/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home,这解决了我的问题。


1
如果这不起作用,请提供已安装Java的绝对路径:/Library/Java/JavaVirtualMachines/jdk1.8.0_321.jdk/Contents/Home - Harsh Patel

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