Kapt: Fix NPE on JDK 10-11 (KT-26203)

Gradle worker throws NPE when the parameter to the runnable is null.
This patch works that around by passing URL spec as String instead of
File?
This commit is contained in:
Ting-Yuan Huang
2019-03-28 22:57:02 +00:00
committed by Yan Zhulanow
parent 2314ca7a94
commit 4f64a52d33
3 changed files with 32 additions and 4 deletions
@@ -125,6 +125,8 @@ tasks.withType<Test> {
systemProperty("kotlinVersion", rootProject.extra["kotlinVersion"] as String) systemProperty("kotlinVersion", rootProject.extra["kotlinVersion"] as String)
systemProperty("runnerGradleVersion", gradle.gradleVersion) systemProperty("runnerGradleVersion", gradle.gradleVersion)
systemProperty("jdk10Home", rootProject.extra["JDK_10"] as String)
systemProperty("jdk11Home", rootProject.extra["JDK_11"] as String)
val mavenLocalRepo = System.getProperty("maven.repo.local") val mavenLocalRepo = System.getProperty("maven.repo.local")
if (mavenLocalRepo != null) { if (mavenLocalRepo != null) {
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.gradle
import org.jetbrains.kotlin.gradle.tasks.USING_JVM_INCREMENTAL_COMPILATION_MESSAGE import org.jetbrains.kotlin.gradle.tasks.USING_JVM_INCREMENTAL_COMPILATION_MESSAGE
import org.jetbrains.kotlin.gradle.util.* import org.jetbrains.kotlin.gradle.util.*
import org.junit.Assert import org.junit.Assert
import org.junit.Assume
import org.junit.Test import org.junit.Test
import java.io.File import java.io.File
import java.util.zip.ZipFile import java.util.zip.ZipFile
@@ -67,6 +68,30 @@ class Kapt3WorkersIT : Kapt3IT() {
assertSuccessful() assertSuccessful()
} }
} }
private fun testSimpleWithCustomJdk(gradleVersion: String, javaHome: File, jdkDescription: String) {
val gradleVersionRequired = GradleVersionRequired.AtLeast(gradleVersion)
Assume.assumeTrue("$jdkDescription isn't available", javaHome.isDirectory)
val options = defaultBuildOptions().copy(javaHome = javaHome)
val project =
Project("simple", directoryPrefix = "kapt2", gradleVersionRequirement = gradleVersionRequired)
project.build("build", options = options) {
assertSuccessful()
assertKaptSuccessful()
}
}
@Test
fun testSimpleWithJdk10() {
testSimpleWithCustomJdk("4.7", File(System.getProperty("jdk10Home")!!), "JDK 10")
}
@Test
fun testSimpleWithJdk11() {
testSimpleWithCustomJdk("5.0", File(System.getProperty("jdk11Home")!!), "JDK 11")
}
} }
open class Kapt3IT : Kapt3BaseIT() { open class Kapt3IT : Kapt3BaseIT() {
@@ -21,6 +21,7 @@ import org.jetbrains.kotlin.gradle.tasks.findToolsJar
import org.jetbrains.kotlin.utils.PathUtil import org.jetbrains.kotlin.utils.PathUtil
import java.io.File import java.io.File
import java.io.Serializable import java.io.Serializable
import java.net.URL
import java.net.URLClassLoader import java.net.URLClassLoader
import javax.inject.Inject import javax.inject.Inject
@@ -98,7 +99,7 @@ open class KaptWithoutKotlincTask @Inject constructor(private val workerExecutor
"none" -> IsolationMode.NONE "none" -> IsolationMode.NONE
else -> IsolationMode.NONE else -> IsolationMode.NONE
} }
config.params(optionsForWorker, findToolsJar(), kaptClasspath) config.params(optionsForWorker, findToolsJar()?.toURI()?.toURL()?.toString().orEmpty(), kaptClasspath)
if (project.findProperty("kapt.workers.log.classloading") == "true") { if (project.findProperty("kapt.workers.log.classloading") == "true") {
// for tests // for tests
config.forkOptions.jvmArgs("-verbose:class") config.forkOptions.jvmArgs("-verbose:class")
@@ -110,7 +111,7 @@ open class KaptWithoutKotlincTask @Inject constructor(private val workerExecutor
private class KaptExecution @Inject constructor( private class KaptExecution @Inject constructor(
val optionsForWorker: KaptOptionsForWorker, val optionsForWorker: KaptOptionsForWorker,
val toolsJar: File?, val toolsJarURLSpec: String,
val kaptClasspath: List<File> val kaptClasspath: List<File>
) : Runnable { ) : Runnable {
private companion object { private companion object {
@@ -125,8 +126,8 @@ private class KaptExecution @Inject constructor(
val kaptClasspathUrls = kaptClasspath.map { it.toURI().toURL() }.toTypedArray() val kaptClasspathUrls = kaptClasspath.map { it.toURI().toURL() }.toTypedArray()
val rootClassLoader = findRootClassLoader() val rootClassLoader = findRootClassLoader()
val classLoaderWithToolsJar = cachedClassLoaderWithToolsJar ?: if (toolsJar != null && !javacIsAlreadyHere()) { val classLoaderWithToolsJar = cachedClassLoaderWithToolsJar ?: if (!toolsJarURLSpec.isEmpty() && !javacIsAlreadyHere()) {
URLClassLoader(arrayOf(toolsJar.toURI().toURL()), rootClassLoader) URLClassLoader(arrayOf(URL(toolsJarURLSpec)), rootClassLoader)
} else { } else {
rootClassLoader rootClassLoader
} }