Include layertools in layered jars build with Gradle

Closes gh-19867
This commit is contained in:
Andy Wilkinson 2020-01-23 11:43:19 +00:00
parent 288f5ceaee
commit 01a0a54f78
2 changed files with 18 additions and 0 deletions

View File

@ -18,7 +18,9 @@ package org.springframework.boot.gradle.tasks.bundling;
import java.io.BufferedWriter; import java.io.BufferedWriter;
import java.io.File; import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream;
import java.io.StringWriter; import java.io.StringWriter;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
@ -43,6 +45,7 @@ import org.gradle.api.tasks.bundling.Jar;
import org.springframework.boot.loader.tools.Layer; import org.springframework.boot.loader.tools.Layer;
import org.springframework.boot.loader.tools.Layers; import org.springframework.boot.loader.tools.Layers;
import org.springframework.boot.loader.tools.Library; import org.springframework.boot.loader.tools.Library;
import org.springframework.util.FileCopyUtils;
/** /**
* A custom {@link Jar} task that produces a Spring Boot executable jar. * A custom {@link Jar} task that produces a Spring Boot executable jar.
@ -177,6 +180,15 @@ public class BootJar extends Jar implements BootArchive {
*/ */
public void layered() { public void layered() {
this.layers = Layers.IMPLICIT; this.layers = Layers.IMPLICIT;
this.bootInf.into("lib", (spec) -> spec.from((Callable<File>) () -> {
String jarName = "spring-boot-jarmode-layertools.jar";
InputStream stream = getClass().getClassLoader().getResourceAsStream("META-INF/jarmode/" + jarName);
File taskTmp = new File(getProject().getBuildDir(), "tmp/" + getName());
taskTmp.mkdirs();
File layerToolsJar = new File(taskTmp, jarName);
FileCopyUtils.copy(stream, new FileOutputStream(layerToolsJar));
return layerToolsJar;
}));
this.bootInf.eachFile((details) -> { this.bootInf.eachFile((details) -> {
Layer layer = layerForFileDetails(details); Layer layer = layerForFileDetails(details);
if (layer != null) { if (layer != null) {

View File

@ -123,6 +123,12 @@ class BootJarTests extends AbstractBootArchiveTests<BootJar> {
} }
} }
@Test
void whenJarIsLayeredThenLayerToolsAreAddedToTheJar() throws IOException {
List<String> entryNames = getEntryNames(createLayeredJar());
assertThat(entryNames).contains("BOOT-INF/layers/dependencies/lib/spring-boot-jarmode-layertools.jar");
}
@Test @Test
void classpathIndexPointsToBootInfLibs() throws IOException { void classpathIndexPointsToBootInfLibs() throws IOException {
try (JarFile jarFile = new JarFile(createPopulatedJar())) { try (JarFile jarFile = new JarFile(createPopulatedJar())) {