Allow specifying additional JVM arguments for Kapt task

These arguments are only used when 'kapt.workers.isolation=process' mode
is used. It allows users to apply workaround for running kapt on newer
JDK version without waiting for a new Kotlin release

^KT-48450 Fixed
This commit is contained in:
Yahor Berdnikau
2022-01-31 17:24:34 +01:00
committed by Space
parent adb9dfb256
commit 95698b0138
2 changed files with 74 additions and 2 deletions
@@ -100,6 +100,64 @@ open class Kapt3WorkersIT : Kapt3IT() {
}
}
}
@DisplayName("Additional Kapt jvm arguments are passed to the process")
@GradleTest
internal fun additionalJvmArgumentsArePassed(gradleVersion: GradleVersion) {
project("simple".withPrefix, gradleVersion) {
gradleProperties.append(
"""
kapt.workers.isolation = process
""".trimIndent()
)
buildGradle.append(
//language=Groovy
"""
tasks
.withType(org.jetbrains.kotlin.gradle.internal.KaptWithoutKotlincTask.class)
.configureEach {
it.kaptProcessJvmArgs.addAll(['-Xmx64m', '-Duser.country=DE'])
}
""".trimIndent()
)
build("assemble") {
assertOutputContains("Starting process 'Gradle Worker Daemon.*-Xmx64m.*-Duser.country=DE.*".toRegex())
}
}
}
@DisplayName("Warning is produced on additional Kapt jvm arguments and 'none' workers isolation mode")
@GradleTest
internal fun warningOnNoneIsolationModeAndAdditionalJvmArguments(gradleVersion: GradleVersion) {
project("simple".withPrefix, gradleVersion) {
gradleProperties.append(
"""
kapt.workers.isolation = none
""".trimIndent()
)
buildGradle.append(
//language=Groovy
"""
tasks
.withType(org.jetbrains.kotlin.gradle.internal.KaptWithoutKotlincTask.class)
.configureEach {
it.kaptProcessJvmArgs.addAll(['-Xmx64m', '-Duser.country=DE'])
}
""".trimIndent()
)
build("assemble") {
assertOutputContains("Kapt additional JVM arguments are ignored in 'NONE' workers isolation mode")
}
}
}
}
@DisplayName("Kapt with classloaders cache executing via workers ")
@@ -8,10 +8,11 @@ package org.jetbrains.kotlin.gradle.internal
import org.gradle.api.file.ConfigurableFileCollection
import org.gradle.api.file.FileCollection
import org.gradle.api.model.ObjectFactory
import org.gradle.api.provider.ListProperty
import org.gradle.api.provider.Property
import org.gradle.api.provider.ProviderFactory
import org.gradle.api.tasks.*
import org.gradle.api.tasks.incremental.IncrementalTaskInputs
import org.gradle.kotlin.dsl.listProperty
import org.gradle.process.CommandLineArgumentProvider
import org.gradle.work.InputChanges
import org.gradle.workers.IsolationMode
@@ -77,6 +78,9 @@ abstract class KaptWithoutKotlincTask @Inject constructor(
@get:Internal
internal val projectDir = project.projectDir
@get:Input
val kaptProcessJvmArgs: ListProperty<String> = objectFactory.listProperty<String>().convention(emptyList())
private fun getAnnotationProcessorOptions(): Map<String, String> {
val options = processorOptions.subpluginOptionsByPluginId[Kapt3GradleSubplugin.KAPT_SUBPLUGIN_ID] ?: return emptyMap()
@@ -195,13 +199,17 @@ abstract class KaptWithoutKotlincTask @Inject constructor(
// for tests
it.forkOptions.jvmArgs("-verbose:class")
}
kaptProcessJvmArgs.get().run { if (isNotEmpty()) it.forkOptions.jvmArgs(this) }
it.forkOptions.executable = defaultKotlinJavaToolchain.get()
.javaExecutable
.asFile.get()
.absolutePath
logger.info("Kapt worker classpath: ${it.classpath}")
}
IsolationMode.NONE -> workerExecutor.noIsolation()
IsolationMode.NONE -> {
warnAdditionalJvmArgsAreNotUsed(isolationMode)
workerExecutor.noIsolation()
}
IsolationMode.AUTO, IsolationMode.CLASSLOADER -> throw UnsupportedOperationException(
"Kapt worker compilation does not support class loader isolation. " +
"Please use either \"none\" or \"process\" in gradle.properties."
@@ -216,6 +224,12 @@ abstract class KaptWithoutKotlincTask @Inject constructor(
}
}
private fun warnAdditionalJvmArgsAreNotUsed(isolationMode: IsolationMode) {
if (kaptProcessJvmArgs.get().isNotEmpty()) {
logger.warn("Kapt additional JVM arguments are ignored in '${isolationMode.name}' workers isolation mode")
}
}
internal fun getValue(propertyName: String): String? =
if (isGradleVersionAtLeast(6, 5)) {
providerFactory.gradleProperty(propertyName).forUseAtConfigurationTime().orNull