Notify if gradle points to invalid JDK

^KT-41141 Fixed
This commit is contained in:
Vladimir Dolzhenko
2020-09-23 09:44:07 +00:00
parent be20a8bd80
commit 4e5c61cd2f
6 changed files with 62 additions and 1 deletions
@@ -52,6 +52,9 @@ notification.standalone.info=<div width=400>\
<p><b>NOTE:</b> Each standalone script requires a separate Gradle configuration phase to be executed on update. \
This can be resource intensive for large Gradle projects.</p>\
</div>
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}
@@ -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
)
}
}
@@ -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
@@ -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<GradleScriptDefinitionsContributor>(project)?.reloadIfNeeded(
sync.workingDir, sync.gradleHome, sync.javaHome
+2
View File
@@ -21,6 +21,8 @@
</extensions>
<extensions defaultExtensionNs="com.intellij">
<postStartupActivity implementation="org.jetbrains.kotlin.idea.scripting.gradle.SdkValidator"/>
<externalProjectDataService implementation="org.jetbrains.kotlin.idea.configuration.KotlinGradleSourceSetDataService"/>
<externalProjectDataService implementation="org.jetbrains.kotlin.idea.configuration.KotlinGradleProjectDataService"/>
<externalProjectDataService implementation="org.jetbrains.kotlin.idea.configuration.KotlinGradleLibraryDataService"/>
@@ -25,6 +25,8 @@
</extensions>
<extensions defaultExtensionNs="com.intellij">
<postStartupActivity implementation="org.jetbrains.kotlin.idea.scripting.gradle.SdkValidator"/>
<externalProjectDataService implementation="org.jetbrains.kotlin.idea.configuration.KotlinGradleSourceSetDataService"/>
<externalProjectDataService implementation="org.jetbrains.kotlin.idea.configuration.KotlinGradleProjectDataService"/>
<externalProjectDataService implementation="org.jetbrains.kotlin.idea.configuration.KotlinGradleLibraryDataService"/>