Browse Source

Add nullability annotations to build-plugin/spring-boot-maven-plugin

See gh-46587
pull/46775/head
Moritz Halbritter 4 months ago
parent
commit
924910f5ec
  1. 8
      build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/AbstractAotMojo.java
  2. 14
      build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/AbstractDependencyFilterMojo.java
  3. 19
      build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/AbstractPackagerMojo.java
  4. 24
      build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/AbstractRunMojo.java
  5. 5
      build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/ArtifactsLibraries.java
  6. 47
      build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/BuildImageMojo.java
  7. 16
      build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/BuildInfoMojo.java
  8. 34
      build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/CacheInfo.java
  9. 6
      build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/CommandLineBuilder.java
  10. 3
      build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/CustomLayersProvider.java
  11. 75
      build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/Docker.java
  12. 8
      build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/EnvVariables.java
  13. 9
      build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/FilterableDependency.java
  14. 99
      build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/Image.java
  15. 18
      build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/JavaCompilerPluginConfiguration.java
  16. 5
      build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/JavaProcessExecutor.java
  17. 8
      build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/Layers.java
  18. 10
      build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/MavenBuildOutputTimestamp.java
  19. 9
      build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/ProcessAotMojo.java
  20. 6
      build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/ProcessTestAotMojo.java
  21. 7
      build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/PropertiesMergingResourceTransformer.java
  22. 35
      build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/RepackageMojo.java
  23. 5
      build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/RunArguments.java
  24. 2
      build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/RunMojo.java
  25. 11
      build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/StartMojo.java
  26. 2
      build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/StopMojo.java
  27. 1
      build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/TestRunMojo.java
  28. 4
      build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/VersionExtractor.java
  29. 3
      build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/package-info.java

8
build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/AbstractAotMojo.java

