diff --git a/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/jar/JarEntryData.java b/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/jar/JarEntryData.java index 7c086cac3bd..a5cb9aebaf3 100644 --- a/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/jar/JarEntryData.java +++ b/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/jar/JarEntryData.java @@ -47,7 +47,7 @@ public final class JarEntryData { private final AsciiBytes comment; - private long dataOffset; + private long localHeaderOffset; private RandomAccessData data; @@ -66,10 +66,7 @@ public final class JarEntryData { this.extra = Bytes.get(inputStream, extraLength); this.comment = new AsciiBytes(Bytes.get(inputStream, commentLength)); - this.dataOffset = Bytes.littleEndianValue(header, 42, 4); - this.dataOffset += LOCAL_FILE_HEADER_SIZE; - this.dataOffset += this.name.length(); - this.dataOffset += this.extra.length; + this.localHeaderOffset = Bytes.littleEndianValue(header, 42, 4); } void setName(AsciiBytes name) { @@ -88,10 +85,18 @@ public final class JarEntryData { return inputStream; } - RandomAccessData getData() { + RandomAccessData getData() throws IOException { if (this.data == null) { - this.data = this.source.getData().getSubsection(this.dataOffset, - getCompressedSize()); + // aspectjrt-1.7.4.jar has a different ext bytes length in the + // local directory to the central directory. We need to re-read + // here to skip them + byte[] localHeader = Bytes.get(this.source.getData().getSubsection( + this.localHeaderOffset, LOCAL_FILE_HEADER_SIZE)); + long nameLength = Bytes.littleEndianValue(localHeader, 26, 2); + long extraLength = Bytes.littleEndianValue(localHeader, 28, 2); + this.data = this.source.getData().getSubsection( + this.localHeaderOffset + LOCAL_FILE_HEADER_SIZE + nameLength + + extraLength, getCompressedSize()); } return this.data; } diff --git a/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/jar/ZipInflaterInputStream.java b/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/jar/ZipInflaterInputStream.java index 43b15b05303..358d7bb2d59 100644 --- a/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/jar/ZipInflaterInputStream.java +++ b/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/jar/ZipInflaterInputStream.java @@ -35,7 +35,7 @@ class ZipInflaterInputStream extends InflaterInputStream { private int available; public ZipInflaterInputStream(InputStream inputStream, int size) { - super(inputStream, new Inflater(true), 512); + super(inputStream, new Inflater(true), getInflaterBufferSize(size)); this.available = size; } @@ -72,4 +72,11 @@ class ZipInflaterInputStream extends InflaterInputStream { } } + private static int getInflaterBufferSize(long size) { + size += 2; // inflater likes some space + size = (size > 65536 ? 8192 : size); + size = (size <= 0 ? 4096 : size); + return (int) size; + } + }