Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
62 commits
Select commit Hold shift + click to select a range
59d457f
Remove unnecessary null check
quaff May 27, 2026
bfd1b8c
Merge pull request #50504 from quaff
mhalbritter May 27, 2026
6a8a3ff
Merge branch '3.5.x' into 4.0.x
mhalbritter May 27, 2026
4d4762c
Merge branch '4.0.x'
mhalbritter May 27, 2026
f734339
Handle root output directory when extracting layers
DragonFSKY May 25, 2026
db1ebf5
Polish "Handle root output directory when extracting layers"
mhalbritter May 27, 2026
29e2456
Merge pull request #50501 from DragonFSKY
mhalbritter May 27, 2026
5f0d0ad
Merge branch '3.5.x' into 4.0.x
mhalbritter May 27, 2026
8afd978
Merge branch '4.0.x'
mhalbritter May 27, 2026
0cc3a7b
Start building against Micrometer 1.15.12 snapshots
wilkinsona May 27, 2026
3574cc4
Start building against Micrometer Tracing 1.5.12 snapshots
wilkinsona May 27, 2026
f56b7f3
Start building against Reactor Bom 2024.0.18 snapshots
wilkinsona May 27, 2026
7710250
Start building against Spring AMQP 3.2.11 snapshots
wilkinsona May 27, 2026
7a6272a
Start building against Spring Authorization Server 1.5.8 snapshots
wilkinsona May 27, 2026
b1f122f
Start building against Spring Batch 5.2.6 snapshots
wilkinsona May 27, 2026
4b9eac1
Start building against Spring Data Bom 2025.0.12 snapshots
wilkinsona May 27, 2026
0f612ca
Start building against Spring Framework 6.2.19 snapshots
wilkinsona May 27, 2026
2e75a44
Start building against Spring HATEOAS 2.5.3 snapshots
wilkinsona May 27, 2026
4a02ee1
Start building against Spring Integration 6.5.9 snapshots
wilkinsona May 27, 2026
012f7bf
Start building against Spring Kafka 3.3.16 snapshots
wilkinsona May 27, 2026
b44ffb7
Start building against Spring LDAP 3.3.8 snapshots
wilkinsona May 27, 2026
99793fe
Start building against Spring Pulsar 1.2.18 snapshots
wilkinsona May 27, 2026
6baa007
Start building against Spring RESTDocs 3.0.6 snapshots
wilkinsona May 27, 2026
dfad5d4
Start building against Spring Retry 2.0.13 snapshots
wilkinsona May 27, 2026
20031a7
Start building against Spring Security 6.5.11 snapshots
wilkinsona May 27, 2026
4e1c7aa
Start building against Spring Session 3.5.7 snapshots
wilkinsona May 27, 2026
12bb702
Start building against Spring WS 4.1.4 snapshots
wilkinsona May 27, 2026
e9df8c3
Upgrade to Hibernate 6.6.51.Final
wilkinsona May 27, 2026
7e16d2c
Upgrade to Jaxen 2.0.3
wilkinsona May 27, 2026
9dfa403
Upgrade to jOOQ 3.19.34
wilkinsona May 27, 2026
9f189ca
Upgrade to Netty 4.1.134.Final
wilkinsona May 27, 2026
9300366
Upgrade to SLF4J 2.0.18
wilkinsona May 27, 2026
76d56ab
Upgrade to Tomcat 10.1.55
wilkinsona May 27, 2026
04f5785
Disable Homebrew sandbox for the verification tests
mhalbritter May 27, 2026
a4a4bfd
Merge branch '4.0.x'
mhalbritter May 27, 2026
cfe044b
Merge branch '3.5.x' into 4.0.x
wilkinsona May 27, 2026
12b4cca
Merge branch '4.0.x'
wilkinsona May 27, 2026
d0018a3
Start building against Micrometer 1.16.6 snapshots
wilkinsona May 27, 2026
b605872
Start building against Micrometer Tracing 1.6.6 snapshots
wilkinsona May 27, 2026
9e079a5
Start building against Reactor Bom 2025.0.6 snapshots
wilkinsona May 27, 2026
78b9fc4
Start building against Spring AMQP 4.0.4 snapshots
wilkinsona May 27, 2026
8d0cc0d
Start building against Spring Batch 6.0.4 snapshots
wilkinsona May 27, 2026
6c93239
Start building against Spring Data Bom 2025.1.6 snapshots
wilkinsona May 27, 2026
169282e
Start building against Spring Framework 7.0.8 snapshots
wilkinsona May 27, 2026
578fe31
Start building against Spring HATEOAS 3.0.4 snapshots
wilkinsona May 27, 2026
8a92c75
Start building against Spring Integration 7.0.5 snapshots
wilkinsona May 27, 2026
a65f2bb
Start building against Spring Kafka 4.0.6 snapshots
wilkinsona May 27, 2026
6e55dab
Start building against Spring LDAP 4.0.4 snapshots
wilkinsona May 27, 2026
51765d2
Start building against Spring Pulsar 2.0.6 snapshots
wilkinsona May 27, 2026
2a9f320
Start building against Spring RESTDocs 4.0.1 snapshots
wilkinsona May 27, 2026
dc5fea7
Start building against Spring Security 7.0.6 snapshots
wilkinsona May 27, 2026
88bae1d
Start building against Spring Session 4.0.4 snapshots
wilkinsona May 27, 2026
2457755
Start building against Spring WS 5.0.2 snapshots
wilkinsona May 27, 2026
3e0a372
Upgrade to Hibernate 7.2.16.Final
wilkinsona May 27, 2026
cf660ce
Upgrade to Jaxen 2.0.3
wilkinsona May 27, 2026
91064dc
Upgrade to jOOQ 3.19.34
wilkinsona May 27, 2026
309505c
Upgrade to Liquibase 5.0.3
wilkinsona May 27, 2026
96ae19b
Upgrade to Maven Enforcer Plugin 3.6.3
wilkinsona May 27, 2026
2ea88ad
Upgrade to Neo4j Java Driver 6.1.0
wilkinsona May 27, 2026
de55473
Upgrade to Netty 4.2.14.Final
wilkinsona May 27, 2026
1ea8641
Upgrade to SLF4J 2.0.18
wilkinsona May 27, 2026
81dbae0
Merge branch '4.0.x'
wilkinsona May 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/verify.yml
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ jobs:
RVT_RELEASE_TYPE: ${{ vars.COMMERCIAL && 'commercial' || 'oss' }}
RVT_STAGING: ${{ inputs.staging }}
RVT_VERSION: ${{ inputs.version }}
HOMEBREW_NO_SANDBOX_LINUX: "1"
run: ./gradlew spring-boot-release-verification-tests:test
- name: Upload Build Reports on Failure
if: failure()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import java.io.PrintStream;
import java.io.UncheckedIOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.attribute.BasicFileAttributeView;
import java.nio.file.attribute.BasicFileAttributes;
import java.nio.file.attribute.FileTime;
Expand Down Expand Up @@ -57,6 +58,7 @@
* The {@code 'extract'} tools command.
*
* @author Moritz Halbritter
* @author Dongliang Xie
*/
class ExtractCommand extends Command {

Expand Down Expand Up @@ -363,14 +365,18 @@ private static void withJarEntries(File file, @Nullable ManfiestWriter manfiestW
}

private static File assertFileIsContainedInDirectory(File directory, File file, String name) throws IOException {
String canonicalOutputPath = directory.getCanonicalPath() + File.separator;
String canonicalEntryPath = file.getCanonicalPath();
Assert.state(canonicalEntryPath.startsWith(canonicalOutputPath),
Path canonicalOutputPath = directory.getCanonicalFile().toPath();
Path canonicalEntryPath = file.getCanonicalFile().toPath();
Assert.state(isFileContainedInDirectory(canonicalOutputPath, canonicalEntryPath),
() -> "Entry '%s' would be written to '%s'. This is outside the output location of '%s'. Verify the contents of your archive."
.formatted(name, canonicalEntryPath, canonicalOutputPath));
return file;
}

private static boolean isFileContainedInDirectory(Path directory, Path file) {
return !file.equals(directory) && file.startsWith(directory);
}

@FunctionalInterface
private interface EntryNameTransformer {

Expand Down Expand Up @@ -515,9 +521,9 @@ private boolean shouldExtractLayer(String layer) {
}

private File assertLayerDirectoryLocation(File layerDirectory, String layerName) throws IOException {
String canonicalOutputPath = this.directory.getCanonicalPath() + File.separator;
String canonicalLayerPath = layerDirectory.getCanonicalPath();
Assert.state(canonicalLayerPath.startsWith(canonicalOutputPath),
Path canonicalOutputPath = this.directory.getCanonicalFile().toPath();
Path canonicalLayerPath = layerDirectory.getCanonicalFile().toPath();
Assert.state(isFileContainedInDirectory(canonicalOutputPath, canonicalLayerPath),
() -> "Layer '%s' would be written to '%s'. This is outside the output location of '%s'. Verify the contents of your archive."
.formatted(layerName, canonicalLayerPath, canonicalOutputPath));
return layerDirectory;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,13 @@
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.attribute.BasicFileAttributeView;
import java.nio.file.attribute.BasicFileAttributes;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.jar.Manifest;
Expand All @@ -45,6 +47,7 @@
* Tests for {@link ExtractCommand}.
*
* @author Moritz Halbritter
* @author Dongliang Xie
*/
class ExtractCommandTests extends AbstractJarModeTests {

Expand Down Expand Up @@ -370,6 +373,38 @@ void extractsOnlySelectedLayers() throws IOException {
.doesNotContain("test/spring-boot-loader/org/springframework/boot/loader/launch/JarLauncher.class");
}

@Test
void extractWhenDestinationIsFileSystemRoot() throws IOException {
Path layerDirectory = ExtractCommandTests.this.tempDir.toPath()
.resolve("root-output")
.resolve("dependencies")
.toAbsolutePath()
.normalize();
Path outputRoot = layerDirectory.getRoot();
String layerName = outputRoot.relativize(layerDirectory).toString().replace(File.separatorChar, '/');
Layers layers = new Layers() {

@Override
public Iterator<String> iterator() {
return List.of(layerName).iterator();
}

@Override
public String getLayer(String entryName) {
return layerName;
}

@Override
public String getApplicationLayerName() {
return layerName;
}

};
runCommand((context) -> new ExtractCommand(context, layers), ExtractCommandTests.this.archive,
"--destination", outputRoot.toString(), "--force", "--launcher", "--layers");
assertThat(layerDirectory.resolve("BOOT-INF/lib/dependency-1.jar")).exists();
}

}

}
Original file line number Diff line number Diff line change
Expand Up @@ -173,15 +173,13 @@ private void applyProperties(LettuceClientConfigurationBuilder builder, @Nullabl
if (getProperties().getTimeout() != null) {
builder.commandTimeout(getProperties().getTimeout());
}
if (getProperties().getLettuce() != null) {
DataRedisProperties.Lettuce lettuce = getProperties().getLettuce();
if (lettuce.getShutdownTimeout() != null && !lettuce.getShutdownTimeout().isZero()) {
builder.shutdownTimeout(getProperties().getLettuce().getShutdownTimeout());
}
String readFrom = lettuce.getReadFrom();
if (readFrom != null) {
builder.readFrom(getReadFrom(readFrom));
}
DataRedisProperties.Lettuce lettuce = getProperties().getLettuce();
if (lettuce.getShutdownTimeout() != null && !lettuce.getShutdownTimeout().isZero()) {
builder.shutdownTimeout(getProperties().getLettuce().getShutdownTimeout());
}
String readFrom = lettuce.getReadFrom();
if (readFrom != null) {
builder.readFrom(getReadFrom(readFrom));
}
if (StringUtils.hasText(getProperties().getClientName())) {
builder.clientName(getProperties().getClientName());
Expand Down
Loading