@ -44,6 +44,7 @@ import org.apache.maven.plugin.MojoFailureException; @@ -44,6 +44,7 @@ import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.shared.artifact.filter.collection.ArtifactsFilter;
import org.apache.maven.toolchain.ToolchainManager;
import org.jspecify.annotations.Nullable;
/**
* Abstract base class for AOT processing MOJOs.
@ -59,6 +60,7 @@ public abstract class AbstractAotMojo extends AbstractDependencyFilterMojo { @@ -59,6 +60,7 @@ public abstract class AbstractAotMojo extends AbstractDependencyFilterMojo {
* The current Maven session. This is used for toolchain manager API calls.
*/
@Parameter(defaultValue = "${session}", readonly = true)
@SuppressWarnings("NullAway.Init")
private MavenSession session;
/**
@ -76,21 +78,21 @@ public abstract class AbstractAotMojo extends AbstractDependencyFilterMojo { @@ -76,21 +78,21 @@ public abstract class AbstractAotMojo extends AbstractDependencyFilterMojo {
* List of JVM system properties to pass to the AOT process.
*/
@Parameter
private Map<String, String> systemPropertyVariables;
private @Nullable Map<String, String> systemPropertyVariables;
/**
* JVM arguments that should be associated with the AOT process. On command line, make
* sure to wrap multiple values between quotes.
*/
@Parameter(property = "spring-boot.aot.jvmArguments")
private String jvmArguments;
private @Nullable String jvmArguments;
/**
* Arguments that should be provided to the AOT compile process. On command line, make
* sure to wrap multiple values between quotes.
*/
@Parameter(property = "spring-boot.aot.compilerArguments")
private String compilerArguments;
private @Nullable String compilerArguments;
protected AbstractAotMojo(ToolchainManager toolchainManager) {
this.toolchainManager = toolchainManager;

14
build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/AbstractDependencyFilterMojo.java

@ -36,6 +36,7 @@ import org.apache.maven.shared.artifact.filter.collection.AbstractArtifactFeatur @@ -36,6 +36,7 @@ import org.apache.maven.shared.artifact.filter.collection.AbstractArtifactFeatur
import org.apache.maven.shared.artifact.filter.collection.ArtifactFilterException;
import org.apache.maven.shared.artifact.filter.collection.ArtifactsFilter;
import org.apache.maven.shared.artifact.filter.collection.FilterArtifacts;
import org.jspecify.annotations.Nullable;
/**
* A base mojo filtering the dependencies of the project.
@ -67,6 +68,7 @@ public abstract class AbstractDependencyFilterMojo extends AbstractMojo { @@ -67,6 +68,7 @@ public abstract class AbstractDependencyFilterMojo extends AbstractMojo {
* @since 3.0.0
*/
@Parameter(defaultValue = "${project}", readonly = true, required = true)
@SuppressWarnings("NullAway.Init")
protected MavenProject project;
/**
@ -78,7 +80,7 @@ public abstract class AbstractDependencyFilterMojo extends AbstractMojo { @@ -78,7 +80,7 @@ public abstract class AbstractDependencyFilterMojo extends AbstractMojo {
* @since 1.2.0
*/
@Parameter(property = "spring-boot.includes")
private List<Include> includes;
private @Nullable List<Include> includes;
/**
* Collection of artifact definitions to exclude. The {@link Exclude} element defines
@ -89,20 +91,20 @@ public abstract class AbstractDependencyFilterMojo extends AbstractMojo { @@ -89,20 +91,20 @@ public abstract class AbstractDependencyFilterMojo extends AbstractMojo {
* @since 1.1.0
*/
@Parameter(property = "spring-boot.excludes")
private List<Exclude> excludes;
private @Nullable List<Exclude> excludes;
/**
* Comma separated list of groupId names to exclude (exact match).
* @since 1.1.0
*/
@Parameter(property = "spring-boot.excludeGroupIds", defaultValue = "")
private String excludeGroupIds;
private @Nullable String excludeGroupIds;
protected void setExcludes(List<Exclude> excludes) {
protected void setExcludes(@Nullable List<Exclude> excludes) {
this.excludes = excludes;
}
protected void setIncludes(List<Include> includes) {
protected void setIncludes(@Nullable List<Include> includes) {
this.includes = includes;
}
@ -163,7 +165,7 @@ public abstract class AbstractDependencyFilterMojo extends AbstractMojo { @@ -163,7 +165,7 @@ public abstract class AbstractDependencyFilterMojo extends AbstractMojo {
return filters;
}
private String cleanFilterConfig(String content) {
private String cleanFilterConfig(@Nullable String content) {
if (content == null || content.trim().isEmpty()) {
return "";
}

19
build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/AbstractPackagerMojo.java

@ -36,6 +36,7 @@ import org.apache.maven.project.MavenProject; @@ -36,6 +36,7 @@ import org.apache.maven.project.MavenProject;
import org.apache.maven.project.MavenProjectHelper;
import org.apache.maven.shared.artifact.filter.collection.ArtifactsFilter;
import org.apache.maven.shared.artifact.filter.collection.ScopeFilter;
import org.jspecify.annotations.Nullable;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
@ -67,6 +68,7 @@ public abstract class AbstractPackagerMojo extends AbstractDependencyFilterMojo @@ -67,6 +68,7 @@ public abstract class AbstractPackagerMojo extends AbstractDependencyFilterMojo
* @since 1.0.0
*/
@Parameter(defaultValue = "${project}", readonly = true, required = true)
@SuppressWarnings("NullAway.Init")
protected MavenProject project;
/**
@ -74,6 +76,7 @@ public abstract class AbstractPackagerMojo extends AbstractDependencyFilterMojo @@ -74,6 +76,7 @@ public abstract class AbstractPackagerMojo extends AbstractDependencyFilterMojo
* @since 2.4.0
*/
@Parameter(defaultValue = "${session}", readonly = true, required = true)
@SuppressWarnings("NullAway.Init")
protected MavenSession session;
/**
@ -88,7 +91,7 @@ public abstract class AbstractPackagerMojo extends AbstractDependencyFilterMojo @@ -88,7 +91,7 @@ public abstract class AbstractPackagerMojo extends AbstractDependencyFilterMojo
* @since 1.0.0
*/
@Parameter
private String mainClass;
private @Nullable String mainClass;
/**
* Exclude Spring Boot devtools from the repackaged archive.
@ -135,7 +138,7 @@ public abstract class AbstractPackagerMojo extends AbstractDependencyFilterMojo @@ -135,7 +138,7 @@ public abstract class AbstractPackagerMojo extends AbstractDependencyFilterMojo
* @return {@code null}, indicating a layout type will be chosen based on the original
* archive type
*/
protected LayoutType getLayout() {
protected @Nullable LayoutType getLayout() {
return null;
}
@ -144,7 +147,7 @@ public abstract class AbstractPackagerMojo extends AbstractDependencyFilterMojo @@ -144,7 +147,7 @@ public abstract class AbstractPackagerMojo extends AbstractDependencyFilterMojo
* @return the loader implementation or {@code null}
* @since 3.2.0
*/
protected LoaderImplementation getLoaderImplementation() {
protected @Nullable LoaderImplementation getLoaderImplementation() {
return null;
}
@ -153,7 +156,7 @@ public abstract class AbstractPackagerMojo extends AbstractDependencyFilterMojo @@ -153,7 +156,7 @@ public abstract class AbstractPackagerMojo extends AbstractDependencyFilterMojo
* no explicit layout is set.
* @return {@code null}, indicating a default layout factory will be chosen
*/
protected LayoutFactory getLayoutFactory() {
protected @Nullable LayoutFactory getLayoutFactory() {
return null;
}
@ -211,7 +214,7 @@ public abstract class AbstractPackagerMojo extends AbstractDependencyFilterMojo @@ -211,7 +214,7 @@ public abstract class AbstractPackagerMojo extends AbstractDependencyFilterMojo
* @return the libraries to use
* @throws MojoExecutionException on execution error
*/
protected final Libraries getLibraries(Collection<Dependency> unpacks) throws MojoExecutionException {
protected final Libraries getLibraries(@Nullable Collection<Dependency> unpacks) throws MojoExecutionException {
Set<Artifact> artifacts = this.project.getArtifacts();
Set<Artifact> includedArtifacts = filterDependencies(artifacts, getAdditionalFilters());
return new ArtifactsLibraries(artifacts, includedArtifacts, this.session.getProjects(), unpacks, getLog());
@ -238,12 +241,12 @@ public abstract class AbstractPackagerMojo extends AbstractDependencyFilterMojo @@ -238,12 +241,12 @@ public abstract class AbstractPackagerMojo extends AbstractDependencyFilterMojo
* @param classifier the artifact classifier
* @return the source artifact to repackage
*/
protected Artifact getSourceArtifact(String classifier) {
protected Artifact getSourceArtifact(@Nullable String classifier) {
Artifact sourceArtifact = getArtifact(classifier);
return (sourceArtifact != null) ? sourceArtifact : this.project.getArtifact();
}
private Artifact getArtifact(String classifier) {
private @Nullable Artifact getArtifact(@Nullable String classifier) {
if (classifier != null) {
for (Artifact attachedArtifact : this.project.getAttachedArtifacts()) {
if (classifier.equals(attachedArtifact.getClassifier()) && attachedArtifact.getFile() != null
@ -255,7 +258,7 @@ public abstract class AbstractPackagerMojo extends AbstractDependencyFilterMojo @@ -255,7 +258,7 @@ public abstract class AbstractPackagerMojo extends AbstractDependencyFilterMojo
return null;
}
protected File getTargetFile(String finalName, String classifier, File targetDirectory) {
protected File getTargetFile(String finalName, @Nullable String classifier, File targetDirectory) {
String classifierSuffix = (classifier != null) ? classifier.trim() : "";
if (!classifierSuffix.isEmpty() && !classifierSuffix.startsWith("-")) {
classifierSuffix = "-" + classifierSuffix;

24
build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/AbstractRunMojo.java

@ -36,6 +36,7 @@ import org.apache.maven.plugin.MojoFailureException; @@ -36,6 +36,7 @@ import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.project.MavenProject;
import org.apache.maven.toolchain.ToolchainManager;
import org.jspecify.annotations.Nullable;
import org.springframework.boot.loader.tools.FileUtils;
@ -60,6 +61,7 @@ public abstract class AbstractRunMojo extends AbstractDependencyFilterMojo { @@ -60,6 +61,7 @@ public abstract class AbstractRunMojo extends AbstractDependencyFilterMojo {
* @since 1.0.0
*/
@Parameter(defaultValue = "${project}", readonly = true, required = true)
@SuppressWarnings("NullAway.Init")
private MavenProject project;
/**
@ -68,6 +70,7 @@ public abstract class AbstractRunMojo extends AbstractDependencyFilterMojo { @@ -68,6 +70,7 @@ public abstract class AbstractRunMojo extends AbstractDependencyFilterMojo {
* @since 2.3.0
*/
@Parameter(defaultValue = "${session}", readonly = true)
@SuppressWarnings("NullAway.Init")
private MavenSession session;
/**
@ -95,6 +98,7 @@ public abstract class AbstractRunMojo extends AbstractDependencyFilterMojo { @@ -95,6 +98,7 @@ public abstract class AbstractRunMojo extends AbstractDependencyFilterMojo {
* @since 2.2.0
*/
@Parameter(property = "spring-boot.run.agents")
@SuppressWarnings("NullAway") // maven-maven-plugin can't handle annotated arrays
private File[] agents;
/**
@ -112,7 +116,7 @@ public abstract class AbstractRunMojo extends AbstractDependencyFilterMojo { @@ -112,7 +116,7 @@ public abstract class AbstractRunMojo extends AbstractDependencyFilterMojo {
* @since 1.5.0
*/
@Parameter(property = "spring-boot.run.workingDirectory")
private File workingDirectory;
private @Nullable File workingDirectory;
/**
* JVM arguments that should be associated with the forked process used to run the
@ -121,7 +125,7 @@ public abstract class AbstractRunMojo extends AbstractDependencyFilterMojo { @@ -121,7 +125,7 @@ public abstract class AbstractRunMojo extends AbstractDependencyFilterMojo {
* @since 1.1.0
*/
@Parameter(property = "spring-boot.run.jvmArguments")
private String jvmArguments;
private @Nullable String jvmArguments;
/**
* List of JVM system properties to pass to the process.
@ -129,7 +133,7 @@ public abstract class AbstractRunMojo extends AbstractDependencyFilterMojo { @@ -129,7 +133,7 @@ public abstract class AbstractRunMojo extends AbstractDependencyFilterMojo {
* @since 2.1.0
*/
@Parameter
private Map<String, String> systemPropertyVariables;
private @Nullable Map<String, String> systemPropertyVariables;
/**
* List of Environment variables that should be associated with the forked process
@ -138,7 +142,7 @@ public abstract class AbstractRunMojo extends AbstractDependencyFilterMojo { @@ -138,7 +142,7 @@ public abstract class AbstractRunMojo extends AbstractDependencyFilterMojo {
* @since 2.1.0
*/
@Parameter
private Map<String, String> environmentVariables;
private @Nullable Map<String, String> environmentVariables;
/**
* Arguments that should be passed to the application.
@ -146,6 +150,7 @@ public abstract class AbstractRunMojo extends AbstractDependencyFilterMojo { @@ -146,6 +150,7 @@ public abstract class AbstractRunMojo extends AbstractDependencyFilterMojo {
* @since 1.0.0
*/
@Parameter
@SuppressWarnings("NullAway") // maven-maven-plugin can't handle annotated arrays
private String[] arguments;
/**
@ -156,7 +161,7 @@ public abstract class AbstractRunMojo extends AbstractDependencyFilterMojo { @@ -156,7 +161,7 @@ public abstract class AbstractRunMojo extends AbstractDependencyFilterMojo {
* @since 2.2.3
*/
@Parameter(property = "spring-boot.run.arguments")
private String commandlineArguments;
private @Nullable String commandlineArguments;
/**
* The spring profiles to activate. Convenience shortcut of specifying the
@ -166,6 +171,7 @@ public abstract class AbstractRunMojo extends AbstractDependencyFilterMojo { @@ -166,6 +171,7 @@ public abstract class AbstractRunMojo extends AbstractDependencyFilterMojo {
* @since 1.3.0
*/
@Parameter(property = "spring-boot.run.profiles")
@SuppressWarnings("NullAway") // maven-maven-plugin can't handle annotated arrays
private String[] profiles;
/**
@ -175,7 +181,7 @@ public abstract class AbstractRunMojo extends AbstractDependencyFilterMojo { @@ -175,7 +181,7 @@ public abstract class AbstractRunMojo extends AbstractDependencyFilterMojo {
* @since 1.0.0
*/
@Parameter(property = "spring-boot.run.main-class")
private String mainClass;
private @Nullable String mainClass;
/**
* Additional classpath elements that should be added to the classpath. An element can
@ -184,6 +190,7 @@ public abstract class AbstractRunMojo extends AbstractDependencyFilterMojo { @@ -184,6 +190,7 @@ public abstract class AbstractRunMojo extends AbstractDependencyFilterMojo {
* @since 3.2.0
*/
@Parameter(property = "spring-boot.run.additional-classpath-elements")
@SuppressWarnings("NullAway") // maven-maven-plugin can't handle annotated arrays
private String[] additionalClasspathElements;
/**
@ -193,6 +200,7 @@ public abstract class AbstractRunMojo extends AbstractDependencyFilterMojo { @@ -193,6 +200,7 @@ public abstract class AbstractRunMojo extends AbstractDependencyFilterMojo {
* @since 1.0.0
*/
@Parameter(defaultValue = "${project.build.outputDirectory}", required = true)
@SuppressWarnings("NullAway.Init")
private File classesDirectory;
/**
@ -336,7 +344,7 @@ public abstract class AbstractRunMojo extends AbstractDependencyFilterMojo { @@ -336,7 +344,7 @@ public abstract class AbstractRunMojo extends AbstractDependencyFilterMojo {
}
private void addActiveProfileArgument(RunArguments arguments) {
if (this.profiles.length > 0) {
if (this.profiles != null && this.profiles.length > 0) {
StringBuilder arg = new StringBuilder("--spring.profiles.active=");
for (int i = 0; i < this.profiles.length; i++) {
arg.append(this.profiles[i]);
@ -424,7 +432,7 @@ public abstract class AbstractRunMojo extends AbstractDependencyFilterMojo { @@ -424,7 +432,7 @@ public abstract class AbstractRunMojo extends AbstractDependencyFilterMojo {
*/
static class SystemPropertyFormatter {
static String format(String key, String value) {
static String format(@Nullable String key, @Nullable String value) {
if (key == null) {
return "";
}

5
build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/ArtifactsLibraries.java

@ -29,6 +29,7 @@ import org.apache.maven.artifact.Artifact; @@ -29,6 +29,7 @@ import org.apache.maven.artifact.Artifact;
import org.apache.maven.model.Dependency;
import org.apache.maven.plugin.logging.Log;
import org.apache.maven.project.MavenProject;
import org.jspecify.annotations.Nullable;
import org.springframework.boot.loader.tools.Libraries;
import org.springframework.boot.loader.tools.Library;
@ -64,7 +65,7 @@ public class ArtifactsLibraries implements Libraries { @@ -64,7 +65,7 @@ public class ArtifactsLibraries implements Libraries {
private final Collection<MavenProject> localProjects;
private final Collection<Dependency> unpacks;
private final @Nullable Collection<Dependency> unpacks;
private final Log log;
@ -93,7 +94,7 @@ public class ArtifactsLibraries implements Libraries { @@ -93,7 +94,7 @@ public class ArtifactsLibraries implements Libraries {
* @since 2.4.8
*/
public ArtifactsLibraries(Set<Artifact> artifacts, Set<Artifact> includedArtifacts,
Collection<MavenProject> localProjects, Collection<Dependency> unpacks, Log log) {
Collection<MavenProject> localProjects, @Nullable Collection<Dependency> unpacks, Log log) {
this.artifacts = artifacts;
this.includedArtifacts = includedArtifacts;
this.localProjects = localProjects;

47
build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/BuildImageMojo.java

@ -34,6 +34,7 @@ import org.apache.maven.plugin.MojoExecutionException; @@ -34,6 +34,7 @@ import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.logging.Log;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.project.MavenProjectHelper;
import org.jspecify.annotations.Nullable;
import org.springframework.boot.buildpack.platform.build.AbstractBuildLog;
import org.springframework.boot.buildpack.platform.build.BuildLog;
@ -71,13 +72,15 @@ public abstract class BuildImageMojo extends AbstractPackagerMojo { @@ -71,13 +72,15 @@ public abstract class BuildImageMojo extends AbstractPackagerMojo {
* @since 2.3.0
*/
@Parameter(defaultValue = "${project.build.directory}", required = true)
@SuppressWarnings("NullAway.Init")
private File sourceDirectory;
/**
* Name of the source archive.
* @since 2.3.0
*/
@Parameter(defaultValue = "${project.build.finalName}", readonly = true)
@Parameter(defaultValue = "${project.build.finalName}", readonly = true, required = true)
@SuppressWarnings("NullAway.Init")
private String finalName;
/**
@ -92,7 +95,7 @@ public abstract class BuildImageMojo extends AbstractPackagerMojo { @@ -92,7 +95,7 @@ public abstract class BuildImageMojo extends AbstractPackagerMojo {
* @since 2.3.0
*/
@Parameter
private String classifier;
private @Nullable String classifier;
/**
* Image configuration, with {@code builder}, {@code runImage}, {@code name},
@ -101,7 +104,7 @@ public abstract class BuildImageMojo extends AbstractPackagerMojo { @@ -101,7 +104,7 @@ public abstract class BuildImageMojo extends AbstractPackagerMojo {
* @since 2.3.0
*/
@Parameter
private Image image;
private @Nullable Image image;
/**
* Alias for {@link Image#name} to support configuration through command-line
@ -109,7 +112,7 @@ public abstract class BuildImageMojo extends AbstractPackagerMojo { @@ -109,7 +112,7 @@ public abstract class BuildImageMojo extends AbstractPackagerMojo {
* @since 2.3.0
*/
@Parameter(property = "spring-boot.build-image.imageName")
String imageName;
@Nullable String imageName;
/**
* Alias for {@link Image#builder} to support configuration through command-line
@ -117,14 +120,14 @@ public abstract class BuildImageMojo extends AbstractPackagerMojo { @@ -117,14 +120,14 @@ public abstract class BuildImageMojo extends AbstractPackagerMojo {
* @since 2.3.0
*/
@Parameter(property = "spring-boot.build-image.builder")
String imageBuilder;
@Nullable String imageBuilder;
/**
* Alias for {@link Image#trustBuilder} to support configuration through command-line
* property.
*/
@Parameter(property = "spring-boot.build-image.trustBuilder")
Boolean trustBuilder;
@Nullable Boolean trustBuilder;
/**
* Alias for {@link Image#runImage} to support configuration through command-line
@ -132,7 +135,7 @@ public abstract class BuildImageMojo extends AbstractPackagerMojo { @@ -132,7 +135,7 @@ public abstract class BuildImageMojo extends AbstractPackagerMojo {
* @since 2.3.1
*/
@Parameter(property = "spring-boot.build-image.runImage")
String runImage;
@Nullable String runImage;
/**
* Alias for {@link Image#cleanCache} to support configuration through command-line
@ -140,21 +143,21 @@ public abstract class BuildImageMojo extends AbstractPackagerMojo { @@ -140,21 +143,21 @@ public abstract class BuildImageMojo extends AbstractPackagerMojo {
* @since 2.4.0
*/
@Parameter(property = "spring-boot.build-image.cleanCache")
Boolean cleanCache;
@Nullable Boolean cleanCache;
/**
* Alias for {@link Image#pullPolicy} to support configuration through command-line
* property.
*/
@Parameter(property = "spring-boot.build-image.pullPolicy")
PullPolicy pullPolicy;
@Nullable PullPolicy pullPolicy;
/**
* Alias for {@link Image#publish} to support configuration through command-line
* property.
*/
@Parameter(property = "spring-boot.build-image.publish")
Boolean publish;
@Nullable Boolean publish;
/**
* Alias for {@link Image#network} to support configuration through command-line
@ -162,7 +165,7 @@ public abstract class BuildImageMojo extends AbstractPackagerMojo { @@ -162,7 +165,7 @@ public abstract class BuildImageMojo extends AbstractPackagerMojo {
* @since 2.6.0
*/
@Parameter(property = "spring-boot.build-image.network")
String network;
@Nullable String network;
/**
* Alias for {@link Image#createdDate} to support configuration through command-line
@ -170,7 +173,7 @@ public abstract class BuildImageMojo extends AbstractPackagerMojo { @@ -170,7 +173,7 @@ public abstract class BuildImageMojo extends AbstractPackagerMojo {
* @since 3.1.0
*/
@Parameter(property = "spring-boot.build-image.createdDate")
String createdDate;
@Nullable String createdDate;
/**
* Alias for {@link Image#applicationDirectory} to support configuration through
@ -178,7 +181,7 @@ public abstract class BuildImageMojo extends AbstractPackagerMojo { @@ -178,7 +181,7 @@ public abstract class BuildImageMojo extends AbstractPackagerMojo {
* @since 3.1.0
*/
@Parameter(property = "spring-boot.build-image.applicationDirectory")
String applicationDirectory;
@Nullable String applicationDirectory;
/**
* Alias for {@link Image#imagePlatform} to support configuration through command-line
@ -186,14 +189,14 @@ public abstract class BuildImageMojo extends AbstractPackagerMojo { @@ -186,14 +189,14 @@ public abstract class BuildImageMojo extends AbstractPackagerMojo {
* @since 3.4.0
*/
@Parameter(property = "spring-boot.build-image.imagePlatform")
String imagePlatform;
@Nullable String imagePlatform;
/**
* Docker configuration options.
* @since 2.4.0
*/
@Parameter
private Docker docker;
private @Nullable Docker docker;
/**
* The type of archive (which corresponds to how the dependencies are laid out inside
@ -202,14 +205,14 @@ public abstract class BuildImageMojo extends AbstractPackagerMojo { @@ -202,14 +205,14 @@ public abstract class BuildImageMojo extends AbstractPackagerMojo {
* @since 2.3.11
*/
@Parameter
private LayoutType layout;
private @Nullable LayoutType layout;
/**
* The loader implementation that should be used.
* @since 3.2.0
*/
@Parameter
private LoaderImplementation loaderImplementation;
private @Nullable LoaderImplementation loaderImplementation;
/**
* The layout factory that will be used to create the executable archive if no
@ -218,7 +221,7 @@ public abstract class BuildImageMojo extends AbstractPackagerMojo { @@ -218,7 +221,7 @@ public abstract class BuildImageMojo extends AbstractPackagerMojo {
* @since 2.3.11
*/
@Parameter
private LayoutFactory layoutFactory;
private @Nullable LayoutFactory layoutFactory;
protected BuildImageMojo(MavenProjectHelper projectHelper) {
super(projectHelper);
@ -230,12 +233,12 @@ public abstract class BuildImageMojo extends AbstractPackagerMojo { @@ -230,12 +233,12 @@ public abstract class BuildImageMojo extends AbstractPackagerMojo {
* is not provided
*/
@Override
protected LayoutType getLayout() {
protected @Nullable LayoutType getLayout() {
return this.layout;
}
@Override
protected LoaderImplementation getLoaderImplementation() {
protected @Nullable LoaderImplementation getLoaderImplementation() {
return this.loaderImplementation;
}
@ -246,7 +249,7 @@ public abstract class BuildImageMojo extends AbstractPackagerMojo { @@ -246,7 +249,7 @@ public abstract class BuildImageMojo extends AbstractPackagerMojo {
* parameter is not provided
*/
@Override
protected LayoutFactory getLayoutFactory() {
protected @Nullable LayoutFactory getLayoutFactory() {
return this.layoutFactory;
}
@ -340,7 +343,7 @@ public abstract class BuildImageMojo extends AbstractPackagerMojo { @@ -340,7 +343,7 @@ public abstract class BuildImageMojo extends AbstractPackagerMojo {
* Return the {@link File} to use to back up the original source.
* @return the file to use to back up the original source
*/
private File getBackupFile() {
private @Nullable File getBackupFile() {
// We can't use 'project.getAttachedArtifacts()' because package can be done in a
// forked lifecycle and will be null
if (this.classifier != null) {

16
build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/BuildInfoMojo.java

@ -33,6 +33,7 @@ import org.apache.maven.plugins.annotations.LifecyclePhase; @@ -33,6 +33,7 @@ import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.project.MavenProject;
import org.jspecify.annotations.Nullable;
import org.sonatype.plexus.build.incremental.BuildContext;
import org.springframework.boot.loader.tools.BuildPropertiesWriter;
@ -56,18 +57,21 @@ public class BuildInfoMojo extends AbstractMojo { @@ -56,18 +57,21 @@ public class BuildInfoMojo extends AbstractMojo {
* The Maven session.
*/
@Parameter(defaultValue = "${session}", readonly = true, required = true)
@SuppressWarnings("NullAway.Init")
private MavenSession session;
/**
* The Maven project.
*/
@Parameter(defaultValue = "${project}", readonly = true, required = true)
@SuppressWarnings("NullAway.Init")
private MavenProject project;
/**
* The location of the generated {@code build-info.properties} file.
*/
@Parameter(defaultValue = "${project.build.outputDirectory}/META-INF/build-info.properties")
@SuppressWarnings("NullAway.Init")
private File outputFile;
/**
@ -79,14 +83,14 @@ public class BuildInfoMojo extends AbstractMojo { @@ -79,14 +83,14 @@ public class BuildInfoMojo extends AbstractMojo {
* @since 2.2.0
*/
@Parameter(defaultValue = "${project.build.outputTimestamp}")
private String time;
private @Nullable String time;
/**
* Additional properties to store in the {@code build-info.properties} file. Each
* entry is prefixed by {@code build.} in the generated {@code build-info.properties}.
*/
@Parameter
private Map<String, String> additionalProperties;
private @Nullable Map<String, String> additionalProperties;
/**
* Properties that should be excluded {@code build-info.properties} file. Can be used
@ -95,7 +99,7 @@ public class BuildInfoMojo extends AbstractMojo { @@ -95,7 +99,7 @@ public class BuildInfoMojo extends AbstractMojo {
* {@code additionalProperties}.
*/
@Parameter
private List<String> excludeInfoProperties;
private @Nullable List<String> excludeInfoProperties;
/**
* Skip the execution.
@ -138,11 +142,11 @@ public class BuildInfoMojo extends AbstractMojo { @@ -138,11 +142,11 @@ public class BuildInfoMojo extends AbstractMojo {
return new ProjectDetails(group, artifact, version, name, time, additionalProperties);
}
private <T> T getIfNotExcluded(String name, T value) {
private <T> @Nullable T getIfNotExcluded(String name, @Nullable T value) {
return (this.excludeInfoProperties == null || !this.excludeInfoProperties.contains(name)) ? value : null;
}
private Map<String, String> applyExclusions(Map<String, String> source) {
private @Nullable Map<String, String> applyExclusions(@Nullable Map<String, String> source) {
if (source == null || this.excludeInfoProperties == null) {
return source;
}
@ -151,7 +155,7 @@ public class BuildInfoMojo extends AbstractMojo { @@ -151,7 +155,7 @@ public class BuildInfoMojo extends AbstractMojo {
return result;
}
private Instant getBuildTime() {
private @Nullable Instant getBuildTime() {
if (this.time == null || this.time.isEmpty()) {
Date startTime = this.session.getRequest().getStartTime();
return (startTime != null) ? startTime.toInstant() : Instant.now();

34
build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/CacheInfo.java

@ -16,6 +16,8 @@ @@ -16,6 +16,8 @@
package org.springframework.boot.maven;
import org.jspecify.annotations.Nullable;
import org.springframework.boot.buildpack.platform.build.Cache;
import org.springframework.util.Assert;
@ -27,7 +29,7 @@ import org.springframework.util.Assert; @@ -27,7 +29,7 @@ import org.springframework.util.Assert;
*/
public class CacheInfo {
private Cache cache;
private @Nullable Cache cache;
public CacheInfo() {
}
@ -38,24 +40,32 @@ public class CacheInfo { @@ -38,24 +40,32 @@ public class CacheInfo {
public void setVolume(VolumeCacheInfo info) {
Assert.state(this.cache == null, "Each image building cache can be configured only once");
this.cache = Cache.volume(info.getName());
String name = info.getName();
Assert.state(name != null, "'name' must not be null");
this.cache = Cache.volume(name);
}
public void setBind(BindCacheInfo info) {
Assert.state(this.cache == null, "Each image building cache can be configured only once");
this.cache = Cache.bind(info.getSource());
String source = info.getSource();
Assert.state(source != null, "'source' must not be null");
this.cache = Cache.bind(source);
}
Cache asCache() {
@Nullable Cache asCache() {
return this.cache;
}
static CacheInfo fromVolume(VolumeCacheInfo cacheInfo) {
return new CacheInfo(Cache.volume(cacheInfo.getName()));
String name = cacheInfo.getName();
Assert.state(name != null, "'name' must not be null");
return new CacheInfo(Cache.volume(name));
}
static CacheInfo fromBind(BindCacheInfo cacheInfo) {
return new CacheInfo(Cache.bind(cacheInfo.getSource()));
String source = cacheInfo.getSource();
Assert.state(source != null, "'source' must not be null");
return new CacheInfo(Cache.bind(source));
}
/**
@ -63,7 +73,7 @@ public class CacheInfo { @@ -63,7 +73,7 @@ public class CacheInfo {
*/
public static class VolumeCacheInfo {
private String name;
private @Nullable String name;
public VolumeCacheInfo() {
}
@ -72,11 +82,11 @@ public class CacheInfo { @@ -72,11 +82,11 @@ public class CacheInfo {
this.name = name;
}
public String getName() {
public @Nullable String getName() {
return this.name;
}
void setName(String name) {
void setName(@Nullable String name) {
this.name = name;
}
@ -87,7 +97,7 @@ public class CacheInfo { @@ -87,7 +97,7 @@ public class CacheInfo {
*/
public static class BindCacheInfo {
private String source;
private @Nullable String source;
public BindCacheInfo() {
}
@ -96,11 +106,11 @@ public class CacheInfo { @@ -96,11 +106,11 @@ public class CacheInfo {
this.source = name;
}
public String getSource() {
public @Nullable String getSource() {
return this.source;
}
void setSource(String source) {
void setSource(@Nullable String source) {
this.source = source;
}

6
build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/CommandLineBuilder.java

@ -23,6 +23,8 @@ import java.util.List; @@ -23,6 +23,8 @@ import java.util.List;
import java.util.Map;
import java.util.Objects;
import org.jspecify.annotations.Nullable;
/**
* Helper class to build the command-line arguments of a java process.
*
@ -53,7 +55,7 @@ final class CommandLineBuilder { @@ -53,7 +55,7 @@ final class CommandLineBuilder {
return this;
}
CommandLineBuilder withSystemProperties(Map<String, String> systemProperties) {
CommandLineBuilder withSystemProperties(@Nullable Map<String, String> systemProperties) {
if (systemProperties != null) {
systemProperties.entrySet()
.stream()
@ -93,7 +95,7 @@ final class CommandLineBuilder { @@ -93,7 +95,7 @@ final class CommandLineBuilder {
*/
private static final class SystemPropertyFormatter {
static String format(String key, String value) {
static String format(@Nullable String key, @Nullable String value) {
if (key == null) {
return "";
}

3
build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/CustomLayersProvider.java

@ -29,6 +29,7 @@ import javax.xml.validation.Schema; @@ -29,6 +29,7 @@ import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;
import org.jspecify.annotations.Nullable;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
@ -157,7 +158,7 @@ class CustomLayersProvider { @@ -157,7 +158,7 @@ class CustomLayersProvider {
return patterns;
}
private Element getChildElement(Element element, String tagName) {
private @Nullable Element getChildElement(Element element, String tagName) {
NodeList nodes = element.getElementsByTagName(tagName);
if (nodes.getLength() == 0) {
return null;

75
build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/Docker.java

@ -17,9 +17,11 @@ @@ -17,9 +17,11 @@
package org.springframework.boot.maven;
import org.apache.maven.plugin.logging.Log;
import org.jspecify.annotations.Nullable;
import org.springframework.boot.buildpack.platform.build.BuilderDockerConfiguration;
import org.springframework.boot.buildpack.platform.docker.configuration.DockerRegistryAuthentication;
import org.springframework.util.Assert;
/**
* Docker configuration options.
@ -30,29 +32,29 @@ import org.springframework.boot.buildpack.platform.docker.configuration.DockerRe @@ -30,29 +32,29 @@ import org.springframework.boot.buildpack.platform.docker.configuration.DockerRe
*/
public class Docker {
private String host;
private @Nullable String host;
private String context;
private @Nullable String context;
private boolean tlsVerify;
private String certPath;
private @Nullable String certPath;
private boolean bindHostToBuilder;
private DockerRegistry builderRegistry;
private @Nullable DockerRegistry builderRegistry;
private DockerRegistry publishRegistry;
private @Nullable DockerRegistry publishRegistry;
/**
* The host address of the Docker daemon.
* @return the Docker host
*/
public String getHost() {
public @Nullable String getHost() {
return this.host;
}
void setHost(String host) {
void setHost(@Nullable String host) {
this.host = host;
}
@ -60,11 +62,11 @@ public class Docker { @@ -60,11 +62,11 @@ public class Docker {
* The Docker context to use to retrieve host configuration.
* @return the Docker context
*/
public String getContext() {
public @Nullable String getContext() {
return this.context;
}
public void setContext(String context) {
public void setContext(@Nullable String context) {
this.context = context;
}
@ -85,11 +87,11 @@ public class Docker { @@ -85,11 +87,11 @@ public class Docker {
* Docker daemon.
* @return the TLS certificate path
*/
public String getCertPath() {
public @Nullable String getCertPath() {
return this.certPath;
}
void setCertPath(String certPath) {
void setCertPath(@Nullable String certPath) {
this.certPath = certPath;
}
@ -109,7 +111,7 @@ public class Docker { @@ -109,7 +111,7 @@ public class Docker {
* Configuration of the Docker registry where builder and run images are stored.
* @return the registry configuration
*/
DockerRegistry getBuilderRegistry() {
@Nullable DockerRegistry getBuilderRegistry() {
return this.builderRegistry;
}
@ -118,7 +120,7 @@ public class Docker { @@ -118,7 +120,7 @@ public class Docker {
* registry.
* @param builderRegistry the registry configuration
*/
void setBuilderRegistry(DockerRegistry builderRegistry) {
void setBuilderRegistry(@Nullable DockerRegistry builderRegistry) {
this.builderRegistry = builderRegistry;
}
@ -126,7 +128,7 @@ public class Docker { @@ -126,7 +128,7 @@ public class Docker {
* Configuration of the Docker registry where the generated image will be published.
* @return the registry configuration
*/
DockerRegistry getPublishRegistry() {
@Nullable DockerRegistry getPublishRegistry() {
return this.publishRegistry;
}
@ -135,7 +137,7 @@ public class Docker { @@ -135,7 +137,7 @@ public class Docker {
* registry.
* @param builderRegistry the registry configuration
*/
void setPublishRegistry(DockerRegistry builderRegistry) {
void setPublishRegistry(@Nullable DockerRegistry builderRegistry) {
this.publishRegistry = builderRegistry;
}
@ -189,17 +191,22 @@ public class Docker { @@ -189,17 +191,22 @@ public class Docker {
getRegistryAuthentication("publish", this.publishRegistry, authentication));
}
private DockerRegistryAuthentication getRegistryAuthentication(String type, DockerRegistry registry,
private DockerRegistryAuthentication getRegistryAuthentication(String type, @Nullable DockerRegistry registry,
DockerRegistryAuthentication fallback) {
if (registry == null || registry.isEmpty()) {
return fallback;
}
if (registry.hasTokenAuth() && !registry.hasUserAuth()) {
return DockerRegistryAuthentication.token(registry.getToken());
String token = registry.getToken();
Assert.state(token != null, "'token' must not be null");
return DockerRegistryAuthentication.token(token);
}
if (registry.hasUserAuth() && !registry.hasTokenAuth()) {
return DockerRegistryAuthentication.user(registry.getUsername(), registry.getPassword(), registry.getUrl(),
registry.getEmail());
String username = registry.getUsername();
String password = registry.getPassword();
Assert.state(username != null, "'username' must not be null");
Assert.state(password != null, "'password' must not be null");
return DockerRegistryAuthentication.user(username, password, registry.getUrl(), registry.getEmail());
}
throw new IllegalArgumentException("Invalid Docker " + type
+ " registry configuration, either token or username/password must be provided");
@ -210,15 +217,15 @@ public class Docker { @@ -210,15 +217,15 @@ public class Docker {
*/
public static class DockerRegistry {
private String username;
private @Nullable String username;
private String password;
private @Nullable String password;
private String url;
private @Nullable String url;
private String email;
private @Nullable String email;
private String token;
private @Nullable String token;
public DockerRegistry() {
}
@ -238,11 +245,11 @@ public class Docker { @@ -238,11 +245,11 @@ public class Docker {
* The username that will be used for user authentication to the registry.
* @return the username
*/
public String getUsername() {
public @Nullable String getUsername() {
return this.username;
}
void setUsername(String username) {
void setUsername(@Nullable String username) {
this.username = username;
}
@ -250,11 +257,11 @@ public class Docker { @@ -250,11 +257,11 @@ public class Docker {
* The password that will be used for user authentication to the registry.
* @return the password
*/
public String getPassword() {
public @Nullable String getPassword() {
return this.password;
}
void setPassword(String password) {
void setPassword(@Nullable String password) {
this.password = password;
}
@ -262,11 +269,11 @@ public class Docker { @@ -262,11 +269,11 @@ public class Docker {
* The email address that will be used for user authentication to the registry.
* @return the email address
*/
public String getEmail() {
public @Nullable String getEmail() {
return this.email;
}
void setEmail(String email) {
void setEmail(@Nullable String email) {
this.email = email;
}
@ -274,11 +281,11 @@ public class Docker { @@ -274,11 +281,11 @@ public class Docker {
* The URL of the registry.
* @return the registry URL
*/
String getUrl() {
@Nullable String getUrl() {
return this.url;
}
void setUrl(String url) {
void setUrl(@Nullable String url) {
this.url = url;
}
@ -286,11 +293,11 @@ public class Docker { @@ -286,11 +293,11 @@ public class Docker {
* The token that will be used for token authentication to the registry.
* @return the authentication token
*/
public String getToken() {
public @Nullable String getToken() {
return this.token;
}
void setToken(String token) {
void setToken(@Nullable String token) {
this.token = token;
}

8
build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/EnvVariables.java

@ -22,6 +22,8 @@ import java.util.LinkedHashMap; @@ -22,6 +22,8 @@ import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.jspecify.annotations.Nullable;
/**
* Utility class for working with Env variables.
*
@ -31,11 +33,11 @@ class EnvVariables { @@ -31,11 +33,11 @@ class EnvVariables {
private final Map<String, String> variables;
EnvVariables(Map<String, String> variables) {
EnvVariables(@Nullable Map<String, String> variables) {
this.variables = parseEnvVariables(variables);
}
private static Map<String, String> parseEnvVariables(Map<String, String> args) {
private static Map<String, String> parseEnvVariables(@Nullable Map<String, String> args) {
if (args == null || args.isEmpty()) {
return Collections.emptyMap();
}
@ -48,7 +50,7 @@ class EnvVariables { @@ -48,7 +50,7 @@ class EnvVariables {
return result;
}
private static String getValue(String value) {
private static String getValue(@Nullable String value) {
return (value != null) ? value : "";
}

9
build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/FilterableDependency.java

@ -17,6 +17,7 @@ @@ -17,6 +17,7 @@
package org.springframework.boot.maven;
import org.apache.maven.plugins.annotations.Parameter;
import org.jspecify.annotations.Nullable;
import org.springframework.util.Assert;
@ -33,19 +34,21 @@ public abstract class FilterableDependency { @@ -33,19 +34,21 @@ public abstract class FilterableDependency {
* The groupId of the artifact to exclude.
*/
@Parameter(required = true)
@SuppressWarnings("NullAway.Init")
private String groupId;
/**
* The artifactId of the artifact to exclude.
*/
@Parameter(required = true)
@SuppressWarnings("NullAway.Init")
private String artifactId;
/**
* The classifier of the artifact to exclude.
*/
@Parameter
private String classifier;
private @Nullable String classifier;
String getGroupId() {
return this.groupId;
@ -63,11 +66,11 @@ public abstract class FilterableDependency { @@ -63,11 +66,11 @@ public abstract class FilterableDependency {
this.artifactId = artifactId;
}
String getClassifier() {
@Nullable String getClassifier() {
return this.classifier;
}
void setClassifier(String classifier) {
void setClassifier(@Nullable String classifier) {
this.classifier = classifier;
}

99
build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/Image.java

@ -21,15 +21,18 @@ import java.util.Map; @@ -21,15 +21,18 @@ import java.util.Map;
import java.util.function.Function;
import org.apache.maven.artifact.Artifact;
import org.jspecify.annotations.Nullable;
import org.springframework.boot.buildpack.platform.build.BuildRequest;
import org.springframework.boot.buildpack.platform.build.BuildpackReference;
import org.springframework.boot.buildpack.platform.build.Cache;
import org.springframework.boot.buildpack.platform.build.PullPolicy;
import org.springframework.boot.buildpack.platform.docker.type.Binding;
import org.springframework.boot.buildpack.platform.docker.type.ImageName;
import org.springframework.boot.buildpack.platform.docker.type.ImageReference;
import org.springframework.boot.buildpack.platform.io.Owner;
import org.springframework.boot.buildpack.platform.io.TarArchive;
import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
@ -45,55 +48,55 @@ import org.springframework.util.StringUtils; @@ -45,55 +48,55 @@ import org.springframework.util.StringUtils;
*/
public class Image {
String name;
@Nullable String name;
String builder;
@Nullable String builder;
Boolean trustBuilder;
@Nullable Boolean trustBuilder;
String runImage;
@Nullable String runImage;
Map<String, String> env;
@Nullable Map<String, String> env;
Boolean cleanCache;
@Nullable Boolean cleanCache;
boolean verboseLogging;
PullPolicy pullPolicy;
@Nullable PullPolicy pullPolicy;
Boolean publish;
@Nullable Boolean publish;
List<String> buildpacks;
@Nullable List<String> buildpacks;
List<String> bindings;
@Nullable List<String> bindings;
String network;
@Nullable String network;
List<String> tags;
@Nullable List<String> tags;
CacheInfo buildWorkspace;
@Nullable CacheInfo buildWorkspace;
CacheInfo buildCache;
@Nullable CacheInfo buildCache;
CacheInfo launchCache;
@Nullable CacheInfo launchCache;
String createdDate;
@Nullable String createdDate;
String applicationDirectory;
@Nullable String applicationDirectory;
List<String> securityOptions;
@Nullable List<String> securityOptions;
String imagePlatform;
@Nullable String imagePlatform;
/**
* The name of the created image.
* @return the image name
*/
public String getName() {
public @Nullable String getName() {
return this.name;
}
void setName(String name) {
void setName(@Nullable String name) {
this.name = name;
}
@ -101,11 +104,11 @@ public class Image { @@ -101,11 +104,11 @@ public class Image {
* The name of the builder image to use to create the image.
* @return the builder image name
*/
public String getBuilder() {
public @Nullable String getBuilder() {
return this.builder;
}
void setBuilder(String builder) {
void setBuilder(@Nullable String builder) {
this.builder = builder;
}
@ -113,11 +116,11 @@ public class Image { @@ -113,11 +116,11 @@ public class Image {
* If the builder should be treated as trusted.
* @return {@code true} if the builder should be treated as trusted
*/
public Boolean getTrustBuilder() {
public @Nullable Boolean getTrustBuilder() {
return this.trustBuilder;
}
void setTrustBuilder(Boolean trustBuilder) {
void setTrustBuilder(@Nullable Boolean trustBuilder) {
this.trustBuilder = trustBuilder;
}
@ -125,11 +128,11 @@ public class Image { @@ -125,11 +128,11 @@ public class Image {
* The name of the run image to use to create the image.
* @return the builder image name
*/
public String getRunImage() {
public @Nullable String getRunImage() {
return this.runImage;
}
void setRunImage(String runImage) {
void setRunImage(@Nullable String runImage) {
this.runImage = runImage;
}
@ -137,7 +140,7 @@ public class Image { @@ -137,7 +140,7 @@ public class Image {
* Environment properties that should be passed to the builder.
* @return the environment properties
*/
public Map<String, String> getEnv() {
public @Nullable Map<String, String> getEnv() {
return this.env;
}
@ -145,11 +148,11 @@ public class Image { @@ -145,11 +148,11 @@ public class Image {
* If the cache should be cleaned before building.
* @return {@code true} if the cache should be cleaned
*/
public Boolean getCleanCache() {
public @Nullable Boolean getCleanCache() {
return this.cleanCache;
}
void setCleanCache(Boolean cleanCache) {
void setCleanCache(@Nullable Boolean cleanCache) {
this.cleanCache = cleanCache;
}
@ -165,11 +168,11 @@ public class Image { @@ -165,11 +168,11 @@ public class Image {
* If images should be pulled from a remote repository during image build.
* @return the pull policy
*/
public PullPolicy getPullPolicy() {
public @Nullable PullPolicy getPullPolicy() {
return this.pullPolicy;
}
void setPullPolicy(PullPolicy pullPolicy) {
void setPullPolicy(@Nullable PullPolicy pullPolicy) {
this.pullPolicy = pullPolicy;
}
@ -177,11 +180,11 @@ public class Image { @@ -177,11 +180,11 @@ public class Image {
* If the built image should be pushed to a registry.
* @return {@code true} if the image should be published
*/
public Boolean getPublish() {
public @Nullable Boolean getPublish() {
return this.publish;
}
void setPublish(Boolean publish) {
void setPublish(@Nullable Boolean publish) {
this.publish = publish;
}
@ -189,11 +192,11 @@ public class Image { @@ -189,11 +192,11 @@ public class Image {
* Returns the network the build container will connect to.
* @return the network
*/
public String getNetwork() {
public @Nullable String getNetwork() {
return this.network;
}
public void setNetwork(String network) {
public void setNetwork(@Nullable String network) {
this.network = network;
}
@ -201,11 +204,11 @@ public class Image { @@ -201,11 +204,11 @@ public class Image {
* Returns the created date for the image.
* @return the created date
*/
public String getCreatedDate() {
public @Nullable String getCreatedDate() {
return this.createdDate;
}
public void setCreatedDate(String createdDate) {
public void setCreatedDate(@Nullable String createdDate) {
this.createdDate = createdDate;
}
@ -213,11 +216,11 @@ public class Image { @@ -213,11 +216,11 @@ public class Image {
* Returns the application content directory for the image.
* @return the application directory
*/
public String getApplicationDirectory() {
public @Nullable String getApplicationDirectory() {
return this.applicationDirectory;
}
public void setApplicationDirectory(String applicationDirectory) {
public void setApplicationDirectory(@Nullable String applicationDirectory) {
this.applicationDirectory = applicationDirectory;
}
@ -227,11 +230,11 @@ public class Image { @@ -227,11 +230,11 @@ public class Image {
* operating system and architecture.
* @return the image platform
*/
public String getImagePlatform() {
public @Nullable String getImagePlatform() {
return this.imagePlatform;
}
public void setImagePlatform(String imagePlatform) {
public void setImagePlatform(@Nullable String imagePlatform) {
this.imagePlatform = imagePlatform;
}
@ -281,13 +284,19 @@ public class Image { @@ -281,13 +284,19 @@ public class Image {
request = request.withTags(this.tags.stream().map(ImageReference::of).toList());
}
if (this.buildWorkspace != null) {
request = request.withBuildWorkspace(this.buildWorkspace.asCache());
Cache cache = this.buildWorkspace.asCache();
Assert.state(cache != null, "'cache' must not be null");
request = request.withBuildWorkspace(cache);
}
if (this.buildCache != null) {
request = request.withBuildCache(this.buildCache.asCache());
Cache cache = this.buildCache.asCache();
Assert.state(cache != null, "'cache' must not be null");
request = request.withBuildCache(cache);
}
if (this.launchCache != null) {
request = request.withLaunchCache(this.launchCache.asCache());
Cache cache = this.launchCache.asCache();
Assert.state(cache != null, "'cache' must not be null");
request = request.withLaunchCache(cache);
}
if (StringUtils.hasText(this.createdDate)) {
request = request.withCreatedDate(this.createdDate);

18
build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/JavaCompilerPluginConfiguration.java

@ -21,6 +21,9 @@ import java.util.Arrays; @@ -21,6 +21,9 @@ import java.util.Arrays;
import org.apache.maven.model.Plugin;
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.util.xml.Xpp3Dom;
import org.jspecify.annotations.Nullable;
import org.springframework.lang.Contract;
/**
* Provides access to the Maven Java Compiler plugin configuration.
@ -35,7 +38,7 @@ class JavaCompilerPluginConfiguration { @@ -35,7 +38,7 @@ class JavaCompilerPluginConfiguration {
this.project = project;
}
String getSourceMajorVersion() {
@Nullable String getSourceMajorVersion() {
String version = getConfigurationValue("source");
if (version == null) {
@ -45,7 +48,7 @@ class JavaCompilerPluginConfiguration { @@ -45,7 +48,7 @@ class JavaCompilerPluginConfiguration {
return majorVersionFor(version);
}
String getTargetMajorVersion() {
@Nullable String getTargetMajorVersion() {
String version = getConfigurationValue("target");
if (version == null) {
@ -55,7 +58,7 @@ class JavaCompilerPluginConfiguration { @@ -55,7 +58,7 @@ class JavaCompilerPluginConfiguration {
return majorVersionFor(version);
}
String getReleaseVersion() {
@Nullable String getReleaseVersion() {
String version = getConfigurationValue("release");
if (version == null) {
@ -65,7 +68,7 @@ class JavaCompilerPluginConfiguration { @@ -65,7 +68,7 @@ class JavaCompilerPluginConfiguration {
return majorVersionFor(version);
}
private String getConfigurationValue(String propertyName) {
private @Nullable String getConfigurationValue(String propertyName) {
Plugin plugin = this.project.getPlugin("org.apache.maven.plugins:maven-compiler-plugin");
if (plugin != null) {
Object pluginConfiguration = plugin.getConfiguration();
@ -76,14 +79,14 @@ class JavaCompilerPluginConfiguration { @@ -76,14 +79,14 @@ class JavaCompilerPluginConfiguration {
return null;
}
private String getPropertyValue(String propertyName) {
private @Nullable String getPropertyValue(String propertyName) {
if (this.project.getProperties().containsKey(propertyName)) {
return this.project.getProperties().get(propertyName).toString();
}
return null;
}
private String getNodeValue(Xpp3Dom dom, String... childNames) {
private @Nullable String getNodeValue(Xpp3Dom dom, String... childNames) {
Xpp3Dom childNode = dom.getChild(childNames[0]);
if (childNode == null) {
@ -97,7 +100,8 @@ class JavaCompilerPluginConfiguration { @@ -97,7 +100,8 @@ class JavaCompilerPluginConfiguration {
return childNode.getValue();
}
private String majorVersionFor(String version) {
@Contract("!null -> !null")
private @Nullable String majorVersionFor(@Nullable String version) {
if (version != null && version.startsWith("1.")) {
return version.substring("1.".length());
}

5
build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/JavaProcessExecutor.java

@ -26,6 +26,7 @@ import org.apache.maven.execution.MavenSession; @@ -26,6 +26,7 @@ import org.apache.maven.execution.MavenSession;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.toolchain.Toolchain;
import org.apache.maven.toolchain.ToolchainManager;
import org.jspecify.annotations.Nullable;
import org.springframework.boot.loader.tools.JavaExecutable;
import org.springframework.boot.loader.tools.RunProcess;
@ -43,14 +44,14 @@ class JavaProcessExecutor { @@ -43,14 +44,14 @@ class JavaProcessExecutor {
private final ToolchainManager toolchainManager;
private final Consumer<RunProcess> runProcessCustomizer;
private final @Nullable Consumer<RunProcess> runProcessCustomizer;
JavaProcessExecutor(MavenSession mavenSession, ToolchainManager toolchainManager) {
this(mavenSession, toolchainManager, null);
}
private JavaProcessExecutor(MavenSession mavenSession, ToolchainManager toolchainManager,
Consumer<RunProcess> runProcessCustomizer) {
@Nullable Consumer<RunProcess> runProcessCustomizer) {
this.mavenSession = mavenSession;
this.toolchainManager = toolchainManager;
this.runProcessCustomizer = runProcessCustomizer;

8
build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/Layers.java

@ -18,6 +18,8 @@ package org.springframework.boot.maven; @@ -18,6 +18,8 @@ package org.springframework.boot.maven;
import java.io.File;
import org.jspecify.annotations.Nullable;
/**
* Layer configuration options.
*
@ -28,7 +30,7 @@ public class Layers { @@ -28,7 +30,7 @@ public class Layers {
private boolean enabled = true;
private File configuration;
private @Nullable File configuration;
/**
* Whether a {@code layers.idx} file should be added to the jar.
@ -44,11 +46,11 @@ public class Layers { @@ -44,11 +46,11 @@ public class Layers {
* {@code snapshot-dependencies} and {@code dependencies}.
* @return the layers configuration file
*/
public File getConfiguration() {
public @Nullable File getConfiguration() {
return this.configuration;
}
public void setConfiguration(File configuration) {
public void setConfiguration(@Nullable File configuration) {
this.configuration = configuration;
}

10
build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/MavenBuildOutputTimestamp.java

@ -22,6 +22,8 @@ import java.time.OffsetDateTime; @@ -22,6 +22,8 @@ import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeParseException;
import org.jspecify.annotations.Nullable;
import org.springframework.util.StringUtils;
/**
@ -42,13 +44,13 @@ class MavenBuildOutputTimestamp { @@ -42,13 +44,13 @@ class MavenBuildOutputTimestamp {
private static final Instant DATE_MAX = Instant.parse("2099-12-31T23:59:59Z");
private final String timestamp;
private final @Nullable String timestamp;
/**
* Creates a new {@link MavenBuildOutputTimestamp}.
* @param timestamp timestamp or {@code null}
*/
MavenBuildOutputTimestamp(String timestamp) {
MavenBuildOutputTimestamp(@Nullable String timestamp) {
this.timestamp = timestamp;
}
@ -59,7 +61,7 @@ class MavenBuildOutputTimestamp { @@ -59,7 +61,7 @@ class MavenBuildOutputTimestamp {
* integer, or it's not within the valid range 1980-01-01T00:00:02Z to
* 2099-12-31T23:59:59Z
*/
FileTime toFileTime() {
@Nullable FileTime toFileTime() {
Instant instant = toInstant();
if (instant == null) {
return null;
@ -74,7 +76,7 @@ class MavenBuildOutputTimestamp { @@ -74,7 +76,7 @@ class MavenBuildOutputTimestamp {
* integer, or it's not within the valid range 1980-01-01T00:00:02Z to
* 2099-12-31T23:59:59Z
*/
Instant toInstant() {
@Nullable Instant toInstant() {
if (!StringUtils.hasLength(this.timestamp)) {
return null;
}

9
build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/ProcessAotMojo.java

@ -28,6 +28,7 @@ import org.apache.maven.plugins.annotations.Mojo; @@ -28,6 +28,7 @@ import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.plugins.annotations.ResolutionScope;
import org.apache.maven.toolchain.ToolchainManager;
import org.jspecify.annotations.Nullable;
import org.springframework.util.ObjectUtils;
@ -50,24 +51,28 @@ public class ProcessAotMojo extends AbstractAotMojo { @@ -50,24 +51,28 @@ public class ProcessAotMojo extends AbstractAotMojo {
* the archive.
*/
@Parameter(defaultValue = "${project.build.outputDirectory}", required = true)
@SuppressWarnings("NullAway.Init")
private File classesDirectory;
/**
* Directory containing the generated sources.
*/
@Parameter(defaultValue = "${project.build.directory}/spring-aot/main/sources", required = true)
@SuppressWarnings("NullAway.Init")
private File generatedSources;
/**
* Directory containing the generated resources.
*/
@Parameter(defaultValue = "${project.build.directory}/spring-aot/main/resources", required = true)
@SuppressWarnings("NullAway.Init")
private File generatedResources;
/**
* Directory containing the generated classes.
*/
@Parameter(defaultValue = "${project.build.directory}/spring-aot/main/classes", required = true)
@SuppressWarnings("NullAway.Init")
private File generatedClasses;
/**
@ -75,18 +80,20 @@ public class ProcessAotMojo extends AbstractAotMojo { @@ -75,18 +80,20 @@ public class ProcessAotMojo extends AbstractAotMojo {
* the first compiled class found that contains a 'main' method will be used.
*/
@Parameter(property = "spring-boot.aot.main-class")
private String mainClass;
private @Nullable String mainClass;
/**
* Application arguments that should be taken into account for AOT processing.
*/
@Parameter
@SuppressWarnings("NullAway") // maven-maven-plugin can't handle annotated arrays
private String[] arguments;
/**
* Spring profiles to take into account for AOT processing.
*/
@Parameter
@SuppressWarnings("NullAway") // maven-maven-plugin can't handle annotated arrays
private String[] profiles;
@Inject

6
build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/ProcessTestAotMojo.java

@ -71,6 +71,7 @@ public class ProcessTestAotMojo extends AbstractAotMojo { @@ -71,6 +71,7 @@ public class ProcessTestAotMojo extends AbstractAotMojo {
* the archive.
*/
@Parameter(defaultValue = "${project.build.testOutputDirectory}", required = true)
@SuppressWarnings("NullAway.Init")
private File testClassesDirectory;
/**
@ -78,30 +79,35 @@ public class ProcessTestAotMojo extends AbstractAotMojo { @@ -78,30 +79,35 @@ public class ProcessTestAotMojo extends AbstractAotMojo {
* tests.
*/
@Parameter(defaultValue = "${project.build.outputDirectory}", required = true)
@SuppressWarnings("NullAway.Init")
private File classesDirectory;
/**
* Directory containing the generated sources.
*/
@Parameter(defaultValue = "${project.build.directory}/spring-aot/test/sources", required = true)
@SuppressWarnings("NullAway.Init")
private File generatedSources;
/**
* Directory containing the generated test resources.
*/
@Parameter(defaultValue = "${project.build.directory}/spring-aot/test/resources", required = true)
@SuppressWarnings("NullAway.Init")
private File generatedResources;
/**
* Directory containing the generated test classes.
*/
@Parameter(defaultValue = "${project.build.directory}/spring-aot/test/classes", required = true)
@SuppressWarnings("NullAway.Init")
private File generatedTestClasses;
/**
* Directory containing the generated test classes.
*/
@Parameter(defaultValue = "${project.build.directory}/spring-aot/main/classes", required = true)
@SuppressWarnings("NullAway.Init")
private File generatedClasses;
private final RepositorySystem repositorySystem;

7
build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/PropertiesMergingResourceTransformer.java

@ -25,6 +25,7 @@ import java.util.jar.JarOutputStream; @@ -25,6 +25,7 @@ import java.util.jar.JarOutputStream;
import org.apache.maven.plugins.shade.relocation.Relocator;
import org.apache.maven.plugins.shade.resource.ReproducibleResourceTransformer;
import org.jspecify.annotations.Nullable;
/**
* Extension for the <a href="https://maven.apache.org/plugins/maven-shade-plugin/">Maven
@ -38,7 +39,7 @@ import org.apache.maven.plugins.shade.resource.ReproducibleResourceTransformer; @@ -38,7 +39,7 @@ import org.apache.maven.plugins.shade.resource.ReproducibleResourceTransformer;
public class PropertiesMergingResourceTransformer implements ReproducibleResourceTransformer {
// Set this in pom configuration with <resource>...</resource>
private String resource;
private @Nullable String resource;
private final Properties data = new Properties();
@ -95,11 +96,11 @@ public class PropertiesMergingResourceTransformer implements ReproducibleResourc @@ -95,11 +96,11 @@ public class PropertiesMergingResourceTransformer implements ReproducibleResourc
this.data.clear();
}
public String getResource() {
public @Nullable String getResource() {
return this.resource;
}
public void setResource(String resource) {
public void setResource(@Nullable String resource) {
this.resource = resource;
}

35
build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/RepackageMojo.java

@ -34,6 +34,7 @@ import org.apache.maven.plugins.annotations.Mojo; @@ -34,6 +34,7 @@ import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.plugins.annotations.ResolutionScope;
import org.apache.maven.project.MavenProjectHelper;
import org.jspecify.annotations.Nullable;
import org.springframework.boot.loader.tools.DefaultLaunchScript;
import org.springframework.boot.loader.tools.LaunchScript;
@ -41,6 +42,7 @@ import org.springframework.boot.loader.tools.LayoutFactory; @@ -41,6 +42,7 @@ import org.springframework.boot.loader.tools.LayoutFactory;
import org.springframework.boot.loader.tools.Libraries;
import org.springframework.boot.loader.tools.LoaderImplementation;
import org.springframework.boot.loader.tools.Repackager;
import org.springframework.lang.Contract;
import org.springframework.util.StringUtils;
/**
@ -67,13 +69,15 @@ public class RepackageMojo extends AbstractPackagerMojo { @@ -67,13 +69,15 @@ public class RepackageMojo extends AbstractPackagerMojo {
* @since 1.0.0
*/
@Parameter(defaultValue = "${project.build.directory}", required = true)
@SuppressWarnings("NullAway.Init")
private File outputDirectory;
/**
* Name of the generated archive.
* @since 1.0.0
*/
@Parameter(defaultValue = "${project.build.finalName}", readonly = true)
@Parameter(defaultValue = "${project.build.finalName}", readonly = true, required = true)
@SuppressWarnings("NullAway.Init")
private String finalName;
/**
@ -96,7 +100,7 @@ public class RepackageMojo extends AbstractPackagerMojo { @@ -96,7 +100,7 @@ public class RepackageMojo extends AbstractPackagerMojo {
* @since 1.0.0
*/
@Parameter
private String classifier;
private @Nullable String classifier;
/**
* Attach the repackaged archive to be installed into your local Maven repository or
@ -117,7 +121,7 @@ public class RepackageMojo extends AbstractPackagerMojo { @@ -117,7 +121,7 @@ public class RepackageMojo extends AbstractPackagerMojo {
* @since 1.1.0
*/
@Parameter
private List<Dependency> requiresUnpack;
private @Nullable List<Dependency> requiresUnpack;
/**
* Make a fully executable jar for *nix machines by prepending a launch script to the
@ -139,14 +143,14 @@ public class RepackageMojo extends AbstractPackagerMojo { @@ -139,14 +143,14 @@ public class RepackageMojo extends AbstractPackagerMojo {
* @since 1.3.0
*/
@Parameter
private File embeddedLaunchScript;
private @Nullable File embeddedLaunchScript;
/**
* Properties that should be expanded in the embedded launch script.
* @since 1.3.0
*/
@Parameter
private Properties embeddedLaunchScriptProperties;
private @Nullable Properties embeddedLaunchScriptProperties;
/**
* Timestamp for reproducible output archive entries, either formatted as ISO 8601
@ -155,7 +159,7 @@ public class RepackageMojo extends AbstractPackagerMojo { @@ -155,7 +159,7 @@ public class RepackageMojo extends AbstractPackagerMojo {
* @since 2.3.0
*/
@Parameter(defaultValue = "${project.build.outputTimestamp}")
private String outputTimestamp;
private @Nullable String outputTimestamp;
/**
* The type of archive (which corresponds to how the dependencies are laid out inside
@ -164,14 +168,14 @@ public class RepackageMojo extends AbstractPackagerMojo { @@ -164,14 +168,14 @@ public class RepackageMojo extends AbstractPackagerMojo {
* @since 1.0.0
*/
@Parameter(property = "spring-boot.repackage.layout")
private LayoutType layout;
private @Nullable LayoutType layout;
/**
* The loader implementation that should be used.
* @since 3.2.0
*/
@Parameter
private LoaderImplementation loaderImplementation;
private @Nullable LoaderImplementation loaderImplementation;
/**
* The layout factory that will be used to create the executable archive if no
@ -180,7 +184,7 @@ public class RepackageMojo extends AbstractPackagerMojo { @@ -180,7 +184,7 @@ public class RepackageMojo extends AbstractPackagerMojo {
* @since 1.5.0
*/
@Parameter
private LayoutFactory layoutFactory;
private @Nullable LayoutFactory layoutFactory;
@Inject
public RepackageMojo(MavenProjectHelper projectHelper) {
@ -193,12 +197,12 @@ public class RepackageMojo extends AbstractPackagerMojo { @@ -193,12 +197,12 @@ public class RepackageMojo extends AbstractPackagerMojo {
* is not provided
*/
@Override
protected LayoutType getLayout() {
protected @Nullable LayoutType getLayout() {
return this.layout;
}
@Override
protected LoaderImplementation getLoaderImplementation() {
protected @Nullable LoaderImplementation getLoaderImplementation() {
return this.loaderImplementation;
}
@ -209,7 +213,7 @@ public class RepackageMojo extends AbstractPackagerMojo { @@ -209,7 +213,7 @@ public class RepackageMojo extends AbstractPackagerMojo {
* parameter is not provided
*/
@Override
protected LayoutFactory getLayoutFactory() {
protected @Nullable LayoutFactory getLayoutFactory() {
return this.layoutFactory;
}
@ -245,7 +249,7 @@ public class RepackageMojo extends AbstractPackagerMojo { @@ -245,7 +249,7 @@ public class RepackageMojo extends AbstractPackagerMojo {
updateArtifact(source, target, repackager.getBackupFile());
}
private FileTime parseOutputTimestamp() throws MojoExecutionException {
private @Nullable FileTime parseOutputTimestamp() throws MojoExecutionException {
try {
return new MavenBuildOutputTimestamp(this.outputTimestamp).toFileTime();
}
@ -258,7 +262,7 @@ public class RepackageMojo extends AbstractPackagerMojo { @@ -258,7 +262,7 @@ public class RepackageMojo extends AbstractPackagerMojo {
return getConfiguredPackager(() -> new Repackager(source));
}
private LaunchScript getLaunchScript() throws IOException {
private @Nullable LaunchScript getLaunchScript() throws IOException {
if (this.executable || this.embeddedLaunchScript != null) {
return new DefaultLaunchScript(this.embeddedLaunchScript, buildLaunchScriptProperties());
}
@ -277,7 +281,8 @@ public class RepackageMojo extends AbstractPackagerMojo { @@ -277,7 +281,8 @@ public class RepackageMojo extends AbstractPackagerMojo {
return properties;
}
private String removeLineBreaks(String description) {
@Contract("!null -> !null")
private @Nullable String removeLineBreaks(@Nullable String description) {
return (description != null) ? WHITE_SPACE_PATTERN.matcher(description).replaceAll(" ") : null;
}

5
build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/RunArguments.java

@ -22,6 +22,7 @@ import java.util.LinkedList; @@ -22,6 +22,7 @@ import java.util.LinkedList;
import java.util.Objects;
import org.codehaus.plexus.util.cli.CommandLineUtils;
import org.jspecify.annotations.Nullable;
/**
* Parse and expose arguments specified in a single string.
@ -34,7 +35,7 @@ class RunArguments { @@ -34,7 +35,7 @@ class RunArguments {
private final Deque<String> args = new LinkedList<>();
RunArguments(String arguments) {
RunArguments(@Nullable String arguments) {
this(parseArgs(arguments));
}
@ -52,7 +53,7 @@ class RunArguments { @@ -52,7 +53,7 @@ class RunArguments {
return this.args.toArray(new String[0]);
}
private static String[] parseArgs(String arguments) {
private static String[] parseArgs(@Nullable String arguments) {
if (arguments == null || arguments.trim().isEmpty()) {
return NO_ARGS;
}

2
build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/RunMojo.java

@ -59,7 +59,7 @@ public class RunMojo extends AbstractRunMojo { @@ -59,7 +59,7 @@ public class RunMojo extends AbstractRunMojo {
* @since 1.3.0
*/
@Parameter(property = "spring-boot.run.useTestClasspath", defaultValue = "false")
private Boolean useTestClasspath;
private boolean useTestClasspath;
@Inject
public RunMojo(ToolchainManager toolchainManager) {

11
build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/StartMojo.java

@ -36,6 +36,7 @@ import org.apache.maven.plugins.annotations.Mojo; @@ -36,6 +36,7 @@ import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.plugins.annotations.ResolutionScope;
import org.apache.maven.toolchain.ToolchainManager;
import org.jspecify.annotations.Nullable;
import org.springframework.boot.loader.tools.RunProcess;
@ -62,6 +63,7 @@ public class StartMojo extends AbstractRunMojo { @@ -62,6 +63,7 @@ public class StartMojo extends AbstractRunMojo {
* spring application.
*/
@Parameter(defaultValue = SpringApplicationAdminClient.DEFAULT_OBJECT_NAME)
@SuppressWarnings("NullAway.Init")
private String jmxName;
/**
@ -91,7 +93,7 @@ public class StartMojo extends AbstractRunMojo { @@ -91,7 +93,7 @@ public class StartMojo extends AbstractRunMojo {
* Flag to include the test classpath when running.
*/
@Parameter(property = "spring-boot.run.useTestClasspath", defaultValue = "false")
private Boolean useTestClasspath;
private boolean useTestClasspath;
@Inject
public StartMojo(ToolchainManager toolchainManager) {
@ -154,6 +156,7 @@ public class StartMojo extends AbstractRunMojo { @@ -154,6 +156,7 @@ public class StartMojo extends AbstractRunMojo {
}
}
@SuppressWarnings("NullAway") // Lambda isn't detected with the correct nullability
private void doWaitForSpringApplication(MBeanServerConnection connection)
throws MojoExecutionException, MojoFailureException {
final SpringApplicationAdminClient client = new SpringApplicationAdminClient(connection, this.jmxName);
@ -178,7 +181,7 @@ public class StartMojo extends AbstractRunMojo { @@ -178,7 +181,7 @@ public class StartMojo extends AbstractRunMojo {
* @return the result
* @throws Exception in case of execution errors
*/
public <T> T execute(long wait, int maxAttempts, Callable<T> callback) throws Exception {
public <T> T execute(long wait, int maxAttempts, Callable<@Nullable T> callback) throws Exception {
getLog().debug("Waiting for spring application to start...");
for (int i = 0; i < maxAttempts; i++) {
T result = callback.call();
@ -206,7 +209,7 @@ public class StartMojo extends AbstractRunMojo { @@ -206,7 +209,7 @@ public class StartMojo extends AbstractRunMojo {
return this.useTestClasspath;
}
private class CreateJmxConnector implements Callable<JMXConnector> {
private class CreateJmxConnector implements Callable<@Nullable JMXConnector> {
private final int port;
@ -215,7 +218,7 @@ public class StartMojo extends AbstractRunMojo { @@ -215,7 +218,7 @@ public class StartMojo extends AbstractRunMojo {
}
@Override
public JMXConnector call() throws Exception {
public @Nullable JMXConnector call() throws Exception {
try {
return SpringApplicationAdminClient.connect(this.port);
}

2
build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/StopMojo.java

@ -45,6 +45,7 @@ public class StopMojo extends AbstractMojo { @@ -45,6 +45,7 @@ public class StopMojo extends AbstractMojo {
* @since 1.4.1
*/
@Parameter(defaultValue = "${project}", readonly = true, required = true)
@SuppressWarnings("NullAway.Init")
private MavenProject project;
/**
@ -52,6 +53,7 @@ public class StopMojo extends AbstractMojo { @@ -52,6 +53,7 @@ public class StopMojo extends AbstractMojo {
* application.
*/
@Parameter(defaultValue = SpringApplicationAdminClient.DEFAULT_OBJECT_NAME)
@SuppressWarnings("NullAway.Init")
private String jmxName;
/**

1
build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/TestRunMojo.java

@ -62,6 +62,7 @@ public class TestRunMojo extends AbstractRunMojo { @@ -62,6 +62,7 @@ public class TestRunMojo extends AbstractRunMojo {
* the application.
*/
@Parameter(defaultValue = "${project.build.testOutputDirectory}", required = true)
@SuppressWarnings("NullAway.Init")
private File testClassesDirectory;
@Inject

4
build-plugin/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/VersionExtractor.java

@ -24,6 +24,8 @@ import java.net.URLConnection; @@ -24,6 +24,8 @@ import java.net.URLConnection;
import java.util.jar.Attributes;
import java.util.jar.JarFile;
import org.jspecify.annotations.Nullable;
/**
* Extracts version information for a Class.
*
@ -40,7 +42,7 @@ final class VersionExtractor { @@ -40,7 +42,7 @@ final class VersionExtractor {
* @param cls the Class to retrieve the version for
* @return the version, or {@code null} if a version can not be extracted
*/
static String forClass(Class<?> cls) {
static @Nullable String forClass(Class<?> cls) {
String implementationVersion = cls.getPackage().getImplementationVersion();
if (implementationVersion != null) {
return implementationVersion;

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

@ -17,4 +17,7 @@ @@ -17,4 +17,7 @@
/**
* Maven plugin for Spring Boot.
*/
@NullMarked
package org.springframework.boot.maven;
import org.jspecify.annotations.NullMarked;

Loading…
Cancel
Save