Skip to content

Commit 378b7e0

Browse files
authored
Merge pull request #2828 from adobe/5.0.0-maintenance-ctd
5.0.0 maintenance / release preparation
2 parents 3a330e8 + f525465 commit 378b7e0

File tree

67 files changed

+890
-530
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

67 files changed

+890
-530
lines changed

.github/workflows/codeql.yml

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,10 @@ name: "CodeQL"
1313

1414
on:
1515
push:
16-
branches: [s3mock-v2, main]
16+
branches: [s3mock-v2, s3mock-v3, s3mock-v4, main]
1717
pull_request:
1818
# The branches below must be a subset of the branches above
19-
branches: [s3mock-v2, main]
20-
schedule:
21-
- cron: '43 21 * * 6'
19+
branches: [s3mock-v2, s3mock-v3, s3mock-v4, main]
2220

2321
# Declare default permissions as read only.
2422
permissions: read-all

.github/workflows/maven-ci-and-prb.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@ name: Maven Build
2020

2121
on:
2222
push:
23-
branches: [s3mock-v2, main]
23+
branches: [s3mock-v2, s3mock-v3, s3mock-v4, main]
2424
pull_request:
25-
branches: [s3mock-v2, main]
25+
branches: [s3mock-v2, s3mock-v3, s3mock-v4, main]
2626

2727
# Declare default permissions as read only.
2828
permissions: read-all

.github/workflows/maven-release.yml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,9 @@ jobs:
4040
- name: Set up JDK
4141
uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0
4242
with:
43-
java-version: 21
44-
distribution: 'temurin'
43+
java-version: 25
44+
distribution: 'oracle'
45+
cache: 'maven'
4546

4647
# The release build pushes a Docker image to Docker Hub, so we need to log in
4748
- name: Perform docker login

CHANGELOG.md

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ Whenever a 3rd party library is updated, S3Mock will update it's MINOR version.
117117
# PLANNED - 6.x - RELEASE TBD
118118
Version 6.x is JDK25 LTS bytecode compatible, with Docker integration.
119119

120-
Probably released with Spring Boot 5.x, updating baselines etc. as Spring Boot 5.x requires.
120+
Will be released after Spring Boot 5.x, updating baselines etc. as Spring Boot 5.x requires.
121121

122122
Any JUnit / direct Java usage support will most likely be dropped and only supported on a best-effort basis.
123123
(i.e., the modules will be deleted from the code base and not released anymore. It *may* be possible to
@@ -149,7 +149,13 @@ Version 5.x is JDK17 LTS bytecode compatible, with Docker and JUnit / direct Jav
149149
## 5.0.0
150150

151151
* Features and fixes
152+
* Breaking change (file system): Remove "DisplayName" from Owner. (fixes #2738)
153+
* AWS APIs stopped returning "DisplayName" in November 2025.
154+
* This is unfortunately a breaking change for clients starting S3Mock on existing file systems.
152155
* Get object with range now returns the same headers as non-range calls.
156+
* Docker: Copy "s3mock.jar" to "/opt/", run with absolute path reference to avoid issues when working directory is changed. (fixes #2827)
157+
* S3Mock supports ChecksumType.FULL_OBJECT for Multipart uploads (fixes #2843)
158+
* Return 412 on if-none-match=true when making CompleteMultipartRequest (fixes #2790)
153159
* Refactorings
154160
* Use Jackson 3 annotations and mappers.
155161
* AWS has deprecated SDK for Java v1 and will remove support EOY 2025.
@@ -159,14 +165,31 @@ Version 5.x is JDK17 LTS bytecode compatible, with Docker and JUnit / direct Jav
159165
* Remove legacy properties for S3Mock configuration.
160166
* Move all controller-related code from "com.adobe.testing.s3mock" to "com.adobe.testing.s3mock.controller" package.
161167
* Remove Apache libraries like "commons-compress", "commons-codec" or "commons-lang3" from dependencies. Kotlin and Java standard library provide similar functionality.
162-
* Version updates
163-
* Bump Spring Boot version to 4.0.0
164-
* Bump Spring Framework version to 7.0.1
165-
* Bump java version from 17 to 25
166-
* Compile with Java 25, target Java 17
168+
* Version updates (deliverable dependencies)
169+
* Bump spring-boot.version from 3.5.8 to 4.0.2
170+
* Bump Java version from 17 to 25
171+
* Compile with Java 25, target Java 17. [This follows Spring guidance](https://spring.io/blog/2025/11/13/spring-framework-7-0-general-availability)
167172
* Docker container runs Java 25
168-
* Bump TestContainers to 2.0.2
169-
* Bump Maven to 4.0.0
173+
* Bump Bump testcontainers.version from 1.21.3 to 2.0.2
174+
* Bump kotlin.version from 2.2.21 to 2.3.0
175+
* Compile with Kotlin 2.3, target Kotlin 2.2. [This follows Spring guidance](https://spring.io/blog/2025/12/18/next-level-kotlin-support-in-spring-boot-4#kotlin-2-baseline)
176+
* Bump alpine from 3.23.0 to 3.23.3 in /docker
177+
* Bump org.testng:testng from 7.11.0 to 7.12.0
178+
* Bump aws-v2.version from 2.40.0 to 2.41.23
179+
* Version updates (build dependencies)
180+
* Bump aws.sdk.kotlin:s3-jvm from 1.5.95 to 1.6.11
181+
* Bump Maven to 4.0.0-rc5 (TODO: update to 4.0.0)
182+
* Bump org.mockito.kotlin:mockito-kotlin from 6.1.0 to 6.2.3
183+
* Bump org.apache.maven.plugins:maven-release-plugin from 3.3.0 to 3.3.1
184+
* Bump org.codehaus.mojo:exec-maven-plugin from 3.6.2 to 3.6.3
185+
* Bump org.apache.maven.plugins:maven-compiler-plugin from 3.14.1 to 3.15.0
186+
* Bump digital.pragmatech.testing:spring-test-profiler from 0.0.14 to 0.0.15
187+
* Bump com.puppycrawl.tools:checkstyle from 12.2.0 to 13.2.0
188+
* Bump actions/upload-artifact from 5.0.0 to 6.0.0
189+
* Bump actions/checkout from 6.0.1 to 6.0.2
190+
* Bump github/codeql-action from 4.31.6 to 4.32.2
191+
* Bump actions/setup-java from 5.0.0 to 5.2.0
192+
* Bump step-security/harden-runner from 2.13.3 to 2.14.1
170193

171194
# DEPRECATED - 4.x
172195
Version 4.x is JDK17 LTS bytecode compatible, with Docker and JUnit / direct Java integration.

Makefile

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#
2-
# Copyright 2017-2025 Adobe.
2+
# Copyright 2017-2026 Adobe.
33
#
44
# Licensed under the Apache License, Version 2.0 (the "License");
55
# you may not use this file except in compliance with the License.
@@ -14,7 +14,7 @@
1414
# limitations under the License.
1515
#
1616

17-
.PHONY: build verify install
17+
.PHONY: build verify install sort
1818
.DEFAULT_GOAL := build
1919

2020
build: verify
@@ -24,3 +24,6 @@ verify:
2424

2525
install:
2626
./mvnw -B -V -Dstyle.color=always clean install
27+
28+
sort:
29+
./mvnw -B -V -Dstyle.color=always com.github.ekryd.sortpom:sortpom-maven-plugin:sort

docker/Dockerfile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ ENV JAVA_HOME=/opt/java-minimal
5959
ENV PATH="$PATH:$JAVA_HOME/bin"
6060

6161
COPY --from=staging_area "$JAVA_HOME" "$JAVA_HOME"
62-
COPY ./target/s3mock-exec.jar s3mock.jar
62+
COPY ./target/s3mock-exec.jar /opt/s3mock.jar
6363

6464
ENV LANG=en_US.UTF-8
6565
ENV LANGUAGE=en_US:en
@@ -69,4 +69,4 @@ ENV root=/s3mockroot
6969
EXPOSE 9090 9191
7070

7171
# run the app on startup
72-
ENTRYPOINT ["java", "--illegal-access=warn", "-Djava.security.egd=file:/dev/./urandom", "-XX:+UseZGC", "-XX:+ZGenerational", "-jar", "s3mock.jar" ]
72+
ENTRYPOINT ["java", "--illegal-access=warn", "-Djava.security.egd=file:/dev/./urandom", "-XX:+UseZGC", "-XX:+ZGenerational", "-jar", "/opt/s3mock.jar" ]

integration-tests/pom.xml

Lines changed: 40 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@
3030
<name>S3Mock - Integration Tests</name>
3131

3232
<dependencies>
33+
<dependency>
34+
<groupId>aws.sdk.kotlin</groupId>
35+
<artifactId>s3-jvm</artifactId>
36+
<scope>test</scope>
37+
</dependency>
3338
<dependency>
3439
<groupId>com.adobe.testing</groupId>
3540
<artifactId>s3mock</artifactId>
@@ -48,6 +53,21 @@
4853
</exclusion>
4954
</exclusions>
5055
</dependency>
56+
<dependency>
57+
<groupId>org.apache.httpcomponents</groupId>
58+
<artifactId>httpclient</artifactId>
59+
<scope>test</scope>
60+
</dependency>
61+
<dependency>
62+
<groupId>org.apache.httpcomponents</groupId>
63+
<artifactId>httpcore</artifactId>
64+
<scope>test</scope>
65+
</dependency>
66+
<dependency>
67+
<groupId>org.apache.httpcomponents</groupId>
68+
<artifactId>httpmime</artifactId>
69+
<scope>test</scope>
70+
</dependency>
5171
<dependency>
5272
<groupId>org.assertj</groupId>
5373
<artifactId>assertj-core</artifactId>
@@ -58,6 +78,12 @@
5878
<artifactId>awaitility</artifactId>
5979
<scope>test</scope>
6080
</dependency>
81+
<dependency>
82+
<groupId>org.jetbrains.kotlin</groupId>
83+
<artifactId>kotlin-reflect</artifactId>
84+
<version>${kotlin.version}</version>
85+
<scope>test</scope>
86+
</dependency>
6187
<!-- Force Kotlin stdlib alignment to match aws-sdk-kotlin 1.5.x requirements -->
6288
<dependency>
6389
<groupId>org.jetbrains.kotlin</groupId>
@@ -67,8 +93,7 @@
6793
</dependency>
6894
<dependency>
6995
<groupId>org.jetbrains.kotlin</groupId>
70-
<artifactId>kotlin-reflect</artifactId>
71-
<version>${kotlin.version}</version>
96+
<artifactId>kotlin-test-junit</artifactId>
7297
<scope>test</scope>
7398
</dependency>
7499
<!-- Force Kotlin coroutines alignment to match aws-sdk-kotlin 1.5.x requirements -->
@@ -84,11 +109,6 @@
84109
<version>${kotlin-coroutines.version}</version>
85110
<scope>test</scope>
86111
</dependency>
87-
<dependency>
88-
<groupId>org.jetbrains.kotlin</groupId>
89-
<artifactId>kotlin-test-junit</artifactId>
90-
<scope>test</scope>
91-
</dependency>
92112
<dependency>
93113
<groupId>org.junit.jupiter</groupId>
94114
<artifactId>junit-jupiter-api</artifactId>
@@ -111,27 +131,22 @@
111131
</dependency>
112132
<dependency>
113133
<groupId>software.amazon.awssdk</groupId>
114-
<artifactId>aws-query-protocol</artifactId>
115-
<scope>test</scope>
116-
</dependency>
117-
<dependency>
118-
<groupId>software.amazon.awssdk</groupId>
119-
<artifactId>aws-xml-protocol</artifactId>
134+
<artifactId>aws-crt-client</artifactId>
120135
<scope>test</scope>
121136
</dependency>
122137
<dependency>
123138
<groupId>software.amazon.awssdk</groupId>
124-
<artifactId>s3</artifactId>
139+
<artifactId>aws-query-protocol</artifactId>
125140
<scope>test</scope>
126141
</dependency>
127142
<dependency>
128143
<groupId>software.amazon.awssdk</groupId>
129-
<artifactId>url-connection-client</artifactId>
144+
<artifactId>aws-xml-protocol</artifactId>
130145
<scope>test</scope>
131146
</dependency>
132147
<dependency>
133148
<groupId>software.amazon.awssdk</groupId>
134-
<artifactId>aws-crt-client</artifactId>
149+
<artifactId>s3</artifactId>
135150
<scope>test</scope>
136151
</dependency>
137152
<dependency>
@@ -140,23 +155,8 @@
140155
<scope>test</scope>
141156
</dependency>
142157
<dependency>
143-
<groupId>aws.sdk.kotlin</groupId>
144-
<artifactId>s3-jvm</artifactId>
145-
<scope>test</scope>
146-
</dependency>
147-
<dependency>
148-
<groupId>org.apache.httpcomponents</groupId>
149-
<artifactId>httpclient</artifactId>
150-
<scope>test</scope>
151-
</dependency>
152-
<dependency>
153-
<groupId>org.apache.httpcomponents</groupId>
154-
<artifactId>httpcore</artifactId>
155-
<scope>test</scope>
156-
</dependency>
157-
<dependency>
158-
<groupId>org.apache.httpcomponents</groupId>
159-
<artifactId>httpmime</artifactId>
158+
<groupId>software.amazon.awssdk</groupId>
159+
<artifactId>url-connection-client</artifactId>
160160
<scope>test</scope>
161161
</dependency>
162162
<dependency>
@@ -172,7 +172,6 @@
172172
</dependencies>
173173

174174
<build>
175-
<testSourceDirectory>src/test/kotlin</testSourceDirectory>
176175
<pluginManagement>
177176
<plugins>
178177
<plugin>
@@ -212,13 +211,13 @@
212211
</plugins>
213212
</pluginManagement>
214213
<plugins>
215-
<plugin>
216-
<artifactId>maven-checkstyle-plugin</artifactId>
217-
</plugin>
218214
<plugin>
219215
<groupId>com.github.gantsign.maven</groupId>
220216
<artifactId>ktlint-maven-plugin</artifactId>
221217
</plugin>
218+
<plugin>
219+
<artifactId>maven-checkstyle-plugin</artifactId>
220+
</plugin>
222221
<plugin>
223222
<groupId>org.apache.maven.plugins</groupId>
224223
<artifactId>maven-surefire-plugin</artifactId>
@@ -228,11 +227,12 @@
228227
</configuration>
229228
</plugin>
230229
<plugin>
231-
<groupId>org.jetbrains.kotlin</groupId>
232-
<artifactId>kotlin-maven-plugin</artifactId>
233-
<version>${kotlin.version}</version>
230+
<groupId>org.jetbrains.kotlin</groupId>
231+
<artifactId>kotlin-maven-plugin</artifactId>
232+
<version>${kotlin.version}</version>
234233
</plugin>
235234
</plugins>
235+
<testSourceDirectory>src/test/kotlin</testSourceDirectory>
236236
</build>
237237

238238
<profiles>

integration-tests/src/test/kotlin/com/adobe/testing/s3mock/its/AclIT.kt

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@ internal class AclIT : S3TestBase() {
6363
}.also { resp ->
6464
assertThat(resp.sdkHttpResponse().isSuccessful).isTrue()
6565
assertThat(resp.owner().id()).isNotBlank()
66-
assertThat(resp.owner().displayName()).isNotBlank()
6766
assertThat(resp.grants()).hasSize(1)
6867
assertThat(resp.grants().first().permission()).isEqualTo(FULL_CONTROL)
6968
}
@@ -86,7 +85,6 @@ internal class AclIT : S3TestBase() {
8685

8786
acl.owner().also { owner ->
8887
assertThat(owner.id()).isEqualTo(DEFAULT_OWNER.id)
89-
assertThat(owner.displayName()).isEqualTo(DEFAULT_OWNER.displayName)
9088
}
9189

9290
acl.grants().also {
@@ -102,7 +100,6 @@ internal class AclIT : S3TestBase() {
102100
.also { grantee ->
103101
assertThat(grantee).isNotNull
104102
assertThat(grantee.id()).isEqualTo(DEFAULT_OWNER.id)
105-
assertThat(grantee.displayName()).isEqualTo(DEFAULT_OWNER.displayName)
106103
assertThat(grantee.type()).isEqualTo(CANONICAL_USER)
107104
}
108105
}
@@ -126,7 +123,6 @@ internal class AclIT : S3TestBase() {
126123
it.accessControlPolicy {
127124
it.owner {
128125
it.id(userId)
129-
it.displayName(userName)
130126
}
131127
it
132128
.grants(
@@ -150,7 +146,6 @@ internal class AclIT : S3TestBase() {
150146
acl.owner().also {
151147
assertThat(it).isNotNull
152148
assertThat(it.id()).isEqualTo(userId)
153-
assertThat(it.displayName()).isEqualTo(userName)
154149
}
155150

156151
assertThat(acl.grants()).hasSize(1)

integration-tests/src/test/kotlin/com/adobe/testing/s3mock/its/BucketIT.kt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,6 @@ internal class BucketIT : S3TestBase() {
167167
}
168168
assertThat(it.prefix()).isNull()
169169
assertThat(it.continuationToken()).isNull()
170-
assertThat(it.owner().displayName()).isEqualTo("s3-mock-file-store")
171170
assertThat(it.owner().id()).isEqualTo("79a59df900b949e55d96a1e698fbacedfd6e09d98eacf8f8d5218e7cd47ef2be")
172171
}
173172
}
@@ -205,7 +204,6 @@ internal class BucketIT : S3TestBase() {
205204
}
206205
assertThat(it.prefix()).isEqualTo(bucketName)
207206
assertThat(it.continuationToken()).isNull()
208-
assertThat(it.owner().displayName()).isEqualTo("s3-mock-file-store")
209207
assertThat(it.owner().id()).isEqualTo("79a59df900b949e55d96a1e698fbacedfd6e09d98eacf8f8d5218e7cd47ef2be")
210208
}
211209
}
@@ -245,7 +243,6 @@ internal class BucketIT : S3TestBase() {
245243
}
246244
assertThat(it.prefix()).isNull()
247245
assertThat(it.continuationToken()).isNotNull
248-
assertThat(it.owner().displayName()).isEqualTo("s3-mock-file-store")
249246
assertThat(it.owner().id()).isEqualTo("79a59df900b949e55d96a1e698fbacedfd6e09d98eacf8f8d5218e7cd47ef2be")
250247
}.continuationToken()
251248

@@ -263,7 +260,6 @@ internal class BucketIT : S3TestBase() {
263260
}
264261
assertThat(it.prefix()).isNull()
265262
assertThat(it.continuationToken()).isNull()
266-
assertThat(it.owner().displayName()).isEqualTo("s3-mock-file-store")
267263
assertThat(it.owner().id()).isEqualTo("79a59df900b949e55d96a1e698fbacedfd6e09d98eacf8f8d5218e7cd47ef2be")
268264
}
269265
}

integration-tests/src/test/kotlin/com/adobe/testing/s3mock/its/GetPutDeleteObjectIT.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -536,7 +536,7 @@ internal class GetPutDeleteObjectIT : S3TestBase() {
536536
)
537537
}.also {
538538
assertThat(it.eTag()).isEqualTo(eTag.trim('"'))
539-
// default storageClass is STANDARD, which is never returned from APIs except by GetObjectAttributes
539+
// GetObjectAttributes returns the default storageClass "STANDARD", even though other APIs may not.
540540
assertThat(it.storageClass()).isEqualTo(StorageClass.STANDARD)
541541
assertThat(it.objectSize()).isEqualTo(UPLOAD_FILE_LENGTH)
542542
assertThat(it.checksum().checksumSHA1()).isEqualTo(expectedChecksum)

0 commit comments

Comments
 (0)