Skip to content

Commit 503c6cb

Browse files
committed
Merge branch 'switch_to_gradle-execfork-plugin' of https://github.com/mr-july/springdoc-openapi-gradle-plugin into mr-july-switch_to_gradle-execfork-plugin
2 parents 6f00c65 + 436d54d commit 503c6cb

File tree

8 files changed

+56
-111
lines changed

8 files changed

+56
-111
lines changed

README.md

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,14 @@ The plugin does this with help of springdoc-openapi-core.
1111
Compatibility Notes
1212
-------------------
1313

14-
The plugin is built on Gradle version 6.4.1.
14+
The plugin is built on Gradle version 7.0.
1515

1616
Dependencies
1717
------------
18-
This plugin has a runtime dependency on the the following plugins:
18+
This plugin has a runtime dependency on the following plugins:
1919

2020
1. Spring Boot Gradle plugin - `org.springframework.boot`
21-
2. Gradle process plugin - `com.github.johnrengelman.processes`
22-
23-
Hence these plugins also needs to be added to your Gradle builds.
21+
2. Gradle process plugin - `com.github.psxpaul.execfork`
2422

2523
Note: You will also need the springdoc-core jar file to be present in your Spring Boot application.
2624

@@ -32,7 +30,6 @@ Gradle Groovy DSL
3230
```groovy
3331
plugins {
3432
id "org.springframework.boot" version "2.3.0.RELEASE"
35-
id "com.github.johnrengelman.processes" version "0.5.0"
3633
id "org.springdoc.openapi-gradle-plugin" version "1.3.3"
3734
}
3835
```
@@ -41,7 +38,6 @@ Gradle Kotlin DSL
4138
```groovy
4239
plugins {
4340
id("org.springframework.boot") version "2.3.0.RELEASE"
44-
id("com.github.johnrengelman.processes") version "0.5.0"
4541
id("org.springdoc.openapi-gradle-plugin") version "1.3.3"
4642
}
4743
```

build.gradle.kts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ repositories {
2323
url = uri("https://repo.spring.io/libs-release/")
2424
}
2525
gradlePluginPortal()
26+
maven {
27+
name = "Gradle Plugins Maven Repository"
28+
url = uri("https://plugins.gradle.org/m2/")
29+
}
2630
}
2731

