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 @@ + +