Skip to content

Commit c918a43

Browse files
committed
change forkedSpringBoot task implementation: use bootRun task as a source for forked process, implemented with the aid of com.github.psxpaul.execfork gradle plugin
1 parent 01b5b23 commit c918a43

File tree

1 file changed

+26
-44
lines changed

1 file changed

+26
-44
lines changed

src/main/kotlin/org/springdoc/openapi/gradle/plugin/OpenApiGradlePlugin.kt

Lines changed: 26 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -2,72 +2,54 @@
22

33
package org.springdoc.openapi.gradle.plugin
44

5+
import com.github.psxpaul.task.JavaExecFork
56
import org.gradle.api.Plugin
67
import org.gradle.api.Project
78
import org.gradle.api.logging.Logging
8-
import org.gradle.api.provider.Property
9-
import java.util.*
9+
import org.springframework.boot.gradle.tasks.run.BootRun
1010

1111
open class OpenApiGradlePlugin : Plugin<Project> {
1212
private val logger = Logging.getLogger(OpenApiGradlePlugin::class.java)
1313

1414
override fun apply(project: Project) {
1515
// Run time dependency on the following plugins
1616
project.plugins.apply(SPRING_BOOT_PLUGIN)
17-
project.plugins.apply(PROCESS_PLUGIN)
17+
project.plugins.apply(EXEC_FORK_PLUGIN)
1818

1919
project.extensions.create(EXTENSION_NAME, OpenApiExtension::class.java, project)
2020

2121
project.afterEvaluate {
22-
// Spring boot jar task
23-
val bootJarTask = project.tasks.named(SPRING_BOOT_JAR_TASK_NAME)
24-
25-
val extension: OpenApiExtension = project.extensions.run {
26-
getByName(EXTENSION_NAME) as OpenApiExtension
27-
}
22+
// The task, used to run the Spring Boot application (`bootRun`)
23+
val bootRunTask = project.tasks.named(SPRING_BOOT_RUN_TASK_NAME)
24+
// The task, used to resolve the application's main class (`bootRunMainClassName`)
25+
val bootRunMainClassNameTask = project.tasks.named(SPRING_BOOT_RUN_MAIN_CLASS_NAME_TASK_NAME)
2826

2927
// Create a forked version spring boot run task
30-
val forkedSpringBoot = project.tasks.register(FORKED_SPRING_BOOT_RUN_TASK_NAME, AnnotatedFork::class.java) { fork ->
31-
fork.dependsOn(bootJarTask)
32-
33-
fork.onlyIf {
34-
val bootJar = bootJarTask.get().outputs.files.first()
35-
fork.commandLine = listOf("java", "-cp") +
36-
listOf("$bootJar") + extractProperties(extension.forkProperties) + listOf(PROPS_LAUNCHER_CLASS)
37-
true
38-
}
39-
}
40-
41-
val stopForkedSpringBoot = project.tasks.register(FINALIZER_TASK_NAME) {
42-
it.dependsOn(forkedSpringBoot)
43-
it.doLast {
44-
forkedSpringBoot.get().processHandle.abort()
28+
val forkedSpringBoot =
29+
project.tasks.register(FORKED_SPRING_BOOT_RUN_TASK_NAME, JavaExecFork::class.java) { fork ->
30+
fork.dependsOn(bootRunMainClassNameTask)
31+
32+
fork.onlyIf {
33+
val bootRun = bootRunTask.get() as BootRun
34+
35+
// copy all system properties, excluding those starting with `java.class.path`
36+
fork.systemProperties =
37+
bootRun.systemProperties.filter { !it.key.startsWith(CLASS_PATH_PROPERTY_NAME) }
38+
39+
fork.workingDir = bootRun.workingDir
40+
fork.args = bootRun.args?.toMutableList() ?: mutableListOf()
41+
fork.classpath = bootRun.classpath
42+
fork.main = bootRun.mainClass.get()
43+
fork.jvmArgs = bootRun.jvmArgs
44+
fork.environment = bootRun.environment
45+
true
46+
}
4547
}
46-
}
4748

4849
// This is my task. Before I can run it I have to run the dependent tasks
4950
project.tasks.register(OPEN_API_TASK_NAME, OpenApiGeneratorTask::class.java) { openApiGenTask ->
5051
openApiGenTask.dependsOn(forkedSpringBoot)
51-
openApiGenTask.finalizedBy(stopForkedSpringBoot)
5252
}
5353
}
5454
}
55-
56-
private fun extractProperties(forkProperties: Property<Any>) =
57-
if (forkProperties.isPresent) {
58-
when (val element = forkProperties.get()) {
59-
is String -> element
60-
.split("-D")
61-
.filter { it.isNotEmpty() }
62-
.filterNot { it.startsWith(CLASS_PATH_PROPERTY_NAME, true) }
63-
.map { "-D${it.trim()}" }
64-
is Properties -> element
65-
.filterNot { it.key.toString().startsWith(CLASS_PATH_PROPERTY_NAME, true) }
66-
.map { "-D${it.key}=${it.value}" }
67-
else -> {
68-
logger.warn("Failed to use the value set for 'forkProperties'. Only String and Properties objects are supported.")
69-
emptyList()
70-
}
71-
}
72-
} else emptyList()
7355
}

0 commit comments

Comments
 (0)