Skip to content

Commit 57097cb

Browse files
committed
Merge branch 'steklopod-Spring_Boot_3'
2 parents 2c48609 + f9a8622 commit 57097cb

File tree

9 files changed

+162
-77
lines changed

9 files changed

+162
-77
lines changed

.github/workflows/master.yml

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
name: Test CI
2+
on: [ push, fork ]
3+
4+
jobs:
5+
TEST_ALL:
6+
runs-on: ubuntu-latest
7+
strategy:
8+
matrix:
9+
java: [ '11', '17' ]
10+
steps:
11+
- name: Checkout
12+
uses: actions/checkout@v3
13+
14+
- uses: actions/cache@v3
15+
with:
16+
path: |
17+
~/.gradle/caches
18+
~/.gradle/wrapper
19+
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
20+
restore-keys: |
21+
${{ runner.os }}-gradle-
22+
23+
- name: 🪜 Setup java ${{ matrix.java }}
24+
uses: actions/setup-java@v3
25+
with:
26+
java-version: ${{ matrix.java }}
27+
distribution: temurin
28+
29+
- name: 🦞 chmod /gradlew
30+
run: chmod +x ./gradlew
31+
32+
- name: 🔦 Test
33+
run: ./gradlew test --info

.run/TEST.run.xml

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<component name="ProjectRunConfigurationManager">
2+
<configuration default="false" name="TEST" type="JUnit" factoryName="JUnit">
3+
<module name="springdoc-openapi-gradle-plugin.test" />
4+
<shortenClasspath name="ARGS_FILE" />
5+
<useClassPathOnly />
6+
<extension name="coverage">
7+
<pattern>
8+
<option name="PATTERN" value="org.springdoc.openapi.gradle.plugin.*" />
9+
<option name="ENABLED" value="true" />
10+
</pattern>
11+
</extension>
12+
<extension name="net.ashald.envfile">
13+
<option name="IS_ENABLED" value="false" />
14+
<option name="IS_SUBST" value="false" />
15+
<option name="IS_PATH_MACRO_SUPPORTED" value="false" />
16+
<option name="IS_IGNORE_MISSING_FILES" value="false" />
17+
<option name="IS_ENABLE_EXPERIMENTAL_INTEGRATIONS" value="false" />
18+
<ENTRIES>
19+
<ENTRY IS_ENABLED="true" PARSER="runconfig" />
20+
</ENTRIES>
21+
</extension>
22+
<option name="ALTERNATIVE_JRE_PATH" value="corretto-19" />
23+
<option name="PACKAGE_NAME" value="org.springdoc.openapi.gradle.plugin" />
24+
<option name="MAIN_CLASS_NAME" value="org.springdoc.openapi.gradle.plugin.OpenApiGradlePluginTest" />
25+
<option name="METHOD_NAME" value="" />
26+
<option name="TEST_OBJECT" value="class" />
27+
<option name="PARAMETERS" value="" />
28+
<option name="WORKING_DIRECTORY" value="%MODULE_WORKING_DIR%" />
29+
<method v="2">
30+
<option name="Make" enabled="true" />
31+
</method>
32+
</configuration>
33+
</component>

README.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,15 @@ Gradle Groovy DSL
2727
```groovy
2828
plugins {
2929
id "org.springframework.boot" version "2.7.0"
30-
id "org.springdoc.openapi-gradle-plugin" version "1.5.0"
30+
id "org.springdoc.openapi-gradle-plugin" version "1.6.0"
3131
}
3232
```
3333

3434
Gradle Kotlin DSL
3535
```groovy
3636
plugins {
3737
id("org.springframework.boot") version "2.7.0"
38-
id("org.springdoc.openapi-gradle-plugin") version "1.5.0"
38+
id("org.springdoc.openapi-gradle-plugin") version "1.6.0"
3939
}
4040
```
4141

@@ -133,7 +133,7 @@ The `groupedApiMappings` customization allows you to specify multiple URLs/file
133133
2. Update the version for the plugin to match the current version found in `build.gradle.kts`
134134

135135
```
136-
id("org.springdoc.openapi-gradle-plugin") version "1.5.0"
136+
id("org.springdoc.openapi-gradle-plugin") version "1.6.0"
137137
```
138138
139139
3. Add the following to the spring boot apps `settings.gradle`

build.gradle.kts

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ plugins {
99
}
1010

1111
group = "org.springdoc"
12-
version = "1.5.0"
12+
version = "1.6.0"
1313

