mirror of
https://github.com/spring-projects/spring-boot.git
synced 2024-08-29 03:06:45 +08:00
Use layout configuration in Maven build-image goal
This commit changes the Maven build-image goal to honor the `layout` and `layoutFactory` parameters to ensure that the archive content sent to the builder is the same as is used by the `repackage` goal to build the archive file. Fixes gh-26216
This commit is contained in:
parent
3cc1ed28ca
commit
c37b9b8a8e
@ -16,12 +16,16 @@
|
||||
|
||||
package org.springframework.boot.maven;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.Random;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.junit.jupiter.api.TestTemplate;
|
||||
import org.junit.jupiter.api.extension.ExtendWith;
|
||||
@ -262,6 +266,34 @@ public class BuildImageTests extends AbstractArchiveIntegrationTests {
|
||||
});
|
||||
}
|
||||
|
||||
@TestTemplate
|
||||
void whenBuildImageIsInvokedWithZipPackaging(MavenBuild mavenBuild) {
|
||||
mavenBuild.project("build-image-zip-packaging");
|
||||
mavenBuild.goals("package");
|
||||
mavenBuild.prepare(this::writeLongNameResource);
|
||||
mavenBuild.execute((project) -> {
|
||||
File jar = new File(project, "target/build-image-zip-packaging-0.0.1.BUILD-SNAPSHOT.jar");
|
||||
assertThat(jar).isFile();
|
||||
assertThat(buildLog(project)).contains("Building image").contains("paketo-buildpacks/builder")
|
||||
.contains("docker.io/library/build-image-zip-packaging:0.0.1.BUILD-SNAPSHOT")
|
||||
.contains("Successfully built image");
|
||||
ImageReference imageReference = ImageReference.of(ImageName.of("build-image-zip-packaging"),
|
||||
"0.0.1.BUILD-SNAPSHOT");
|
||||
try (GenericContainer<?> container = new GenericContainer<>(imageReference.toString())) {
|
||||
container.waitingFor(Wait.forLogMessage("Launched\\n", 1)).start();
|
||||
container.copyFileFromContainer("/workspace/META-INF/MANIFEST.MF", (inputStream) -> {
|
||||
String text = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)).lines()
|
||||
.collect(Collectors.joining("\n"));
|
||||
assertThat(text).contains("Main-Class: org.springframework.boot.loader.PropertiesLauncher");
|
||||
return null;
|
||||
});
|
||||
}
|
||||
finally {
|
||||
removeImage(imageReference);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@TestTemplate
|
||||
void failsWhenBuilderFails(MavenBuild mavenBuild) {
|
||||
mavenBuild.project("build-image-builder-error").goals("package")
|
||||
|
@ -0,0 +1,32 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>org.springframework.boot.maven.it</groupId>
|
||||
<artifactId>build-image-zip-packaging</artifactId>
|
||||
<version>0.0.1.BUILD-SNAPSHOT</version>
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<maven.compiler.source>@java.version@</maven.compiler.source>
|
||||
<maven.compiler.target>@java.version@</maven.compiler.target>
|
||||
</properties>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>@project.groupId@</groupId>
|
||||
<artifactId>@project.artifactId@</artifactId>
|
||||
<version>@project.version@</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<goals>
|
||||
<goal>build-image</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
<configuration>
|
||||
<layout>ZIP</layout>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
@ -0,0 +1,28 @@
|
||||
/*
|
||||
* Copyright 2012-2020 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.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.test;
|
||||
|
||||
public class SampleApplication {
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
System.out.println("Launched");
|
||||
synchronized(args) {
|
||||
args.wait(); // Prevent exit"
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -48,6 +48,7 @@ import org.springframework.boot.buildpack.platform.io.Owner;
|
||||
import org.springframework.boot.buildpack.platform.io.TarArchive;
|
||||
import org.springframework.boot.loader.tools.EntryWriter;
|
||||
import org.springframework.boot.loader.tools.ImagePackager;
|
||||
import org.springframework.boot.loader.tools.LayoutFactory;
|
||||
import org.springframework.boot.loader.tools.Libraries;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
@ -128,6 +129,45 @@ public class BuildImageMojo extends AbstractPackagerMojo {
|
||||
@Parameter(property = "spring-boot.build-image.runImage", readonly = true)
|
||||
String runImage;
|
||||
|
||||
/**
|
||||
* 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 2.3.11
|
||||
*/
|
||||
@Parameter
|
||||
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 2.3.11
|
||||
*/
|
||||
@Parameter
|
||||
private LayoutFactory layoutFactory;
|
||||
|
||||
/**
|
||||
* Return the type of archive that should be used when buiding the image.
|
||||
* @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 {
|
||||
if (this.project.getPackaging().equals("pom")) {
|
||||
|
Loading…
Reference in New Issue
Block a user