|
2 | 2 |
|
3 | 3 | package org.springdoc.openapi.gradle.plugin
|
4 | 4 |
|
| 5 | +import com.github.psxpaul.task.JavaExecFork |
5 | 6 | import org.gradle.api.Plugin
|
6 | 7 | import org.gradle.api.Project
|
7 | 8 | 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 |
10 | 10 |
|
11 | 11 | open class OpenApiGradlePlugin : Plugin<Project> {
|
12 | 12 | private val logger = Logging.getLogger(OpenApiGradlePlugin::class.java)
|
13 | 13 |
|
14 | 14 | override fun apply(project: Project) {
|
15 | 15 | // Run time dependency on the following plugins
|
16 | 16 | project.plugins.apply(SPRING_BOOT_PLUGIN)
|
17 |
| - project.plugins.apply(PROCESS_PLUGIN) |
| 17 | + project.plugins.apply(EXEC_FORK_PLUGIN) |
18 | 18 |
|
19 | 19 | project.extensions.create(EXTENSION_NAME, OpenApiExtension::class.java, project)
|
20 | 20 |
|
21 | 21 | 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) |
28 | 26 |
|
29 | 27 | // 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 | + } |
45 | 47 | }
|
46 |
| - } |
47 | 48 |
|
48 | 49 | // This is my task. Before I can run it I have to run the dependent tasks
|
49 | 50 | project.tasks.register(OPEN_API_TASK_NAME, OpenApiGeneratorTask::class.java) { openApiGenTask ->
|
50 | 51 | openApiGenTask.dependsOn(forkedSpringBoot)
|
51 |
| - openApiGenTask.finalizedBy(stopForkedSpringBoot) |
52 | 52 | }
|
53 | 53 | }
|
54 | 54 | }
|
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() |
73 | 55 | }
|
0 commit comments