1414
sonarqube {
1515
properties {

settings.gradle.kts

+6
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,8 @@
11
rootProject.name = "springdoc-openapi-gradle-plugin"
22

3+
pluginManagement {
4+
repositories {
5+
mavenCentral()
6+
gradlePluginPortal()
7+
}
8+
}

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

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ const val OPEN_API_TASK_NAME = "generateOpenApiDocs"
66
const val OPEN_API_TASK_DESCRIPTION = "Generates the spring doc openapi file"
77
const val SPRING_BOOT_RUN_TASK_NAME = "bootRun"
88
const val SPRING_BOOT_RUN_MAIN_CLASS_NAME_TASK_NAME = "bootRunMainClassName"
9+
const val SPRING_BOOT_3_RUN_MAIN_CLASS_NAME_TASK_NAME = "bootRun"
910
const val FORKED_SPRING_BOOT_RUN_TASK_NAME = "forkedSpringBootRun"
1011

1112
const val DEFAULT_API_DOCS_URL = "http://localhost:8080/v3/api-docs"
Original file line numberDiff line numberDiff line change
@@ -1,84 +1,95 @@
1-
@file:Suppress("unused")
2-
31
package org.springdoc.openapi.gradle.plugin
42

53
import com.github.psxpaul.task.JavaExecFork
64
import org.gradle.api.Plugin
75
import org.gradle.api.Project
6+
import org.gradle.api.Task
87
import org.gradle.api.logging.Logging
8+
import org.gradle.api.tasks.TaskProvider
9+
import org.gradle.internal.jvm.Jvm
910
import org.springframework.boot.gradle.tasks.run.BootRun
1011

1112
open class OpenApiGradlePlugin : Plugin<Project> {
12-
private val logger = Logging.getLogger(OpenApiGradlePlugin::class.java)
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, this)
22+
23+
afterEvaluate { generate(this) }
24+
}
25+
}
1326

14-
override fun apply(project: Project) {
15-
// Run time dependency on the following plugins
16-
project.plugins.apply(SPRING_BOOT_PLUGIN)
17-
project.plugins.apply(EXEC_FORK_PLUGIN)
27+
private fun generate(project: Project) = project.run {
28+
springBoot3CompatibilityCheck()
1829

19-
project.extensions.create(EXTENSION_NAME, OpenApiExtension::class.java, project)
30+
// The task, used to run the Spring Boot application (`bootRun`)
31+
val bootRunTask = tasks.named(SPRING_BOOT_RUN_TASK_NAME)
32+
// The task, used to resolve the application's main class (`bootRunMainClassName`)
33+
val bootRunMainClassNameTask = tasks.find { it.name == SPRING_BOOT_RUN_MAIN_CLASS_NAME_TASK_NAME}
34+
?:tasks.named(SPRING_BOOT_3_RUN_MAIN_CLASS_NAME_TASK_NAME)
2035

21-
project.afterEvaluate {
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 =
26-
project.tasks.named(SPRING_BOOT_RUN_MAIN_CLASS_NAME_TASK_NAME)
36+
val extension = extensions.findByName(EXTENSION_NAME) as OpenApiExtension
37+
val customBootRun = extension.customBootRun
38+
// Create a forked version spring boot run task
39+
val forkedSpringBoot = tasks.register(FORKED_SPRING_BOOT_RUN_TASK_NAME, JavaExecFork::class.java) { fork ->
40+
fork.dependsOn(bootRunMainClassNameTask)
41+
fork.onlyIf { needToFork(bootRunTask, customBootRun, fork) }
42+
}
2743

28-
val extension = project.extensions.findByName(EXTENSION_NAME) as OpenApiExtension
29-
val customBootRun = extension.customBootRun
30-
// Create a forked version spring boot run task
31-
val forkedSpringBoot =
32-
project.tasks.register(
33-
FORKED_SPRING_BOOT_RUN_TASK_NAME,
34-
JavaExecFork::class.java
35-
) { fork ->
36-
fork.dependsOn(bootRunMainClassNameTask)
44+
// This is my task. Before I can run it, I have to run the dependent tasks
45+
tasks.register(OPEN_API_TASK_NAME, OpenApiGeneratorTask::class.java) {
46+
it.dependsOn(forkedSpringBoot)
47+
}
3748

38-
fork.onlyIf {
39-
val bootRun = bootRunTask.get() as BootRun
49+
// The forked task need to be terminated as soon as my task is finished
50+
forkedSpringBoot.get().stopAfter = tasks.named(OPEN_API_TASK_NAME)
51+
}
4052

41-
val baseSystemProperties = customBootRun.systemProperties.orNull?.takeIf { it.isNotEmpty() }
42-
?: bootRun.systemProperties
43-
// copy all system properties, excluding those starting with `java.class.path`
44-
fork.systemProperties = baseSystemProperties.filter {
45-
!it.key.startsWith(
46-
CLASS_PATH_PROPERTY_NAME
47-
)
48-
}
53+
private fun Project.springBoot3CompatibilityCheck() {
54+
val tasksNames = tasks.names
55+
val boot2TaskName = "bootRunMainClassName"
56+
val boot3TaskName = "resolveMainClassName"
57+
if (!tasksNames.contains(boot2TaskName) && tasksNames.contains(boot3TaskName))
58+
tasks.register(boot2TaskName) { it.dependsOn(tasks.named(boot3TaskName)) }
59+
}
4960

50-
// use original bootRun parameter if the list-type customBootRun properties is empty
51-
fork.workingDir = customBootRun.workingDir.asFile.orNull
52-
?: bootRun.workingDir
53-
fork.args = customBootRun.args.orNull?.takeIf { it.isNotEmpty() }?.toMutableList()
54-
?: bootRun.args?.toMutableList() ?: mutableListOf()
55-
fork.classpath = customBootRun.classpath.takeIf { !it.isEmpty }
56-
?: bootRun.classpath
57-
fork.main = customBootRun.mainClass.orNull
58-
?: bootRun.mainClass.get()
59-
fork.jvmArgs = customBootRun.jvmArgs.orNull?.takeIf { it.isNotEmpty() }
60-
?: bootRun.jvmArgs
61-
fork.environment = customBootRun.environment.orNull?.takeIf { it.isNotEmpty() }
62-
?: bootRun.environment
63-
if (org.gradle.internal.jvm.Jvm.current().toString()
64-
.startsWith("1.8")
65-
) {
66-
fork.killDescendants = false
67-
}
68-
true
69-
}
70-
}
61+
private fun needToFork(
62+
bootRunTask: TaskProvider<Task>,
63+
customBootRun: CustomBootRunAction,
64+
fork: JavaExecFork
65+
): Boolean {
66+
val bootRun = bootRunTask.get() as BootRun
7167

72-
// This is my task. Before I can run it I have to run the dependent tasks
73-
project.tasks.register(
74-
OPEN_API_TASK_NAME,
75-
OpenApiGeneratorTask::class.java
76-
) { openApiGenTask ->
77-
openApiGenTask.dependsOn(forkedSpringBoot)
78-
}
68+
val baseSystemProperties = customBootRun.systemProperties.orNull?.takeIf { it.isNotEmpty() }
69+
?: bootRun.systemProperties
70+
with(fork) {
71+
// copy all system properties, excluding those starting with `java.class.path`
72+
systemProperties = baseSystemProperties.filter {
73+
!it.key.startsWith(CLASS_PATH_PROPERTY_NAME)
74+
}
7975

80-
// The forked task need to be terminated as soon as my task is finished
81-
forkedSpringBoot.get().stopAfter = project.tasks.named(OPEN_API_TASK_NAME)
82-
}
83-
}
76+
// use original bootRun parameter if the list-type customBootRun properties are empty
77+
workingDir = customBootRun.workingDir.asFile.orNull
78+
?: bootRun.workingDir
79+
args = customBootRun.args.orNull?.takeIf { it.isNotEmpty() }?.toMutableList()
80+
?: bootRun.args?.toMutableList() ?: mutableListOf()
81+
classpath = customBootRun.classpath.takeIf { !it.isEmpty }
82+
?: bootRun.classpath
83+
main = customBootRun.mainClass.orNull
84+
?: bootRun.mainClass.get()
85+
jvmArgs = customBootRun.jvmArgs.orNull?.takeIf { it.isNotEmpty() }
86+
?: bootRun.jvmArgs
87+
environment = customBootRun.environment.orNull?.takeIf { it.isNotEmpty() }
88+
?: bootRun.environment
89+
if (Jvm.current().toString().startsWith("1.8")) {
90+
killDescendants = false
91+
}
92+
}
93+
return true
94+
}
8495
}

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

+3-3
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ class OpenApiGradlePluginTest {
2828

2929
private val baseBuildGradle = """plugins {
3030
id 'java'
31-
id 'org.springframework.boot' version '2.4.5'
32-
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
31+
id 'org.springframework.boot' version '2.7.6'
32+
id 'io.spring.dependency-management' version '1.1.15.RELEASE'
3333
id 'org.springdoc.openapi-gradle-plugin'
3434
}
3535
@@ -43,7 +43,7 @@ class OpenApiGradlePluginTest {
4343
4444
dependencies {
4545
implementation 'org.springframework.boot:spring-boot-starter-web'
46-
implementation 'org.springdoc:springdoc-openapi-webmvc-core:1.6.12'
46+
implementation 'org.springdoc:springdoc-openapi-webmvc-core:1.6.13'
4747
}
4848
""".trimIndent()
4949

src/test/resources/acceptance-project/src/main/java/com/example/demo/DemoApplication.java

+6-5
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,25 @@
11
package com.example.demo;
22

3+
import org.springframework.boot.ApplicationArguments;
4+
import org.springframework.boot.ApplicationRunner;
35
import org.springframework.beans.factory.annotation.Value;
46
import org.springframework.boot.SpringApplication;
57
import org.springframework.boot.autoconfigure.SpringBootApplication;
68

7-
import javax.annotation.PostConstruct;
89
import java.time.Duration;
910

1011
@SpringBootApplication
11-
public class DemoApplication {
12+
public class DemoApplication implements ApplicationRunner{
1213

1314
@Value("${slower:false}")
1415
boolean slower;
1516

1617
public static void main(String[] args) {
1718
SpringApplication.run(DemoApplication.class, args);
1819
}
19-
20-
@PostConstruct
21-
public void afterBeanStuff() throws InterruptedException {
20+
@Override
21+
public void run(ApplicationArguments arg0) throws Exception {
22+
System.out.println("Hello World from Application Runner");
2223
if (slower) {
2324
Duration waitTime = Duration.ofSeconds(40);
2425
System.out.println("Waiting for " + waitTime + " before starting");

0 commit comments

Comments
 (0)