2832
publishing {
@@ -45,7 +49,8 @@ dependencies {
4549
implementation("khttp:khttp:1.0.0")
4650
implementation("com.google.code.gson:gson:2.8.6")
4751
implementation("org.awaitility:awaitility-kotlin:4.0.3")
48-
implementation(files("$projectDir/libs/gradle-processes-0.5.0.jar"))
52+
implementation("com.github.psxpaul:gradle-execfork-plugin:0.1.15")
53+
implementation("org.springframework.boot:spring-boot-gradle-plugin:2.5.6")
4954

5055
testImplementation(gradleTestKit())
5156
testImplementation(platform("org.junit:junit-bom:5.7.1"))

libs/gradle-processes-0.5.0.jar

-33.3 KB
Binary file not shown.

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

Lines changed: 0 additions & 43 deletions
This file was deleted.

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,15 @@ const val EXTENSION_NAME = "openApi"
44
const val GROUP_NAME = "OpenApi"
55
const val OPEN_API_TASK_NAME = "generateOpenApiDocs"
66
const val OPEN_API_TASK_DESCRIPTION = "Generates the spring doc openapi file"
7-
const val SPRING_BOOT_JAR_TASK_NAME = "bootJar"
7+
const val SPRING_BOOT_RUN_TASK_NAME = "bootRun"
8+
const val SPRING_BOOT_RUN_MAIN_CLASS_NAME_TASK_NAME = "bootRunMainClassName"
89
const val FORKED_SPRING_BOOT_RUN_TASK_NAME = "forkedSpringBootRun"
9-
const val FINALIZER_TASK_NAME = "stopForkedSpringBoot"
1010

1111
const val DEFAULT_API_DOCS_URL = "http://localhost:8080/v3/api-docs"
1212
const val DEFAULT_OPEN_API_FILE_NAME = "openapi.json"
1313
const val DEFAULT_WAIT_TIME_IN_SECONDS = 30
1414

1515
const val SPRING_BOOT_PLUGIN = "org.springframework.boot"
16-
const val PROCESS_PLUGIN = "com.github.johnrengelman.processes"
16+
const val EXEC_FORK_PLUGIN = "com.github.psxpaul.execfork"
1717

18-
const val PROPS_LAUNCHER_CLASS = "org.springframework.boot.loader.PropertiesLauncher"
1918
const val CLASS_PATH_PROPERTY_NAME = "java.class.path"

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,5 @@ open class OpenApiExtension @Inject constructor(project: Project) {
1111
val outputFileName: Property<String> = project.objects.property(String::class.java)
1212
val outputDir: DirectoryProperty = project.objects.directoryProperty()
1313
val waitTimeInSeconds: Property<Int> = project.objects.property(Int::class.java)
14-
val forkProperties: Property<Any> = project.objects.property(Any::class.java)
1514
val groupedApiMappings: MapProperty<String, String> = project.objects.mapProperty(String::class.java, String::class.java)
1615
}

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
}

src/test/kotlin/org/springdoc/openapi/gradle/plugin/OpenApiGradlePluginTest.kt

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ class OpenApiGradlePluginTest {
2424
id 'java'
2525
id 'org.springframework.boot' version '2.4.5'
2626
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
27-
id 'com.github.johnrengelman.processes' version '0.5.0'
2827
id 'org.springdoc.openapi-gradle-plugin'
2928
}
3029
@@ -89,11 +88,11 @@ class OpenApiGradlePluginTest {
8988
}
9089

9190
@Test
92-
fun `using forked properties`() {
91+
fun `using properties`() {
9392
buildFile.writeText(
9493
"""$baseBuildGradle
95-
openApi{
96-
forkProperties = "-Dspring.profiles.active=multiple-endpoints -Dsome.second.property=someValue"
94+
bootRun {
95+
args = ["--spring.profiles.active=multiple-endpoints", "--some.second.property=someValue"]
9796
}
9897
""".trimMargin()
9998
)
@@ -106,8 +105,8 @@ class OpenApiGradlePluginTest {
106105
fun `using forked properties via System properties`() {
107106
buildFile.writeText(
108107
"""$baseBuildGradle
109-
openApi{
110-
forkProperties = System.properties
108+
bootRun {
109+
systemProperties = System.properties
111110
}
112111
""".trimMargin()
113112
)
@@ -120,8 +119,10 @@ class OpenApiGradlePluginTest {
120119
fun `configurable wait time`() {
121120
buildFile.writeText(
122121
"""$baseBuildGradle
123-
openApi{
124-
forkProperties = "-Dspring.profiles.active=slower"
122+
bootRun {
123+
args = ["--spring.profiles.active=slower"]
124+
}
125+
openApi{
125126
waitTimeInSeconds = 60
126127
}
127128
""".trimMargin()
@@ -135,9 +136,11 @@ class OpenApiGradlePluginTest {
135136
fun `using different api url`() {
136137
buildFile.writeText(
137138
"""$baseBuildGradle
139+
bootRun {
140+
args = ["--spring.profiles.active=different-url"]
141+
}
138142
openApi{
139143
apiDocsUrl = "http://localhost:8080/secret-api-docs"
140-
forkProperties = "-Dspring.profiles.active=different-url"
141144
}
142145
""".trimMargin()
143146
)
@@ -153,10 +156,12 @@ class OpenApiGradlePluginTest {
153156

154157
buildFile.writeText(
155158
"""$baseBuildGradle
159+
bootRun {
160+
args = ["--spring.profiles.active=multiple-grouped-apis"]
161+
}
156162
openApi{
157163
groupedApiMappings = ["http://localhost:8080/v3/api-docs/groupA": "$outputJsonFileNameGroupA",
158164
"http://localhost:8080/v3/api-docs/groupB": "$outputJsonFileNameGroupB"]
159-
forkProperties = "-Dspring.profiles.active=multiple-grouped-apis"
160165
}
161166
""".trimMargin()
162167
)
@@ -174,12 +179,14 @@ class OpenApiGradlePluginTest {
174179

175180
buildFile.writeText(
176181
"""$baseBuildGradle
182+
bootRun {
183+
args = ["--spring.profiles.active=multiple-grouped-apis"]
184+
}
177185
openApi{
178186
apiDocsUrl = "http://localhost:8080/v3/api-docs/groupA"
179187
outputFileName = "$outputJsonFileNameSingleGroupA"
180188
groupedApiMappings = ["http://localhost:8080/v3/api-docs/groupA": "$outputJsonFileNameGroupA",
181189
"http://localhost:8080/v3/api-docs/groupB": "$outputJsonFileNameGroupB"]
182-
forkProperties = "-Dspring.profiles.active=multiple-grouped-apis"
183190
}
184191
""".trimMargin()
185192
)

0 commit comments

Comments
 (0)