Commit ad164269 authored by Madhura Bhave's avatar Madhura Bhave

Update classpath index to use jar name instead of full path

See gh-20564
parent 2ceec65b
...@@ -125,7 +125,8 @@ public class BootJar extends Jar implements BootArchive { ...@@ -125,7 +125,8 @@ public class BootJar extends Jar implements BootArchive {
} }
private File createClasspathIndex(List<String> dependencies) { private File createClasspathIndex(List<String> dependencies) {
String content = dependencies.stream().collect(Collectors.joining("\n", "", "\n")); String content = dependencies.stream().map((name) -> name.substring(name.lastIndexOf('/') + 1))
.collect(Collectors.joining("\n", "", "\n"));
File source = getProject().getResources().getText().fromString(content).asFile(); File source = getProject().getResources().getText().fromString(content).asFile();
File indexFile = new File(source.getParentFile(), "classpath.idx"); File indexFile = new File(source.getParentFile(), "classpath.idx");
source.renameTo(indexFile); source.renameTo(indexFile);
......
...@@ -164,10 +164,8 @@ class BootJarTests extends AbstractBootArchiveTests<BootJar> { ...@@ -164,10 +164,8 @@ class BootJarTests extends AbstractBootArchiveTests<BootJar> {
@Test @Test
void whenJarIsLayeredClasspathIndexPointsToLayeredLibs() throws IOException { void whenJarIsLayeredClasspathIndexPointsToLayeredLibs() throws IOException {
try (JarFile jarFile = new JarFile(createLayeredJar())) { try (JarFile jarFile = new JarFile(createLayeredJar())) {
assertThat(entryLines(jarFile, "BOOT-INF/classpath.idx")).containsExactly( assertThat(entryLines(jarFile, "BOOT-INF/classpath.idx")).containsExactly("first-library.jar",
"BOOT-INF/layers/dependencies/lib/first-library.jar", "second-library.jar", "third-library-SNAPSHOT.jar");
"BOOT-INF/layers/dependencies/lib/second-library.jar",
"BOOT-INF/layers/snapshot-dependencies/lib/third-library-SNAPSHOT.jar");
} }
} }
...@@ -189,8 +187,8 @@ class BootJarTests extends AbstractBootArchiveTests<BootJar> { ...@@ -189,8 +187,8 @@ class BootJarTests extends AbstractBootArchiveTests<BootJar> {
try (JarFile jarFile = new JarFile(createPopulatedJar())) { try (JarFile jarFile = new JarFile(createPopulatedJar())) {
assertThat(jarFile.getManifest().getMainAttributes().getValue("Spring-Boot-Classpath-Index")) assertThat(jarFile.getManifest().getMainAttributes().getValue("Spring-Boot-Classpath-Index"))
.isEqualTo("BOOT-INF/classpath.idx"); .isEqualTo("BOOT-INF/classpath.idx");
assertThat(entryLines(jarFile, "BOOT-INF/classpath.idx")).containsExactly("BOOT-INF/lib/first-library.jar", assertThat(entryLines(jarFile, "BOOT-INF/classpath.idx")).containsExactly("first-library.jar",
"BOOT-INF/lib/second-library.jar", "BOOT-INF/lib/third-library-SNAPSHOT.jar"); "second-library.jar", "third-library-SNAPSHOT.jar");
} }
} }
......
...@@ -28,6 +28,7 @@ import java.util.concurrent.TimeUnit; ...@@ -28,6 +28,7 @@ import java.util.concurrent.TimeUnit;
import java.util.jar.Attributes; import java.util.jar.Attributes;
import java.util.jar.JarFile; import java.util.jar.JarFile;
import java.util.jar.Manifest; import java.util.jar.Manifest;
import java.util.stream.Collectors;
import org.apache.commons.compress.archivers.jar.JarArchiveEntry; import org.apache.commons.compress.archivers.jar.JarArchiveEntry;
...@@ -492,7 +493,9 @@ public abstract class Packager { ...@@ -492,7 +493,9 @@ public abstract class Packager {
} }
if (getLayout() instanceof RepackagingLayout) { if (getLayout() instanceof RepackagingLayout) {
String location = ((RepackagingLayout) getLayout()).getClasspathIndexFileLocation(); String location = ((RepackagingLayout) getLayout()).getClasspathIndexFileLocation();
writer.writeIndexFile(location, this.libraries.keySet()); List<String> names = this.libraries.keySet().stream()
.map((key) -> key.substring(key.lastIndexOf('/') + 1)).collect(Collectors.toList());
writer.writeIndexFile(location, names);
} }
} }
......
...@@ -232,8 +232,8 @@ abstract class AbstractPackagerTests<P extends Packager> { ...@@ -232,8 +232,8 @@ abstract class AbstractPackagerTests<P extends Packager> {
assertThat(hasPackagedEntry("BOOT-INF/classpath.idx")).isTrue(); assertThat(hasPackagedEntry("BOOT-INF/classpath.idx")).isTrue();
String index = getPackagedEntryContent("BOOT-INF/classpath.idx"); String index = getPackagedEntryContent("BOOT-INF/classpath.idx");
String[] libraries = index.split("\\r?\\n"); String[] libraries = index.split("\\r?\\n");
assertThat(Arrays.asList(libraries)).contains("BOOT-INF/lib/" + libJarFile1.getName(), assertThat(Arrays.asList(libraries)).contains(libJarFile1.getName(), libJarFile2.getName(),
"BOOT-INF/lib/" + libJarFile2.getName(), "BOOT-INF/lib/" + libJarFile3.getName()); libJarFile3.getName());
} }
@Test @Test
...@@ -267,7 +267,8 @@ abstract class AbstractPackagerTests<P extends Packager> { ...@@ -267,7 +267,8 @@ abstract class AbstractPackagerTests<P extends Packager> {
expectedJars.add("BOOT-INF/layers/0001/lib/" + libJarFile1.getName()); expectedJars.add("BOOT-INF/layers/0001/lib/" + libJarFile1.getName());
expectedJars.add("BOOT-INF/layers/0002/lib/" + libJarFile2.getName()); expectedJars.add("BOOT-INF/layers/0002/lib/" + libJarFile2.getName());
expectedJars.add("BOOT-INF/layers/0003/lib/" + libJarFile3.getName()); expectedJars.add("BOOT-INF/layers/0003/lib/" + libJarFile3.getName());
assertThat(Arrays.asList(classpathIndex.split("\\n"))).containsExactly(expectedJars.toArray(new String[0])); assertThat(Arrays.asList(classpathIndex.split("\\n"))).containsExactly(libJarFile1.getName(),
libJarFile2.getName(), libJarFile3.getName());
assertThat(hasPackagedEntry("BOOT-INF/layers.idx")).isTrue(); assertThat(hasPackagedEntry("BOOT-INF/layers.idx")).isTrue();
String layersIndex = getPackagedEntryContent("BOOT-INF/layers.idx"); String layersIndex = getPackagedEntryContent("BOOT-INF/layers.idx");
List<String> expectedLayers = new ArrayList<>(); List<String> expectedLayers = new ArrayList<>();
...@@ -288,8 +289,7 @@ abstract class AbstractPackagerTests<P extends Packager> { ...@@ -288,8 +289,7 @@ abstract class AbstractPackagerTests<P extends Packager> {
execute(packager, Libraries.NONE); execute(packager, Libraries.NONE);
assertThat(hasPackagedEntry("BOOT-INF/classpath.idx")).isTrue(); assertThat(hasPackagedEntry("BOOT-INF/classpath.idx")).isTrue();
String classpathIndex = getPackagedEntryContent("BOOT-INF/classpath.idx"); String classpathIndex = getPackagedEntryContent("BOOT-INF/classpath.idx");
assertThat(Arrays.asList(classpathIndex.split("\\n"))) assertThat(Arrays.asList(classpathIndex.split("\\n"))).containsExactly("spring-boot-jarmode-layertools.jar");
.containsExactly("BOOT-INF/layers/default/lib/spring-boot-jarmode-layertools.jar");
assertThat(hasPackagedEntry("BOOT-INF/layers.idx")).isTrue(); assertThat(hasPackagedEntry("BOOT-INF/layers.idx")).isTrue();
String layersIndex = getPackagedEntryContent("BOOT-INF/layers.idx"); String layersIndex = getPackagedEntryContent("BOOT-INF/layers.idx");
assertThat(Arrays.asList(layersIndex.split("\\n"))).containsExactly("default"); assertThat(Arrays.asList(layersIndex.split("\\n"))).containsExactly("default");
......
...@@ -29,8 +29,6 @@ import java.nio.charset.StandardCharsets; ...@@ -29,8 +29,6 @@ import java.nio.charset.StandardCharsets;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
...@@ -45,33 +43,15 @@ final class ClassPathIndexFile { ...@@ -45,33 +43,15 @@ final class ClassPathIndexFile {
private final List<String> lines; private final List<String> lines;
private final Set<String> folders;
private ClassPathIndexFile(File root, List<String> lines) { private ClassPathIndexFile(File root, List<String> lines) {
this.root = root; this.root = root;
this.lines = lines; this.lines = lines;
this.folders = this.lines.stream().map(this::getFolder).filter(Objects::nonNull).collect(Collectors.toSet());
}
private String getFolder(String name) {
int lastSlash = name.lastIndexOf('/');
return (lastSlash != -1) ? name.substring(0, lastSlash) : null;
} }
int size() { int size() {
return this.lines.size(); return this.lines.size();
} }
boolean containsFolder(String name) {
if (name == null || name.isEmpty()) {
return false;
}
if (name.endsWith("/")) {
return containsFolder(name.substring(0, name.length() - 1));
}
return this.folders.contains(name);
}
boolean containsEntry(String name) { boolean containsEntry(String name) {
if (name == null || name.isEmpty()) { if (name == null || name.isEmpty()) {
return false; return false;
......
...@@ -73,30 +73,16 @@ class ClassPathIndexFileTests { ...@@ -73,30 +73,16 @@ class ClassPathIndexFileTests {
assertThat(indexFile.size()).isEqualTo(5); assertThat(indexFile.size()).isEqualTo(5);
} }
@Test
void containsFolderWhenFolderIsPresentReturnsTrue() throws Exception {
ClassPathIndexFile indexFile = copyAndLoadTestIndexFile();
assertThat(indexFile.containsFolder("BOOT-INF/layers/one/lib")).isTrue();
assertThat(indexFile.containsFolder("BOOT-INF/layers/one/lib/")).isTrue();
assertThat(indexFile.containsFolder("BOOT-INF/layers/two/lib")).isTrue();
}
@Test
void containsFolderWhenFolderIsMissingReturnsFalse() throws Exception {
ClassPathIndexFile indexFile = copyAndLoadTestIndexFile();
assertThat(indexFile.containsFolder("BOOT-INF/layers/nope/lib/")).isFalse();
}
@Test @Test
void getUrlsReturnsUrls() throws Exception { void getUrlsReturnsUrls() throws Exception {
ClassPathIndexFile indexFile = copyAndLoadTestIndexFile(); ClassPathIndexFile indexFile = copyAndLoadTestIndexFile();
List<URL> urls = indexFile.getUrls(); List<URL> urls = indexFile.getUrls();
List<File> expected = new ArrayList<>(); List<File> expected = new ArrayList<>();
expected.add(new File(this.temp, "BOOT-INF/layers/one/lib/a.jar")); expected.add(new File(this.temp, "a.jar"));
expected.add(new File(this.temp, "BOOT-INF/layers/one/lib/b.jar")); expected.add(new File(this.temp, "b.jar"));
expected.add(new File(this.temp, "BOOT-INF/layers/one/lib/c.jar")); expected.add(new File(this.temp, "c.jar"));
expected.add(new File(this.temp, "BOOT-INF/layers/two/lib/d.jar")); expected.add(new File(this.temp, "d.jar"));
expected.add(new File(this.temp, "BOOT-INF/layers/two/lib/e.jar")); expected.add(new File(this.temp, "e.jar"));
assertThat(urls).containsExactly(expected.stream().map(this::toUrl).toArray(URL[]::new)); assertThat(urls).containsExactly(expected.stream().map(this::toUrl).toArray(URL[]::new));
} }
......
BOOT-INF/layers/one/lib/a.jar a.jar
BOOT-INF/layers/one/lib/b.jar b.jar
BOOT-INF/layers/one/lib/c.jar c.jar
BOOT-INF/layers/two/lib/d.jar d.jar
BOOT-INF/layers/two/lib/e.jar e.jar
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment