agentleFS
adityamparikhadityamparikh/spring-boot-4-migration-skill/SKILL.md

spring-boot-4-migration

Skill41 starsChanged 4 months agoApache-2.0View on GitHub

Guides Spring Boot version migrations: 2.7.x to 3.5.x, 3.5.x to 4.x, and minor upgrades within 4.x. Covers Java/Kotlin baseline upgrades, Jakarta EE namespace (javax to jakarta), Hibernate 5/6/7, Spring Security 5/6/7, modular starters, Jackson 3, Spring Framework 7, observability (Micrometer Tracing, OpenTelemetry), property and package relocations, JUnit 6, Testcontainers 2, MockitoBean, HTTP clients, resilience, AOT/native, API versioning, and OpenRewrite recipe automation. Supports all-at-once and gradual strategies with compatibility bridges. Java and Kotlin; Maven and Gradle. Trigger on requests like "upgrade/migrate to Spring Boot 3 or 4", "Spring Boot 2 to 3", "javax to jakarta", "upgrade to 4.1", "OpenRewrite Spring Boot", or any request moving a Spring Boot project to a newer major or minor version. Do NOT use for general Spring Boot development on a fixed version (new endpoints, services, JPA, tests) — use the spring-boot skill for that.

1 other project uses a version of this.

Adopted by

Most recently taken up by

  • Other versions1 project uses a version of this.

    Word for word · 0

    None found.

    Edited · 0

    None found.

    Wrote their own version · 1

    1. github/awesome-copilot★ 41ksame name

    How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.

The file

Show its rules and text

We split this skill into the rules it gives an agent

