|
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