From 352fb4a1c88363ca57235f90373ee521fddd89d5 Mon Sep 17 00:00:00 2001 From: Sergey Igushkin Date: Thu, 3 May 2018 19:42:08 +0300 Subject: [PATCH] Add a user-friendly report that the JDK tools are missing Issue #KT-20214 Fixed --- .../org/jetbrains/kotlin/gradle/tasks/Tasks.kt | 3 +++ .../kotlin/gradle/tasks/jarSearchingUtil.kt | 17 +++++++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt index f9249497721..d079f56dcf9 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt @@ -198,6 +198,9 @@ abstract class AbstractKotlinCompile() : AbstractKo @TaskAction open fun execute(inputs: IncrementalTaskInputs): Unit { + // Check that the JDK tools are available in Gradle (fail-fast, instead of a fail during the compiler run): + findToolsJar() + val sourceRoots = getSourceRoots() val allKotlinSources = sourceRoots.kotlinSourceFiles diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/jarSearchingUtil.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/jarSearchingUtil.kt index f1d4b8fa8ce..bae3f80e0d4 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/jarSearchingUtil.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/jarSearchingUtil.kt @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.gradle.tasks +import org.gradle.api.GradleException import org.gradle.api.Project import org.gradle.api.artifacts.Configuration import org.gradle.api.artifacts.ResolvedDependency @@ -86,8 +87,20 @@ internal fun findKotlinScriptJvmClasspath(project: Project): List = internal fun findKotlinReflectClasspath(project: Project): List = findKotlinModuleJar(project, KOTLIN_REFLECT_EXPECTED_CLASS, KOTLIN_REFLECT) -internal fun findToolsJar(): File? = - Class.forName("com.sun.tools.javac.util.Context")?.let(::findJarByClass) +internal fun findToolsJar(): File? { + val javacUtilContextClass = + try { + Class.forName("com.sun.tools.javac.util.Context") + } catch (classNotFound: ClassNotFoundException) { + val javaHome = System.getProperty("java.home") // current Java installation path + throw GradleException( + "Kotlin could not find the required JDK tools in the Java installation ${javaHome?.let { "'$it' " }.orEmpty()}" + + "used by Gradle. Make sure Gradle is running on a JDK, not JRE.", + classNotFound + ) + } + return javacUtilContextClass?.let(::findJarByClass) +} internal fun findCoroutinesClasspath(): List { val classLoader = Thread.currentThread().contextClassLoader