41 rules. About 0 are common, 17 are distinctive, and 24 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈17

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 24

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    If your project is on Boot 2.7.x or earlier, start with § "Coming from Spring Boot 2.7?" below, complete the 2 → 3 leg, then return here …

    line 60
  2. Very specific:

    Use Context7 (mcp__claude_ai_Context7__resolve-library-id then mcp__claude_ai_Context7__query-docs) for library docs.

    line 70
  3. Very specific:

    Use WebSearch / WebFetch for breaking-change announcements, CVEs, and community migration reports.

    line 72
  4. Very specific:

    Use gh for release notes (e.g., gh api repos/spring-projects/spring-boot/releases/latest).

    line 74
  5. Distinctive:

    Before starting any migration, detect the project's Java, Kotlin, Maven, and Gradle versions.

    line 79
  6. Very specific:

    Read references/toolchain-versions.md for the minimum/recommended versions table and per-tool upgrade commands.

    line 83
  7. Very specific:

    If your project is on Spring Boot 2.7.x (or earlier), do the 2.7 → 3.5 leg FIRST: Boot 2.7.x → Boot 3.5.x latest → Boot 4.x.

    line 88
  8. Very specific:

    Read references/spring-boot-2-to-3-migration.md.

    line 91
  9. Distinctive:

    All deprecated API calls from Boot 3.x are resolved where possible

    line 106
  10. Distinctive:

    If on Boot 3.4 or earlier, first upgrade to 3.5.x before proceeding

    line 107
  11. Distinctive:

    Check the official release notes for the target version

    line 112
  12. Very specific:

    Read references/gradual-upgrade-strategy.md FIRST.

    line 118
  13. Distinctive:

    Use this when: multiple teams, many services, phased rollouts, or when complete Jackson 3 / Security 7 migration will take more than one …

    line 125
  14. Distinctive:

    Before doing manual migration, consider using OpenRewrite recipes to automate the mechanical changes.

    line 134
  15. Distinctive:

    Update Boot/Framework versions, build plugins, and replace deprecated starters with modular equivalents.

    line 162
  16. Very specific:

    Read references/build-and-dependencies.md for complete starter mappings, build plugin changes, and step-by-step instructions.

    line 166
  17. Very specific:

    If your project uses Spring for Apache Kafka, also read references/spring-kafka-4-migration.md — Spring Kafka 4 changes the test starter …

    line 169
  18. Very specific:

    Compile check: Run mvn compile or gradle compileJava — fix any dependency resolution errors before continuing.

    line 175
  19. Very specific:

    Read references/property-changes.md for the complete property mapping.

    line 184
  20. Very specific:

    Use spring-boot-jackson2 bridge as a temporary stopgap if needed.

    line 190
  21. Very specific:

    Read references/jackson3-migration.md for complete details.

    line 192
  22. Very specific:

    If your project uses Spring Kafka JSON serializers/deserializers or header mappers, also read the Jackson section of …

    line 193
  23. Very specific:

    Read references/api-changes.md for the full list of relocated packages and removed APIs.

    line 204
  24. Very specific:

    If your project uses @EmbeddedKafka or EmbeddedKafkaZKBroker, also read references/spring-kafka-4-migration.md — Spring Kafka 4 removes the …

    line 234
  25. Distinctive:

    Run the verification script if available, otherwise manually check:

    line 257
  26. Very specific:

    Verify application starts: mvn spring-boot:run or gradle bootRun

    line 260
  27. Very specific:

    Check actuator health: curl localhost:8080/actuator/health

    line 261
  28. Distinctive:

    Verify liveness/readiness probes (now enabled by default)

    line 262
  29. Distinctive:

    Check structured logging output format

    line 263
  30. Distinctive:

    Run integration tests against each active Spring profile

    line 264
  31. Distinctive:

    Verify Docker image builds if using buildpacks or Jib

    line 265
  32. Distinctive:

    When upgrading between Spring Boot 4.x minor versions, follow this process:

    line 272
  33. Very specific:

    Read references/minor-version-changes.md for the target version.

    line 276
  34. Distinctive:

    If you are still using a bridge that is being removed in the target version, complete the corresponding migration track BEFORE upgrading.

    line 293
  35. Distinctive:

    Update the Spring Boot version in your build file to the target minor version's latest patch release.

    line 298
  36. Very specific:

    Run mvn compile / gradle compileJava — fix any new compilation errors.

    line 300
  37. Distinctive:

    Run the full test suite — fix any test failures.

    line 301
  38. Very specific:

    Run verify_migration.sh to confirm migration state.

    line 304
  39. Very specific:

    If build won't compile at all after version bump, use spring-boot-starter-classic and spring-boot-starter-test-classic to get running, then …

    line 327
  40. Very specific:

    If Jackson 3 migration is blocking, add spring-boot-jackson2 temporarily.

    line 328
  41. Very specific:

    If Spring Security changes are extensive, add spring-security-access bridge and upgrade to Security 6.5 preparation steps first (they …

    line 329

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Spring Boot 4 Migration Skill

Migrate Spring Boot 2.7.x applications to 3.5.x, then 3.5.x to 4.x, and stay current across 4.x minor versions, anchored to the official Spring Boot migration guides and release notes for each leg.

Currency

Last verified: 2026-07 (Spring Boot 4.1.0 / Framework 7.0.8 era). Facts here age. If the answer hinges on a version-sensitive fact — a removal target, a managed dependency version, an OpenRewrite recipe ID, a "deprecated in X" claim — and time has passed since the stamp above, spot-check current release notes or the tool's own source before asserting it. When current docs disagree with this file, the docs win: say so and note the line is stale.

Scope: 2.7.x → 3.5.x → 4.x and 4.x Minor Versions

This skill covers three scenarios:

  1. Legacy migration (2.7.x → 3.5.x) — the prelude. Covered in references/spring-boot-2-to-3-migration.md: Java 8/11 → 17 baseline, Jakarta EE namespace migration (javax.* → jakarta.*), Spring Security 5 → 6, Hibernate 5 → 6, observability migration to Micrometer Tracing/Observation, OpenRewrite recipe automation for every step. Reach Boot 3.5 latest patch here, then chain into the next scenario.
  2. Major migration (3.5.x → 4.0) — the bulk of this skill. All 9 phases, the gradual upgrade strategy, and the bridge system below.
  3. Minor version upgrades (4.0 → 4.1, 4.1 → 4.2, etc.) — tracked in references/minor-version-changes.md. Minor versions may deprecate APIs, remove compatibility bridges, change defaults, and introduce new features. Check that file before bumping to any new 4.x minor version.

If your project is on Boot 2.7.x or earlier, start with § "Coming from Spring Boot 2.7?" below, complete the 2 → 3 leg, then return here for the 3 → 4 phases.

Verify APIs Against Current Documentation

Many APIs change across these migrations. When unsure whether an API, property, or pattern is still valid for the target version, look it up rather than relying on model knowledge:

  • Use Context7 (mcp__claude_ai_Context7__resolve-library-id then mcp__claude_ai_Context7__query-docs) for library docs.
  • Use WebSearch / WebFetch for breaking-change announcements, CVEs, and community migration reports.
  • Use gh for release notes (e.g., gh api repos/spring-projects/spring-boot/releases/latest).

Toolchain Version Check (Do This First)

Before starting any migration, detect the project's Java, Kotlin, Maven, and Gradle versions. If any are below the minimums for the target Boot version, upgrade them BEFORE bumping Boot.

Read references/toolchain-versions.md for the minimum/recommended versions table and per-tool upgrade commands.

Coming from Spring Boot 2.7? Start here.

If your project is on Spring Boot 2.7.x (or earlier), do the 2.7 → 3.5 leg FIRST: Boot 2.7.x → Boot 3.5.x latest → Boot 4.x.

Read references/spring-boot-2-to-3-migration.md. It covers the toolchain bump, 2.7.18 pre-flight, OpenRewrite recipes (UpgradeSpringBoot_3_5 one-shot or per-minor), Jakarta namespace, Security 5 → 6, Hibernate 5 → 6, property migration, and observability migration to Micrometer Tracing.

Return here once ./mvnw verify / ./gradlew build passes on Boot 3.5 latest patch and spring-boot-properties-migrator is quiet.

Prerequisites

For 3.x → 4.0 migration:

  • Toolchain versions meet minimums (see Toolchain Version Check above)
  • Source project compiles and tests pass on Spring Boot 3.5.x (latest patch)
  • Java 17+ is available (Java 21+ recommended, Java 25 supported)
  • All deprecated API calls from Boot 3.x are resolved where possible
  • If on Boot 3.4 or earlier, first upgrade to 3.5.x before proceeding

For 4.x → 4.y minor version upgrade:

  • Project is on the latest patch of the current minor version (e.g., 4.0.x latest)
  • Review references/minor-version-changes.md for the target version
  • Check the official release notes for the target version
  • Resolve any deprecation warnings from the current version

Choose Your Migration Strategy

Strategy 1 — Gradual Upgrade (Recommended for enterprise/large codebases) Read references/gradual-upgrade-strategy.md FIRST. This models migration as a dependency graph: a Day-1 baseline using compatibility bridges, then 6 independent tracks (Starters, Jackson 3, Properties, Security, Testing, Framework 7) completed at your own pace. Key bridges:

  • spring-boot-starter-classic — restores 3.x monolithic auto-configuration
  • spring-boot-jackson2 — keeps Jackson 2 code working alongside Boot 4
  • spring-security-access — bridges legacy AccessDecisionManager/Voter Use this when: multiple teams, many services, phased rollouts, or when complete Jackson 3 / Security 7 migration will take more than one sprint.

Strategy 2 — All-at-Once (below) Execute all 9 phases sequentially in one effort. Best for greenfield projects, small codebases, or single-team ownership.

Automated Migration with OpenRewrite

Before doing manual migration, consider using OpenRewrite recipes to automate the mechanical changes. Run OpenRewrite FIRST to handle bulk find-replace operations, then use this skill's phases to address the remaining manual changes (Security DSL rewrites, behavioral differences, property semantics, etc.).

For the 2.7 → 3.5 leg (run before any 3 → 4 work): see the recipe table in references/spring-boot-2-to-3-migration.md § 3 — UpgradeSpringBoot_3_5 one-shot composes every step, or run per-minor for large codebases.

For the 3.5 → 4.0 leg:

Recipe IDCoverage
org.openrewrite.java.spring.boot4.UpgradeSpringBoot_4_0 (Community Edition variant available)Boot 3.5 → 4.0
org.openrewrite.java.spring.kafka.UpgradeSpringKafka_4_0Spring Kafka 3.x → 4.0 (use alongside the Boot 4 recipe — see references/spring-kafka-4-migration.md)
org.openrewrite.java.jackson.UpgradeJackson_2_3Jackson 2 → 3 package/import migration
org.openrewrite.java.spring.boot4.ReplaceMockBeanAndSpyBean@MockBean/@SpyBean → @MockitoBean/@MockitoSpyBean

See: moderne.ai/blog/spring-boot-4x-migration-guide. For the 4.0 recipe specifically: docs.openrewrite.org/recipes/java/spring/boot4/upgradespringboot_4_0-community-edition.

Invocation: ./mvnw org.openrewrite.maven:rewrite-maven-plugin:run -Drewrite.recipeArtifactCoordinates=org.openrewrite.recipe:rewrite-spring:RELEASE -Drewrite.activeRecipes=<recipe-id> (Maven) or ./gradlew rewriteRun -Drewrite.activeRecipes=<recipe-id> (Gradle).

Migration Workflow (All-at-Once)

Execute these phases IN ORDER. Each phase must compile and pass tests before proceeding to the next.

Phase 1: Build File Migration

Update Boot/Framework versions, build plugins, and replace deprecated starters with modular equivalents. Add modular test starters for each technology used in tests. Use classic starters as a stopgap if needed.

Read references/build-and-dependencies.md for complete starter mappings, build plugin changes, and step-by-step instructions.

If your project uses Spring for Apache Kafka, also read references/spring-kafka-4-migration.md — Spring Kafka 4 changes the test starter coordinates (spring-kafka-test → spring-boot-starter-kafka-test) and ships dedicated OpenRewrite recipes that should run alongside UpgradeSpringBoot_4_0.

Compile check: Run mvn compile or gradle compileJava — fix any dependency resolution errors before continuing.

Phase 2: Property Migration

Scan all application.properties, application.yml, profile-specific variants, and @SpringBootTest(properties = ...) annotations. Rename changed property keys (Jackson, MongoDB, session, actuator, Hibernate).

Read references/property-changes.md for the complete property mapping.

Phase 3: Jackson 3 Migration

Jackson 3 is the default in Boot 4. Migrate group IDs, packages, and renamed Boot classes (@JsonComponent → @JacksonComponent, etc.). Use spring-boot-jackson2 bridge as a temporary stopgap if needed.

Read references/jackson3-migration.md for complete details. If your project uses Spring Kafka JSON serializers/deserializers or header mappers, also read the Jackson section of references/spring-kafka-4-migration.md — Kafka serializer code moves to the tools.jackson.* package tree.

Phase 4: Package and API Relocations

Fix relocated imports (@EntityScan, BootstrapRegistry, etc.), removed APIs (PropertyMapper.alwaysApplyingNotNull, path matching options), and deprecated converters. Also migrate HTTP client code if applicable.

Read references/api-changes.md for the full list of relocated packages and removed APIs. Also read references/http-clients.md if your project uses RestClient, WebClient, @HttpExchange, or Feign.

Phase 5: Observability Migration

Replace individual Micrometer/OTel dependencies with the consolidated spring-boot-starter-opentelemetry starter, update OTLP properties, and rename observability modules. Actuator is now optional for OTel export.

Read references/observability-migration.md for complete details.

Phase 6: Spring Security 7 Migration

Migrate to Security 7 DSL (lambda-only, no and()), replace removed AuthorizationManager#check, switch to PathPatternRequestMatcher, and update Jackson/SAML integrations. Use spring-security-access bridge if legacy AccessDecisionManager/Voter code cannot migrate immediately.

Read references/spring-security7.md for complete details.

Phase 7: Testing Infrastructure Migration

Replace @MockBean/@SpyBean with @MockitoBean/@MockitoSpyBean (removed, not just deprecated). Add explicit auto-configure annotations for test HTTP clients. Migrate Testcontainers 2 module names/packages and adopt JUnit 6. Add modular test starters for each technology.

Read references/testing-migration.md for complete details. If your project uses @EmbeddedKafka or EmbeddedKafkaZKBroker, also read references/spring-kafka-4-migration.md — Spring Kafka 4 removes the ZooKeeper code paths (KRaft only) and the corresponding @EmbeddedKafka attributes.

Phase 8: Spring Framework 7 Specific Changes

Address JSpecify nullability (Kotlin impact), deprecated AntPathMatcher, MVC XML config removal, SpringExtension scope changes, Hibernate 7.1 entity mapping changes, and Spring Retry → Framework core retry migration.

Read references/spring-framework7.md for complete details. Also read references/resilience-migration.md if your project uses Spring Retry, @Retryable, @ConcurrencyLimit, or Resilience4j. If your project uses Spring for Apache Kafka, also read references/spring-kafka-4-migration.md — Spring Kafka 4 drops its Spring Retry dependency in favour of Framework 7 core retry, and BackOffValuesGenerator now uses BackOff instead of BackOffPolicy. Optionally read references/api-versioning.md for new API versioning capabilities introduced in Framework 7.

Phase 9: Final Verification

Run the verification script if available, otherwise manually check:

  1. mvn clean verify or gradle clean build — full compile + tests
  2. Verify application starts: mvn spring-boot:run or gradle bootRun
  3. Check actuator health: curl localhost:8080/actuator/health
  4. Verify liveness/readiness probes (now enabled by default)
  5. Check structured logging output format
  6. Run integration tests against each active Spring profile
  7. Verify Docker image builds if using buildpacks or Jib

Optionally read references/aot-native.md if you plan to adopt AOT processing, GraalVM native images, or the new AOT cache feature.

Minor Version Upgrades (4.0 → 4.1, 4.1 → 4.2, etc.)

When upgrading between Spring Boot 4.x minor versions, follow this process:

1. Check What Changed

Read references/minor-version-changes.md for the target version. Also consult the official release notes:

2. Bridge Removal Awareness

Minor versions are where compatibility bridges get removed. Before upgrading, check whether any bridges you depend on are being dropped:

BridgeIntroducedExpected Removal
spring-boot-jackson24.04.3.0 (per Javadoc forRemoval)
spring-boot-starter-classic4.05.0
spring-boot-starter-test-classic4.05.0
Deprecated starter names4.05.0

If you are still using a bridge that is being removed in the target version, complete the corresponding migration track BEFORE upgrading.

3. Upgrade Process

  1. Update the Spring Boot version in your build file to the target minor version's latest patch release.
  2. Run mvn compile / gradle compileJava — fix any new compilation errors.
  3. Run the full test suite — fix any test failures.
  4. Review deprecation warnings in both build output and application logs. These signal what will break in the NEXT minor version.
  5. Run verify_migration.sh to confirm migration state.

4. New Features

Each minor version introduces new features and auto-configurations. These are opt-in and don't require action, but you may want to adopt them. Check the "New and Noteworthy" section of each release's notes.

Troubleshooting

Common Compilation Errors

ErrorCauseFix
ClassNotFoundException: ...autoconfigure...Modular starters neededAdd specific spring-boot-starter-X
NoSuchMethodError: PropertyMapper.alwaysApplyingNotNullAPI removedUse always() instead
Cannot resolve symbol JsonComponentRenamedUse @JacksonComponent
Package com.fasterxml.jackson does not existJackson 3 packagesChange to tools.jackson
Cannot resolve symbol MockBeanDeprecated/removedUse @MockitoBean
ClassNotFoundException: RestClientBuilderCustomizerElasticsearch changeUse Rest5ClientBuilderCustomizer

Quick Fixes

  • If build won't compile at all after version bump, use spring-boot-starter-classic and spring-boot-starter-test-classic to get running, then incrementally migrate to modular starters. See references/gradual-upgrade-strategy.md for the full Day-1 baseline.
  • If Jackson 3 migration is blocking, add spring-boot-jackson2 temporarily. This is a first-class bridge — see Track B in the gradual strategy.
  • If Spring Security changes are extensive, add spring-security-access bridge and upgrade to Security 6.5 preparation steps first (they provide opt-out flags for 7.0 breaking changes). See Track D in the gradual strategy.
  • For enterprise rollouts across many services, use the Wave 1-4 approach in references/gradual-upgrade-strategy.md to minimize blast radius.

Reference File Index

FileWhen to read
references/toolchain-versions.mdToolchain check — Java/Kotlin/Maven/Gradle minimums and per-tool upgrade commands
references/spring-boot-2-to-3-migration.mdBoot 2.7.x → 3.5.x prelude — Java baseline, Jakarta migration, Hibernate 5 → 6, Security 5 → 6, OpenRewrite recipes, per-minor highlights
references/gradual-upgrade-strategy.mdFIRST (for 3 → 4) — migration dependency graph, bridges, independent tracks, enterprise rollout
references/build-and-dependencies.mdPhase 1 / Track A — full starter mapping tables, build plugin changes
references/property-changes.mdPhase 2 / Track C — all property key renames and value changes
references/jackson3-migration.mdPhase 3 / Track B — Jackson 3 packages, APIs, compatibility mode
references/api-changes.mdPhase 4 — package relocations, removed APIs, renamed classes
references/observability-migration.mdPhase 5 — OpenTelemetry starter, OTLP properties, module renames, Actuator decoupling
references/spring-security7.mdPhase 6 / Track D — Security 7 breaking changes and DSL migration
references/testing-migration.mdPhase 7 / Track E — 2.7→3 testing leg (JUnit 4→5, javax→jakarta tests), then 3.5→4: MockBean, Testcontainers 2, JUnit 6, RestTestClient
references/spring-framework7.mdPhase 8 / Track F — Framework 7 changes, JSpecify, path matching
references/http-clients.mdHTTP clients — RestClient, WebClient, @HttpExchange, Feign migration, RestTestClient
references/api-versioning.mdAPI versioning — strategies, semantic ranges, client-side, deprecation, testing
references/resilience-migration.mdResilience — Spring Retry → Framework 7, @Retryable, @ConcurrencyLimit, Resilience4j
references/spring-kafka-4-migration.mdSpring for Apache Kafka 4 — Apache Kafka 4 client (KRaft only), EmbeddedKafkaZKBroker removal, spring-boot-starter-kafka-test, Jackson 3 serializers, Spring Retry removal, KIP-848 / KIP-932, OpenRewrite recipes
references/aot-native.mdAOT/Native — BeanRegistrar, RuntimeHints, Spring Data AOT, GraalVM 25, AOT Cache
references/minor-version-changes.md4.x minor upgrades — changes per minor version, bridge removals, new features
scripts/verify_migration.shPhase 9 — bridge-aware verification with PASS/FAIL/WARN/BRIDGE

Authoritative external sources for each leg are listed at the bottom of the corresponding reference file.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.