Skip to content

Commit 053fabf

Browse files
committed
Add nullability annotations to build-plugin/spring-boot-gradle-plugin
See gh-46587
1 parent 551fee3 commit 053fabf

28 files changed

+162
-90
lines changed

build-plugin/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/dsl/SpringBootExtension.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,10 @@
2828
import org.gradle.api.tasks.TaskContainer;
2929
import org.gradle.api.tasks.TaskProvider;
3030
import org.gradle.api.tasks.bundling.Jar;
31+
import org.jspecify.annotations.Nullable;
3132

3233
import org.springframework.boot.gradle.tasks.buildinfo.BuildInfo;
34+
import org.springframework.util.Assert;
3335

3436
/**
3537
* Entry point to Spring Boot's Gradle DSL.
@@ -85,7 +87,7 @@ public void buildInfo() {
8587
* artifact will be the base name of the {@code bootWar} or {@code bootJar} task.
8688
* @param configurer the task configurer
8789
*/
88-
public void buildInfo(Action<BuildInfo> configurer) {
90+
public void buildInfo(@Nullable Action<BuildInfo> configurer) {
8991
TaskContainer tasks = this.project.getTasks();
9092
TaskProvider<BuildInfo> bootBuildInfo = tasks.register("bootBuildInfo", BuildInfo.class,
9193
this::configureBuildInfoTask);
@@ -109,20 +111,22 @@ private void configureBuildInfoTask(BuildInfo task) {
109111
}
110112

111113
private File determineMainSourceSetResourcesOutputDir() {
112-
return this.project.getExtensions()
114+
File resourcesDir = this.project.getExtensions()
113115
.getByType(JavaPluginExtension.class)
114116
.getSourceSets()
115117
.getByName(SourceSet.MAIN_SOURCE_SET_NAME)
116118
.getOutput()
117119
.getResourcesDir();
120+
Assert.state(resourcesDir != null, "'resourcesDir' must not be null");
121+
return resourcesDir;
118122
}
119123

120-
private String determineArtifactBaseName() {
124+
private @Nullable String determineArtifactBaseName() {
121125
Jar artifactTask = findArtifactTask();
122126
return (artifactTask != null) ? artifactTask.getArchiveBaseName().get() : null;
123127
}
124128

125-
private Jar findArtifactTask() {
129+
private @Nullable Jar findArtifactTask() {
126130
Jar artifactTask = (Jar) this.project.getTasks().findByName("bootWar");
127131
if (artifactTask != null) {
128132
return artifactTask;

build-plugin/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/dsl/package-info.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,7 @@
1717
/**
1818
* Spring Boot Gradle DSL.
1919
*/
20+
@NullMarked
2021
package org.springframework.boot.gradle.dsl;
22+
23+
import org.jspecify.annotations.NullMarked;

build-plugin/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/DependencyManagementPluginAction.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
import org.gradle.api.Plugin;
2323
import org.gradle.api.Project;
2424

25+
import org.springframework.util.Assert;
26+
2527
/**
2628
* {@link Action} that is performed in response to the {@link DependencyManagementPlugin}
2729
* being applied.
@@ -32,9 +34,10 @@ final class DependencyManagementPluginAction implements PluginApplicationAction
3234

3335
@Override
3436
public void execute(Project project) {
35-
project.getExtensions()
36-
.findByType(DependencyManagementExtension.class)
37-
.imports((importsHandler) -> importsHandler.mavenBom(SpringBootPlugin.BOM_COORDINATES));
37+
DependencyManagementExtension extension = project.getExtensions()
38+
.findByType(DependencyManagementExtension.class);
39+
Assert.state(extension != null, "'extension' must not be null");
40+
extension.imports((importsHandler) -> importsHandler.mavenBom(SpringBootPlugin.BOM_COORDINATES));
3841
}
3942

4043
@Override

build-plugin/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/JavaPluginAction.java

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,13 @@
4444
import org.gradle.api.tasks.compile.JavaCompile;
4545
import org.gradle.jvm.toolchain.JavaToolchainService;
4646
import org.gradle.jvm.toolchain.JavaToolchainSpec;
47+
import org.jspecify.annotations.Nullable;
4748

4849
import org.springframework.boot.gradle.dsl.SpringBootExtension;
4950
import org.springframework.boot.gradle.tasks.bundling.BootBuildImage;
5051
import org.springframework.boot.gradle.tasks.bundling.BootJar;
5152
import org.springframework.boot.gradle.tasks.run.BootRun;
53+
import org.springframework.util.Assert;
5254
import org.springframework.util.StringUtils;
5355

5456
/**
@@ -123,6 +125,7 @@ private TaskProvider<ResolveMainClassName> configureResolveMainClassNameTask(Pro
123125
}
124126
SpringBootExtension springBootExtension = project.getExtensions()
125127
.findByType(SpringBootExtension.class);
128+
Assert.state(springBootExtension != null, "'springBootExtension' must not be null");
126129
return springBootExtension.getMainClass().getOrNull();
127130
}));
128131
resolveMainClassName.getOutputFile()
@@ -147,7 +150,7 @@ private TaskProvider<ResolveMainClassName> configureResolveMainTestClassNameTask
147150
});
148151
}
149152

150-
private static String getJavaApplicationMainClass(ExtensionContainer extensions) {
153+
private static @Nullable String getJavaApplicationMainClass(ExtensionContainer extensions) {
151154
JavaApplication javaApplication = extensions.findByType(JavaApplication.class);
152155
if (javaApplication == null) {
153156
return null;
@@ -200,10 +203,12 @@ private void configureArtifactPublication(TaskProvider<BootJar> bootJar) {
200203
}
201204

202205
private void configureBootRunTask(Project project, TaskProvider<ResolveMainClassName> resolveMainClassName) {
203-
Callable<FileCollection> classpath = () -> javaPluginExtension(project).getSourceSets()
204-
.findByName(SourceSet.MAIN_SOURCE_SET_NAME)
205-
.getRuntimeClasspath()
206-
.filter(new JarTypeFileSpec());
206+
Callable<FileCollection> classpath = () -> {
207+
SourceSet mainSourceSet = javaPluginExtension(project).getSourceSets()
208+
.findByName(SourceSet.MAIN_SOURCE_SET_NAME);
209+
Assert.state(mainSourceSet != null, "'mainSourceSet' must not be null");
210+
return mainSourceSet.getRuntimeClasspath().filter(new JarTypeFileSpec());
211+
};
207212
project.getTasks().register(SpringBootPlugin.BOOT_RUN_TASK_NAME, BootRun.class, (run) -> {
208213
run.setDescription("Runs this project as a Spring Boot application.");
209214
run.setGroup(ApplicationPlugin.APPLICATION_GROUP);
@@ -214,10 +219,12 @@ private void configureBootRunTask(Project project, TaskProvider<ResolveMainClass
214219
}
215220

216221
private void configureBootTestRunTask(Project project, TaskProvider<ResolveMainClassName> resolveMainClassName) {
217-
Callable<FileCollection> classpath = () -> javaPluginExtension(project).getSourceSets()
218-
.findByName(SourceSet.TEST_SOURCE_SET_NAME)
219-
.getRuntimeClasspath()
220-
.filter(new JarTypeFileSpec());
222+
Callable<FileCollection> classpath = () -> {
223+
SourceSet testSourceSet = javaPluginExtension(project).getSourceSets()
224+
.findByName(SourceSet.TEST_SOURCE_SET_NAME);
225+
Assert.state(testSourceSet != null, "'testSourceSet' must not be null");
226+
return testSourceSet.getRuntimeClasspath().filter(new JarTypeFileSpec());
227+
};
221228
project.getTasks().register("bootTestRun", BootRun.class, (run) -> {
222229
run.setDescription("Runs this project as a Spring Boot application using the test runtime classpath.");
223230
run.setGroup(ApplicationPlugin.APPLICATION_GROUP);

build-plugin/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/ResolveMainClassName.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,10 @@
4040
import org.gradle.api.tasks.OutputFile;
4141
import org.gradle.api.tasks.TaskAction;
4242
import org.gradle.work.DisableCachingByDefault;
43+
import org.jspecify.annotations.Nullable;
4344

4445
import org.springframework.boot.loader.tools.MainClassFinder;
46+
import org.springframework.util.Assert;
4547

4648
/**
4749
* {@link Task} for resolving the name of the application's main class.
@@ -58,7 +60,7 @@ public class ResolveMainClassName extends DefaultTask {
5860

5961
private final Property<String> configuredMainClass;
6062

61-
private FileCollection classpath;
63+
private @Nullable FileCollection classpath;
6264

6365
/**
6466
* Creates a new instance of the {@code ResolveMainClassName} task.
@@ -75,6 +77,7 @@ public ResolveMainClassName() {
7577
*/
7678
@Classpath
7779
public FileCollection getClasspath() {
80+
Assert.state(this.classpath != null, "'classpath' must not be null");
7881
return this.classpath;
7982
}
8083

@@ -140,7 +143,7 @@ private String resolveMainClassName() {
140143
.orElse("");
141144
}
142145

143-
private String findMainClass(File file) {
146+
private @Nullable String findMainClass(File file) {
144147
try {
145148
return MainClassFinder.findSingleMainClass(file, SPRING_BOOT_APPLICATION_CLASS_NAME);
146149
}

build-plugin/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/SinglePublishedArtifact.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.gradle.api.tasks.TaskDependency;
2525
import org.gradle.api.tasks.TaskProvider;
2626
import org.gradle.api.tasks.bundling.Jar;
27+
import org.jspecify.annotations.Nullable;
2728

2829
import org.springframework.boot.gradle.tasks.bundling.BootJar;
2930
import org.springframework.boot.gradle.tasks.bundling.BootWar;
@@ -41,7 +42,7 @@ final class SinglePublishedArtifact implements Buildable {
4142

4243
private final ArtifactHandler handler;
4344

44-
private PublishArtifact currentArtifact;
45+
private @Nullable PublishArtifact currentArtifact;
4546

4647
SinglePublishedArtifact(Configuration configuration, ArtifactHandler handler) {
4748
this.configuration = configuration;

build-plugin/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/SpringBootPlugin.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.gradle.api.Plugin;
2424
import org.gradle.api.Project;
2525
import org.gradle.api.artifacts.Configuration;
26+
import org.jspecify.annotations.Nullable;
2627

2728
import org.springframework.boot.gradle.dsl.SpringBootExtension;
2829
import org.springframework.boot.gradle.tasks.bundling.BootBuildImage;
@@ -42,7 +43,8 @@
4243
*/
4344
public class SpringBootPlugin implements Plugin<Project> {
4445

45-
private static final String SPRING_BOOT_VERSION = VersionExtractor.forClass(DependencyManagementPluginAction.class);
46+
private static final @Nullable String SPRING_BOOT_VERSION = VersionExtractor
47+
.forClass(DependencyManagementPluginAction.class);
4648

4749
/**
4850
* The name of the {@link Configuration} that contains Spring Boot archives.

build-plugin/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/package-info.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,7 @@
1717
/**
1818
* Central classes for the Spring Boot Gradle plugin.
1919
*/
20+
@NullMarked
2021
package org.springframework.boot.gradle.plugin;
22+
23+
import org.jspecify.annotations.NullMarked;

build-plugin/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/tasks/aot/ProcessTestAot.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@
3131
import org.gradle.api.tasks.PathSensitivity;
3232
import org.gradle.api.tasks.SkipWhenEmpty;
3333
import org.gradle.api.tasks.TaskAction;
34+
import org.jspecify.annotations.Nullable;
35+
36+
import org.springframework.util.Assert;
3437

3538
/**
3639
* Custom {@link JavaExec} task for ahead-of-time processing of a Spring Boot
@@ -42,7 +45,7 @@
4245
@CacheableTask
4346
public class ProcessTestAot extends AbstractAot {
4447

45-
private FileCollection classpathRoots;
48+
private @Nullable FileCollection classpathRoots;
4649

4750
public ProcessTestAot() {
4851
getMainClass().set("org.springframework.boot.test.context.SpringBootTestAotProcessor");
@@ -54,7 +57,7 @@ public ProcessTestAot() {
5457
*/
5558
@InputFiles
5659
@PathSensitive(PathSensitivity.RELATIVE)
57-
public final FileCollection getClasspathRoots() {
60+
public final @Nullable FileCollection getClasspathRoots() {
5861
return this.classpathRoots;
5962
}
6063

@@ -71,14 +74,17 @@ public void setClasspathRoots(FileCollection classpathRoots) {
7174
@IgnoreEmptyDirectories
7275
@PathSensitive(PathSensitivity.RELATIVE)
7376
final FileTree getInputClasses() {
77+
Assert.state(this.classpathRoots != null, "'classpathRoots' must not be null");
7478
return this.classpathRoots.getAsFileTree();
7579
}
7680

7781
@Override
7882
@TaskAction
7983
public void exec() {
8084
List<String> args = new ArrayList<>();
81-
args.add(getClasspathRoots().getFiles()
85+
FileCollection classpathRoots = getClasspathRoots();
86+
Assert.state(classpathRoots != null, "'classpathRoots' must not be null");
87+
args.add(classpathRoots.getFiles()
8288
.stream()
8389
.filter(File::exists)
8490
.map(File::getAbsolutePath)

build-plugin/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/tasks/aot/package-info.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,7 @@
1717
/**
1818
* Support for ahead-of-time processing of an application built with Gradle.
1919
*/
20+
@NullMarked
2021
package org.springframework.boot.gradle.tasks.aot;
22+
23+
import org.jspecify.annotations.NullMarked;

0 commit comments

Comments
 (0)