diff --git a/idea/idea-gradle/res/messages/KotlinIdeaGradleBundle.properties b/idea/idea-gradle/res/messages/KotlinIdeaGradleBundle.properties
index 96d2d276755..7b7dd9dd306 100644
--- a/idea/idea-gradle/res/messages/KotlinIdeaGradleBundle.properties
+++ b/idea/idea-gradle/res/messages/KotlinIdeaGradleBundle.properties
@@ -52,6 +52,9 @@ notification.standalone.info=
\
NOTE: Each standalone script requires a separate Gradle configuration phase to be executed on update. \
This can be resource intensive for large Gradle projects.
\
+notification.invalid.gradle.jvm.configuration.title=Found invalid Gradle JVM configuration
+notification.jdk.0.points.to.invalid.jdk=Please fix SDK ''{0}'': Gradle JVM points to an invalid JDK
+
action.text.install=Install
action.text.show.kotlin.gradle.dsl.logs.in=Show Kotlin Gradle DSL Logs in {0}
build.0.project=Build {0}
diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/SdkValidator.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/SdkValidator.kt
new file mode 100644
index 00000000000..e77169fa3f8
--- /dev/null
+++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/SdkValidator.kt
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
+ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
+ */
+
+package org.jetbrains.kotlin.idea.scripting.gradle
+
+import com.intellij.notification.NotificationType
+import com.intellij.openapi.externalSystem.service.execution.ExternalSystemJdkUtil
+import com.intellij.openapi.project.Project
+import com.intellij.openapi.projectRoots.JdkUtil
+import com.intellij.openapi.startup.StartupActivity
+import org.jetbrains.kotlin.idea.KotlinIdeaGradleBundle
+import org.jetbrains.plugins.gradle.service.project.GradleNotification
+import org.jetbrains.plugins.gradle.settings.GradleProjectSettings
+import org.jetbrains.plugins.gradle.settings.GradleSettings
+
+class SdkValidator : StartupActivity {
+ override fun runActivity(project: Project) {
+ GradleSettings.getInstance(project).linkedProjectsSettings.forEach {
+ it.validateGradleSdk(project)
+ }
+ }
+}
+
+fun GradleProjectSettings.validateGradleSdk(project: Project, jdkHomePath: String? = null) {
+ val gradleJvm = gradleJvm ?: return
+ // gradleJvm could be #USE_PROJECT_JDK etc, see ExternalSystemJdkUtil
+ val jdk = ExternalSystemJdkUtil.getJdk(project, gradleJvm) ?: return
+ val homePath = jdkHomePath ?: jdk?.homePath ?: return
+ if (!JdkUtil.checkForJdk(homePath)) {
+ GradleNotification.getInstance(project).showBalloon(
+ KotlinIdeaGradleBundle.message("notification.invalid.gradle.jvm.configuration.title"),
+ KotlinIdeaGradleBundle.message("notification.jdk.0.points.to.invalid.jdk", jdk.name),
+ NotificationType.ERROR, null
+ )
+ }
+}
\ No newline at end of file
diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelProcessor.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelProcessor.kt
index 4346f953969..30017b9c4dd 100644
--- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelProcessor.kt
+++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelProcessor.kt
@@ -6,7 +6,9 @@
package org.jetbrains.kotlin.idea.scripting.gradle.importing
import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskId
+import com.intellij.openapi.externalSystem.service.execution.ExternalSystemJdkUtil
import com.intellij.openapi.project.Project
+import com.intellij.openapi.projectRoots.JdkUtil
import com.intellij.openapi.util.io.FileUtil.toSystemIndependentName
import com.intellij.openapi.vfs.VfsUtil
import org.gradle.tooling.model.kotlin.dsl.EditorReportSeverity
@@ -18,6 +20,7 @@ import org.jetbrains.kotlin.idea.scripting.gradle.roots.GradleBuildRootsManager
import org.jetbrains.plugins.gradle.model.BuildScriptClasspathModel
import org.jetbrains.plugins.gradle.service.project.DefaultProjectResolverContext
import org.jetbrains.plugins.gradle.service.project.ProjectResolverContext
+import org.jetbrains.plugins.gradle.settings.GradleSettings
import java.io.File
fun saveGradleBuildEnvironment(resolverCtx: ProjectResolverContext) {
@@ -29,6 +32,7 @@ fun saveGradleBuildEnvironment(resolverCtx: ProjectResolverContext) {
?: resolverCtx.settings?.gradleHome
synchronized(sync) {
sync.gradleVersion = resolverCtx.projectGradleVersion
+
sync.javaHome = (resolverCtx as? DefaultProjectResolverContext)
?.buildEnvironment
?.java?.javaHome?.canonicalPath
diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslSyncListener.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslSyncListener.kt
index 7e304c834df..334f7792c69 100644
--- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslSyncListener.kt
+++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslSyncListener.kt
@@ -10,15 +10,18 @@ import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskId
import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskNotificationListener
import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskNotificationListenerAdapter
import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskType
+import com.intellij.openapi.externalSystem.service.execution.ExternalSystemJdkUtil
import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil
+import com.intellij.openapi.projectRoots.JdkUtil
import org.jetbrains.kotlin.idea.core.script.ScriptDefinitionContributor
import org.jetbrains.kotlin.idea.framework.GRADLE_SYSTEM_ID
import org.jetbrains.kotlin.idea.scripting.gradle.GradleScriptDefinitionsContributor
import org.jetbrains.kotlin.idea.scripting.gradle.roots.GradleBuildRootsManager
+import org.jetbrains.kotlin.idea.scripting.gradle.validateGradleSdk
import org.jetbrains.plugins.gradle.service.GradleInstallationManager
import org.jetbrains.plugins.gradle.settings.GradleExecutionSettings
+import org.jetbrains.plugins.gradle.settings.GradleSettings
import org.jetbrains.plugins.gradle.util.GradleConstants
-import java.io.File
import java.util.*
class KotlinDslSyncListener : ExternalSystemTaskNotificationListenerAdapter() {
@@ -64,6 +67,15 @@ class KotlinDslSyncListener : ExternalSystemTaskNotificationListenerAdapter() {
.javaHome
}
+ sync.javaHome = sync.javaHome?.takeIf { JdkUtil.checkForJdk(it) }
+ ?: run {
+ // roll back to specified in GRADLE_JVM if for some reason sync.javaHome points to corrupted SDK
+ val gradleJvm = GradleSettings.getInstance(project).getLinkedProjectSettings(sync.workingDir)?.gradleJvm
+ ExternalSystemJdkUtil.getJdk(project, gradleJvm)?.homePath
+ }
+
+ GradleSettings.getInstance(project).getLinkedProjectSettings(sync.workingDir)?.validateGradleSdk(project, sync.javaHome)
+
@Suppress("DEPRECATION")
ScriptDefinitionContributor.find(project)?.reloadIfNeeded(
sync.workingDir, sync.gradleHome, sync.javaHome
diff --git a/idea/resources/META-INF/gradle-java.xml b/idea/resources/META-INF/gradle-java.xml
index 8b646878ad3..d9d6da351de 100644
--- a/idea/resources/META-INF/gradle-java.xml
+++ b/idea/resources/META-INF/gradle-java.xml
@@ -21,6 +21,8 @@
+
+
diff --git a/idea/resources/META-INF/gradle-java.xml.193 b/idea/resources/META-INF/gradle-java.xml.193
index 05df41d996d..e0fc7cb7db5 100644
--- a/idea/resources/META-INF/gradle-java.xml.193
+++ b/idea/resources/META-INF/gradle-java.xml.193
@@ -25,6 +25,8 @@
+
+