@@ -4,94 +4,104 @@ import com.github.psxpaul.task.JavaExecFork
44import org.gradle.api.Plugin
55import org.gradle.api.Project
66import org.gradle.api.Task
7- import org.gradle.api.logging.Logging
7+ import org.gradle.api.UnknownDomainObjectException
88import org.gradle.api.tasks.TaskProvider
99import org.gradle.internal.jvm.Jvm
1010import org.springframework.boot.gradle.tasks.run.BootRun
1111
1212open class OpenApiGradlePlugin : Plugin <Project > {
13- private val logger = Logging .getLogger(OpenApiGradlePlugin ::class .java)
14-
15- override fun apply (project : Project ) {
16- with (project) {
17- // Run time dependency on the following plugins
18- plugins.apply (SPRING_BOOT_PLUGIN )
19- plugins.apply (EXEC_FORK_PLUGIN )
20-
21- extensions.create(EXTENSION_NAME , OpenApiExtension ::class .java)
22- tasks.register(FORKED_SPRING_BOOT_RUN_TASK_NAME , JavaExecFork ::class .java)
23- tasks.register(OPEN_API_TASK_NAME , OpenApiGeneratorTask ::class .java)
24-
25- afterEvaluate { generate(this ) }
26- }
27- }
28-
29- private fun generate (project : Project ) = project.run {
30- springBoot3CompatibilityCheck()
31-
32- // The task, used to run the Spring Boot application (`bootRun`)
33- val bootRunTask = tasks.named(SPRING_BOOT_RUN_TASK_NAME )
34- // The task, used to resolve the application's main class (`bootRunMainClassName`)
35- val bootRunMainClassNameTask = tasks.find { it.name == SPRING_BOOT_RUN_MAIN_CLASS_NAME_TASK_NAME }
36- ? : tasks.named(SPRING_BOOT_3_RUN_MAIN_CLASS_NAME_TASK_NAME )
37-
38- val extension = extensions.findByName(EXTENSION_NAME ) as OpenApiExtension
39- val customBootRun = extension.customBootRun
40- // Create a forked version spring boot run task
41- val forkedSpringBoot = tasks.named(FORKED_SPRING_BOOT_RUN_TASK_NAME , JavaExecFork ::class .java) { fork ->
42- fork.dependsOn(bootRunMainClassNameTask)
43- fork.onlyIf { needToFork(bootRunTask, customBootRun, fork) }
44- }
45-
46- // This is my task. Before I can run it, I have to run the dependent tasks
47- val openApiTask = tasks.named(OPEN_API_TASK_NAME , OpenApiGeneratorTask ::class .java) {
48- it.dependsOn(forkedSpringBoot)
49- }
50-
51- // The forked task need to be terminated as soon as my task is finished
52- forkedSpringBoot.get().stopAfter = openApiTask as TaskProvider <Task >
53- }
54-
55- private fun Project.springBoot3CompatibilityCheck () {
56- val tasksNames = tasks.names
57- val boot2TaskName = " bootRunMainClassName"
58- val boot3TaskName = " resolveMainClassName"
59- if (! tasksNames.contains(boot2TaskName) && tasksNames.contains(boot3TaskName))
60- tasks.register(boot2TaskName) { it.dependsOn(tasks.named(boot3TaskName)) }
61- }
62-
63- private fun needToFork (
64- bootRunTask : TaskProvider <Task >,
65- customBootRun : CustomBootRunAction ,
66- fork : JavaExecFork
67- ): Boolean {
68- val bootRun = bootRunTask.get() as BootRun
69-
70- val baseSystemProperties = customBootRun.systemProperties.orNull?.takeIf { it.isNotEmpty() }
71- ? : bootRun.systemProperties
72- with (fork) {
73- // copy all system properties, excluding those starting with `java.class.path`
74- systemProperties = baseSystemProperties.filter {
75- ! it.key.startsWith(CLASS_PATH_PROPERTY_NAME )
76- }
77-
78- // use original bootRun parameter if the list-type customBootRun properties are empty
79- workingDir = customBootRun.workingDir.asFile.orNull
80- ? : fork.temporaryDir
81- args = customBootRun.args.orNull?.takeIf { it.isNotEmpty() }?.toMutableList()
82- ? : bootRun.args?.toMutableList() ? : mutableListOf ()
83- classpath = customBootRun.classpath.takeIf { ! it.isEmpty }
84- ? : bootRun.classpath
85- main = customBootRun.mainClass.orNull
86- ? : bootRun.mainClass.get()
87- jvmArgs = customBootRun.jvmArgs.orNull?.takeIf { it.isNotEmpty() }
88- ? : bootRun.jvmArgs
89- environment = customBootRun.environment.orNull?.takeIf { it.isNotEmpty() }
90- ? : bootRun.environment
91- if (Jvm .current().toString().startsWith(" 1.8" )) {
92- killDescendants = false
93- }
94- }
95- return true
96- }
13+
14+ override fun apply (project : Project ) {
15+ with (project) {
16+ // Run time dependency on the following plugins
17+ plugins.apply (SPRING_BOOT_PLUGIN )
18+ plugins.apply (EXEC_FORK_PLUGIN )
19+
20+ extensions.create(EXTENSION_NAME , OpenApiExtension ::class .java)
21+ tasks.register(FORKED_SPRING_BOOT_RUN_TASK_NAME , JavaExecFork ::class .java)
22+ tasks.register(OPEN_API_TASK_NAME , OpenApiGeneratorTask ::class .java)
23+
24+ generate(this )
25+ }
26+ }
27+
28+ private fun generate (project : Project ) = project.run {
29+ springBoot3CompatibilityCheck()
30+
31+ // The task, used to run the Spring Boot application (`bootRun`)
32+ val bootRunTask = tasks.named(SPRING_BOOT_RUN_TASK_NAME )
33+ // The task, used to resolve the application's main class (`bootRunMainClassName`)
34+
35+ val bootRunMainClassNameTask =
36+ try {
37+ val task= tasks.named(SPRING_BOOT_RUN_MAIN_CLASS_NAME_TASK_NAME )
38+ logger.debug(" Detected Spring Boot task {}" , SPRING_BOOT_RUN_MAIN_CLASS_NAME_TASK_NAME )
39+ task
40+ } catch (e: UnknownDomainObjectException ) {
41+ val task= tasks.named(SPRING_BOOT_3_RUN_MAIN_CLASS_NAME_TASK_NAME )
42+ logger.debug(" Detected Spring Boot task {}" , SPRING_BOOT_3_RUN_MAIN_CLASS_NAME_TASK_NAME )
43+ task
44+ }
45+
46+ val extension = extensions.findByName(EXTENSION_NAME ) as OpenApiExtension
47+ val customBootRun = extension.customBootRun
48+ // Create a forked version spring boot run task
49+
50+ val forkedSpringBoot = tasks.register(FORKED_SPRING_BOOT_RUN_TASK_NAME , JavaExecFork ::class .java) { fork ->
51+ fork.dependsOn(tasks.named(bootRunMainClassNameTask.name))
52+ fork.onlyIf { needToFork(bootRunTask, customBootRun, fork) }
53+ }
54+
55+ // This is my task. Before I can run it, I have to run the dependent tasks
56+ val openApiTask = tasks.named(OPEN_API_TASK_NAME , OpenApiGeneratorTask ::class .java) {
57+ it.dependsOn(forkedSpringBoot)
58+ }
59+
60+ // The forked task need to be terminated as soon as my task is finished
61+ forkedSpringBoot.get().stopAfter = openApiTask as TaskProvider <Task >
62+ }
63+
64+ private fun Project.springBoot3CompatibilityCheck () {
65+ val tasksNames = tasks.names
66+ val boot2TaskName = " bootRunMainClassName"
67+ val boot3TaskName = " resolveMainClassName"
68+ if (! tasksNames.contains(boot2TaskName) && tasksNames.contains(boot3TaskName)) {
69+ tasks.register(boot2TaskName) { it.dependsOn(tasks.named(boot3TaskName)) }
70+ }
71+ }
72+
73+ private fun needToFork (
74+ bootRunTask : TaskProvider <Task >,
75+ customBootRun : CustomBootRunAction ,
76+ fork : JavaExecFork
77+ ): Boolean {
78+ val bootRun = bootRunTask.get() as BootRun
79+
80+ val baseSystemProperties = customBootRun.systemProperties.orNull?.takeIf { it.isNotEmpty() }
81+ ? : bootRun.systemProperties
82+ with (fork) {
83+ // copy all system properties, excluding those starting with `java.class.path`
84+ systemProperties = baseSystemProperties.filter {
85+ ! it.key.startsWith(CLASS_PATH_PROPERTY_NAME )
86+ }
87+
88+ // use original bootRun parameter if the list-type customBootRun properties are empty
89+ workingDir = customBootRun.workingDir.asFile.orNull
90+ ? : fork.temporaryDir
91+ args = customBootRun.args.orNull?.takeIf { it.isNotEmpty() }?.toMutableList()
92+ ? : bootRun.args?.toMutableList() ? : mutableListOf ()
93+ classpath = customBootRun.classpath.takeIf { ! it.isEmpty }
94+ ? : bootRun.classpath
95+ main = customBootRun.mainClass.orNull
96+ ? : bootRun.mainClass.get()
97+ jvmArgs = customBootRun.jvmArgs.orNull?.takeIf { it.isNotEmpty() }
98+ ? : bootRun.jvmArgs
99+ environment = customBootRun.environment.orNull?.takeIf { it.isNotEmpty() }
100+ ? : bootRun.environment
101+ if (Jvm .current().toString().startsWith(" 1.8" )) {
102+ killDescendants = false
103+ }
104+ }
105+ return true
106+ }
97107}
0 commit comments