From a302238e21ff4ee366a1a930c04d5b6698a0a777 Mon Sep 17 00:00:00 2001 From: Scott Frederick Date: Thu, 7 Jan 2021 15:59:02 -0600 Subject: [PATCH] Remove layout parameters from build-image Maven goal This commit removes the `layout` and `layoutFactory` parameters from the `build-image` goal in the Maven plugin while retaining them for the `repackage` goal. The `build-image` goal currently only supports jar archives, so allowing other layout types to be configured for the goal could cause confusion. Fixes gh-24105 --- .../boot/maven/AbstractPackagerMojo.java | 48 ++++++++++--------- .../boot/maven/RepackageMojo.java | 43 ++++++++++++++++- 2 files changed, 67 insertions(+), 24 deletions(-) diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/AbstractPackagerMojo.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/AbstractPackagerMojo.java index 7920c1e3abc0..33638a39e865 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/AbstractPackagerMojo.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/AbstractPackagerMojo.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2020 the original author or authors. + * Copyright 2012-2021 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -53,6 +53,7 @@ * Abstract base class for classes that work with an {@link Packager}. * * @author Phillip Webb + * @author Scott Frederick * @since 2.3.0 */ public abstract class AbstractPackagerMojo extends AbstractDependencyFilterMojo { @@ -81,24 +82,6 @@ public abstract class AbstractPackagerMojo extends AbstractDependencyFilterMojo @Parameter private String mainClass; - /** - * The type of archive (which corresponds to how the dependencies are laid out inside - * it). Possible values are {@code JAR}, {@code WAR}, {@code ZIP}, {@code DIR}, - * {@code NONE}. Defaults to a guess based on the archive type. - * @since 1.0.0 - */ - @Parameter(property = "spring-boot.repackage.layout") - private LayoutType layout; - - /** - * The layout factory that will be used to create the executable archive if no - * explicit layout is set. Alternative layouts implementations can be provided by 3rd - * parties. - * @since 1.5.0 - */ - @Parameter - private LayoutFactory layoutFactory; - /** * Exclude Spring Boot devtools from the repackaged archive. * @since 1.3.0 @@ -121,6 +104,24 @@ public abstract class AbstractPackagerMojo extends AbstractDependencyFilterMojo @Parameter private Layers layers; + /** + * Return the type of archive that should be packaged by this MOJO. + * @return {@code null}, indicating a layout type will be chosen based on the original + * archive type + */ + protected LayoutType getLayout() { + return null; + } + + /** + * Return the layout factory that will be used to determine the {@link LayoutType} if + * no explicit layout is set. + * @return {@code null}, indicating a default layout factory will be chosen + */ + protected LayoutFactory getLayoutFactory() { + return null; + } + /** * Return a {@link Packager} configured for this MOJO. * @param

the packager type @@ -129,12 +130,13 @@ public abstract class AbstractPackagerMojo extends AbstractDependencyFilterMojo */ protected

P getConfiguredPackager(Supplier

supplier) { P packager = supplier.get(); - packager.setLayoutFactory(this.layoutFactory); + packager.setLayoutFactory(getLayoutFactory()); packager.addMainClassTimeoutWarningListener(new LoggingMainClassTimeoutWarningListener(this::getLog)); packager.setMainClass(this.mainClass); - if (this.layout != null) { - getLog().info("Layout: " + this.layout); - packager.setLayout(this.layout.layout()); + LayoutType layout = getLayout(); + if (layout != null) { + getLog().info("Layout: " + layout); + packager.setLayout(layout.layout()); } if (this.layers != null && this.layers.isEnabled()) { packager.setLayers((this.layers.getConfiguration() != null) diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/RepackageMojo.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/RepackageMojo.java index 2223c381d637..8d78b0f5f818 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/RepackageMojo.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/RepackageMojo.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2020 the original author or authors. + * Copyright 2012-2021 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -36,6 +36,7 @@ import org.springframework.boot.loader.tools.DefaultLaunchScript; import org.springframework.boot.loader.tools.LaunchScript; +import org.springframework.boot.loader.tools.LayoutFactory; import org.springframework.boot.loader.tools.Libraries; import org.springframework.boot.loader.tools.Repackager; @@ -48,6 +49,7 @@ * @author Dave Syer * @author Stephane Nicoll * @author Björn Lindström + * @author Scott Frederick * @since 1.0.0 */ @Mojo(name = "repackage", defaultPhase = LifecyclePhase.PACKAGE, requiresProject = true, threadSafe = true, @@ -152,6 +154,45 @@ public class RepackageMojo extends AbstractPackagerMojo { @Parameter(defaultValue = "${project.build.outputTimestamp}") private String outputTimestamp; + /** + * The type of archive (which corresponds to how the dependencies are laid out inside + * it). Possible values are {@code JAR}, {@code WAR}, {@code ZIP}, {@code DIR}, + * {@code NONE}. Defaults to a guess based on the archive type. + * @since 1.0.0 + */ + @Parameter(property = "spring-boot.repackage.layout") + private LayoutType layout; + + /** + * The layout factory that will be used to create the executable archive if no + * explicit layout is set. Alternative layouts implementations can be provided by 3rd + * parties. + * @since 1.5.0 + */ + @Parameter + private LayoutFactory layoutFactory; + + /** + * Return the type of archive that should be packaged by this MOJO. + * @return the value of the {@code layout} parameter, or {@code null} if the parameter + * is not provided + */ + @Override + protected LayoutType getLayout() { + return this.layout; + } + + /** + * Return the layout factory that will be used to determine the {@link LayoutType} if + * no explicit layout is set. + * @return the value of the {@code layoutFactory} parameter, or {@code null} if the + * parameter is not provided + */ + @Override + protected LayoutFactory getLayoutFactory() { + return this.layoutFactory; + } + @Override public void execute() throws MojoExecutionException, MojoFailureException { if (this.project.getPackaging().equals("pom")) {