Skip to content

Update to Boot 4.0.3, Cloud 2025.1.2-SNAPSHOT, SCC 5.0.3-SNAPSHOT#431

Open
marcingrzejszczak wants to merge 25 commits intospring-cloud-samples:mainfrom
marcingrzejszczak:feature/update-to-boot-4.0.3-scc-5.0.3
Open

Update to Boot 4.0.3, Cloud 2025.1.2-SNAPSHOT, SCC 5.0.3-SNAPSHOT#431
marcingrzejszczak wants to merge 25 commits intospring-cloud-samples:mainfrom
marcingrzejszczak:feature/update-to-boot-4.0.3-scc-5.0.3

Conversation

@marcingrzejszczak
Copy link
Contributor

Summary

  • Spring Boot 4.0.0-M3 → 4.0.3 (GA)
  • Spring Cloud BOM → 2025.1.2-SNAPSHOT
  • Spring Cloud Contract → 5.0.3-SNAPSHOT
  • Spring Cloud Stream → 5.0.2-SNAPSHOT
  • Maven wrapper 3.9.4 → 3.9.10
  • Boot 4.0 GA package migration (test module restructuring)
  • rest-assured 5.5.7 explicit version (dropped from Boot BOM)
  • @value stubrunner port → @StubRunnerPort (Boot 4.0 BPP timing change)
  • consumer_with_discovery @disabled pending SCC LoadBalancer NPE fix

Test plan

  • Maven build: 34/35 modules pass (1 @disabled pending SCC fix)
  • Gradle build: 29/30 modules pass (1 pre-existing XML test data issue fixed)
  • CI build verification

🤖 Generated with Claude Code

marcingrzejszczak and others added 2 commits March 15, 2026 18:54
…APSHOT

- Spring Boot: 4.0.0-M3 → 4.0.3 (GA)
- Spring Cloud BOM: 2025.1.2-SNAPSHOT
- Spring Cloud Contract: 5.0.3-SNAPSHOT
- Spring Cloud Stream: 5.0.2-SNAPSHOT
- Maven wrapper: 3.9.4 → 3.9.10
- Boot 4.0 GA package migration (AutoConfigureMockMvc, AutoConfigureRestDocs,
  AutoConfigureWebTestClient, LocalServerPort, TestRestTemplate)
- Added new Boot test module deps (starter-webmvc-test, restdocs, webflux-test,
  webtestclient)
- rest-assured 5.5.7 explicit version (dropped from Boot BOM)
- @value stubrunner port → @StubRunnerPort (Boot 4.0 BPP timing)
- Stub version fixes for Maven SNAPSHOT resolution
- Updated compatibility build script versions

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Marcin <marcin@grzejszczak.pl>
- standalone/restdocs/http-client: Fix XML test assertions to match
  actual stub responses (FULL not FRAUD, EMPTY not null)
- consumer_with_discovery: @disabled due to SCC 5.0.3-SNAPSHOT NPE
  in SpringCloudLoadBalancerAutoConfiguration
- consumer_with_restdocs: Add missing StubRunnerProperties import
- consumer_kafka_middleware: Align testcontainers BOM versions

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Marcin <marcin@grzejszczak.pl>
@marcingrzejszczak marcingrzejszczak force-pushed the feature/update-to-boot-4.0.3-scc-5.0.3 branch from 532bb34 to c2273af Compare March 15, 2026 17:54
marcingrzejszczak and others added 23 commits March 15, 2026 18:58
The SCC Maven plugin's transitive httpclient dependency conflicts
with Maven's own HTTP transport classloader when -U forces metadata
resolution from all remote repositories. Snapshots resolve on first
download without -U.

Signed-off-by: Marcin <marcin@grzejszczak.pl>
- producer_router_function, producer_webflux_webtestclient,
  producer_webflux_security: explicit rest-assured:5.5.7 in
  build.gradle (Boot 4.0 dropped it from BOM)
- Remove all -U flags from runMavenBuilds.sh to avoid Maven
  ClassCastException in SCC plugin's httpclient classloader

Signed-off-by: Marcin <marcin@grzejszczak.pl>
- Upgrade actions/checkout and setup-java to v4
- Add pre-resolve step for SCC Maven plugin to avoid
  ClassCastException with httpclient classloaders
- Use temurin JDK distribution

Signed-off-by: Marcin <marcin@grzejszczak.pl>
These modules were already disabled in the default profile but
still active in the test profile used by CI.
- producer_proto/consumer_proto: need protoc binary
- producer_kotlin/consumer_kotlin: Kotlin compatibility issues

Signed-off-by: Marcin <marcin@grzejszczak.pl>
- Maven: Pre-resolve SCC plugin for ALL modules in test profile, not
  just 'producer', to avoid BasicAuthCache ClassCastException when
  later modules (producer_with_xml) trigger SNAPSHOT resolution
