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:
+58
@@ -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 ")
|
@DisplayName("Kapt with classloaders cache executing via workers ")
|
||||||
|
|||||||
+16
-2
@@ -8,10 +8,11 @@ package org.jetbrains.kotlin.gradle.internal
|
|||||||
import org.gradle.api.file.ConfigurableFileCollection
|
import org.gradle.api.file.ConfigurableFileCollection
|
||||||
import org.gradle.api.file.FileCollection
|
import org.gradle.api.file.FileCollection
|
||||||
import org.gradle.api.model.ObjectFactory
|
import org.gradle.api.model.ObjectFactory
|
||||||
|
import org.gradle.api.provider.ListProperty
|
||||||
import org.gradle.api.provider.Property
|
import org.gradle.api.provider.Property
|
||||||
import org.gradle.api.provider.ProviderFactory
|
import org.gradle.api.provider.ProviderFactory
|
||||||
import org.gradle.api.tasks.*
|
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.process.CommandLineArgumentProvider
|
||||||
import org.gradle.work.InputChanges
|
import org.gradle.work.InputChanges
|
||||||
import org.gradle.workers.IsolationMode
|
import org.gradle.workers.IsolationMode
|
||||||
@@ -77,6 +78,9 @@ abstract class KaptWithoutKotlincTask @Inject constructor(
|
|||||||
@get:Internal
|
@get:Internal
|
||||||
internal val projectDir = project.projectDir
|
internal val projectDir = project.projectDir
|
||||||
|
|
||||||
|
@get:Input
|
||||||
|
val kaptProcessJvmArgs: ListProperty<String> = objectFactory.listProperty<String>().convention(emptyList())
|
||||||
|
|
||||||
private fun getAnnotationProcessorOptions(): Map<String, String> {
|
private fun getAnnotationProcessorOptions(): Map<String, String> {
|
||||||
val options = processorOptions.subpluginOptionsByPluginId[Kapt3GradleSubplugin.KAPT_SUBPLUGIN_ID] ?: return emptyMap()
|
val options = processorOptions.subpluginOptionsByPluginId[Kapt3GradleSubplugin.KAPT_SUBPLUGIN_ID] ?: return emptyMap()
|
||||||
|
|
||||||
@@ -195,13 +199,17 @@ abstract class KaptWithoutKotlincTask @Inject constructor(
|
|||||||
// for tests
|
// for tests
|
||||||
it.forkOptions.jvmArgs("-verbose:class")
|
it.forkOptions.jvmArgs("-verbose:class")
|
||||||
}
|
}
|
||||||
|
kaptProcessJvmArgs.get().run { if (isNotEmpty()) it.forkOptions.jvmArgs(this) }
|
||||||
it.forkOptions.executable = defaultKotlinJavaToolchain.get()
|
it.forkOptions.executable = defaultKotlinJavaToolchain.get()
|
||||||
.javaExecutable
|
.javaExecutable
|
||||||
.asFile.get()
|
.asFile.get()
|
||||||
.absolutePath
|
.absolutePath
|
||||||
logger.info("Kapt worker classpath: ${it.classpath}")
|
logger.info("Kapt worker classpath: ${it.classpath}")
|
||||||
}
|
}
|
||||||
IsolationMode.NONE -> workerExecutor.noIsolation()
|
IsolationMode.NONE -> {
|
||||||
|
warnAdditionalJvmArgsAreNotUsed(isolationMode)
|
||||||
|
workerExecutor.noIsolation()
|
||||||
|
}
|
||||||
IsolationMode.AUTO, IsolationMode.CLASSLOADER -> throw UnsupportedOperationException(
|
IsolationMode.AUTO, IsolationMode.CLASSLOADER -> throw UnsupportedOperationException(
|
||||||
"Kapt worker compilation does not support class loader isolation. " +
|
"Kapt worker compilation does not support class loader isolation. " +
|
||||||
"Please use either \"none\" or \"process\" in gradle.properties."
|
"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? =
|
internal fun getValue(propertyName: String): String? =
|
||||||
if (isGradleVersionAtLeast(6, 5)) {
|
if (isGradleVersionAtLeast(6, 5)) {
|
||||||
providerFactory.gradleProperty(propertyName).forUseAtConfigurationTime().orNull
|
providerFactory.gradleProperty(propertyName).forUseAtConfigurationTime().orNull
|
||||||
|
|||||||
Reference in New Issue
Block a user