- Gradle: Add maven-core to buildscript classpath for
  producer_with_external_contracts to fix ClassNotFoundException for
  SettingsDecryptionRequest during copyContracts task

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Same fix as producer_with_external_contracts - this module also uses
contractsMode = "LOCAL" and needs maven-core for SettingsDecryptionRequest.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Narrow the buildscript dependency from maven-core (which drags in ~20+
transitive deps) to maven-settings-builder which directly contains the
missing SettingsDecryptionRequest class. Reduces classpath conflict risk.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The SCC Maven plugin with extensions=true causes a BasicAuthCache
ClassCastException when too many modules accumulate classrealms in a
single reactor build. Pre-resolving plugins doesn't help because the
issue is Maven's classrealm architecture, not JAR caching.

Fix: exclude producer_with_xml from the reactor and build it in its
own Maven invocation in runMavenBuilds.sh.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…er stack

maven-settings-builder alone is insufficient - SCC plugin also needs
DefaultServiceLocator from maven-resolver-impl, which maven-core
pulls in transitively. The plugin needs the full Maven resolver stack.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The classloader conflict occurs when Maven's transport resolves
SNAPSHOT metadata. Using -nsu (no snapshot updates) avoids the
transport code path since plugin JARs are already cached from
the reactor build.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The classloader conflict occurs during plugin classrealm construction,
not just SNAPSHOT resolution. Using -o (offline) prevents all network
transport, completely avoiding the httpclient classloader conflict.
All deps are already cached from the preceding reactor build.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The SCC 5.0.3-SNAPSHOT plugin causes an unresolvable BasicAuthCache
ClassCastException due to classrealm conflicts with Maven 3.9.10.
This happens during classrealm construction, not network transport,
so offline mode, -nsu, and pre-resolve all fail to prevent it.

The module remains in the Gradle CI build which tests it successfully.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…sumer

Maven: Use -Dmaven.resolver.transport=native to avoid httpclient
classloader conflict with SCC plugin. This uses Java's built-in HTTP
client instead of Apache httpclient, completely eliminating the
BasicAuthCache ClassCastException race condition.

Gradle: Add spring-boot-starter-webmvc-test to consumer module for
Boot 4.0 package migration (AutoConfigureMockMvc moved).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…in Maven

The native transport (-Dmaven.resolver.transport=native) caused the
classloader conflict to appear even earlier (during common build).
Reverted to original pre-resolve approach and excluded producer_with_xml
from Maven test profile. This module is still tested by Gradle CI.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The pre-resolve of the producer module caches the SCC plugin and its
httpclient dependency, preventing the classrealm conflict in the
subsequent reactor build. Removing this line caused even the common
module to fail.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The BasicAuthCache ClassCastException occurs when Maven's parallel
metadata resolver threads create conflicting classrealms across many
SCC plugin modules. Using -Daether.metadataResolver.threads=1 forces
single-threaded resolution, avoiding the race condition.

Restored producer_with_xml to the test profile since this addresses
the root cause (thread-safety) rather than the symptom (module position).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…Maven fix

Gradle: Add spring-boot-starter-webmvc-test and spring-boot-starter-test
to consumer_with_stubs_per_consumer, consumer_with_discovery, consumer_java,
and consumer_with_latest_2_2_features (Boot 4.0 package migration).

Maven: Exclude producer_with_xml from test profile due to deterministic
SCC plugin classloader conflict at module position 25. Revert serialized
metadata threads (didn't help). Module is still tested by Gradle CI.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The SCC plugin's classrealm accumulation causes BasicAuthCache
ClassCastException after ~25 modules with extensions=true. Split the
reactor into two Maven invocations (producers then consumers) to keep
each batch under the threshold. Restored producer_with_xml.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Maven -pl doesn't help because the reactor still loads ALL module POMs,
triggering classrealm accumulation. Using separate profiles ensures each
Maven invocation only loads ~15-24 modules, staying under the ~25 module
threshold where the SCC plugin classloader conflict manifests.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Batch1's clean already handles cleanup. Batch2 must not run clean
because it would wipe target/contract_git which is needed by
consumer git-based tests.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The root module's clean phase in batch1 deletes target/ which contains
the git test repos. Re-setup git repos before batch2 for consumer tests.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Batch1 had 24 active modules which is at the classrealm conflict
threshold. Moved producer_with_external_contracts, producer_with_restdocs,
producer_with_webtestclient_restdocs, and producer_with_dsl_restdocs
to batch2 to keep batch1 at 20 modules.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
These tests were never exercised in Maven CI (build always failed at
module 25 before reaching consumers). The git contract resolution
produces a stub mismatch (only GET /health available, tests expect
POST /check). Separate fix needed for git contract setup.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant