ATS Global
Spring Boot · Java · Migration

Spring Boot & Java migration, one service at a time

A great deal of enterprise Java still runs on Java 8 or 11, on Spring Boot 2 or on plain Spring MVC inside an application server. We move it to a current Spring Boot on Java 17, 21 or 25 — starting with a fixed-fee assessment that tells you which migration path you are on, what will break and what it will cost, and finishing with a cut-over you can roll back.

Appistoki logo
Capgemini logo
Careedge Global logo
CES logo
Cignex logo
EngineersMinds logo
Fulcrum logo
IGT Solutions logo
InfoBeans logo
ITC logo
Knowarth logo
Larsen & Toubro logo
Lister logo
Ness logo
NetSol logo
PodEngine logo
Raising logo
Sharp logo
Triton logo
Wego logo
Wipro logo
Xebia logo
39case studies built on Spring Boot or Java
3×data volume absorbed after Bank of Baroda's EWS moved to Spring Boot services
0records lost in that migration, verified before cut-over
4 → 1Java applications consolidated onto one platform, one at a time (ICICI Bank)

What a migration covers

The six workstreams in a Spring Boot migration

Changing a version number in the build file is the smallest part of the job. The namespace, the security configuration, the persistence layer, the server it runs on and the tests that prove nothing changed all move together — so we plan them as one migration on the same engineering rules as our Spring Boot builds.

Assessment & migration plan

An inventory of Java and Spring versions, every dependency and its javax usage, the application server, the build, the test coverage and the deployment path — each item classified as upgrade, replace or retire, with a fixed price for the whole.

Spring Boot 2 → 3 and 4

The javax-to-jakarta namespace change, Spring Security's new configuration model, Hibernate 6 behaviour changes, renamed properties and tracing moved from Sleuth to Micrometer — mechanical changes automated, behavioural ones reviewed by hand.

Java 8 / 11 → 17, 21 or 25

JDK modules that were removed, internal APIs now encapsulated, build plugins and agents that need newer versions, garbage-collector and TLS defaults that changed — then the newer language and runtime features, such as virtual threads on Java 21, where they help.

Spring MVC & monoliths → Spring Boot

XML configuration to Java configuration, WAR deployments on WebLogic, WebSphere or JBoss to Spring Boot services, and monoliths split one bounded context at a time — the path Bank of Baroda's Early Warning System took.

Security & dependency upgrade

Spring Security rewritten as SecurityFilterChain beans, OAuth 2.0, JWT and SAML re-tested, end-of-life libraries replaced, and dependency scanning added to CI so the estate does not drift back out of support.

Testing, parallel run & cut-over

Characterisation tests written before anything changes, contract tests on every API, a performance baseline to compare against, and a staged cut-over with the old version kept ready for rollback.

Why now

Why an old Spring Boot or Java version is a cost, not a saving

Open-source support for Spring Boot 2.7, the last of the 2.x line, ended in November 2023. Since then security fixes for it have come only through paid commercial support, and the libraries around it have moved on: Spring Boot 3 and later need Java 17 as a minimum, use the jakarta namespace, and are what current versions of Hibernate, Spring Security, Spring Cloud and most drivers and SDKs are built for. Every year an application stays behind, the gap it eventually has to cross gets wider.

The risk is usually less visible than the cost. A Java service on an unsupported framework tends to sit behind a login, handle personal or financial data, and depend on dozens of transitive libraries — each a potential vulnerability that the security team cannot patch without the upgrade nobody has scheduled. For our banking and government clients, that is an audit finding, not a technical preference.

There is a positive case too. Newer Java releases bring a faster runtime and better garbage collectors, Java 21 adds virtual threads that Spring Boot can use for request handling with a single property, and current Spring Boot brings first-class observability, native-image support and a security model that is easier to reason about. We measure the effect against a baseline taken before the migration starts, and report the numbers rather than promise them.

The assessment

A fixed-fee assessment that decides the path before anyone changes code

Every migration starts with a one- to two-week assessment of the code base as it actually runs. We read the build files and the dependency tree, find every use of javax packages and removed JDK APIs, list the application servers, agents and deployment scripts, check what the tests cover, and run the application on the target Java version to see what fails first. Automated tools do the counting; engineers decide what each finding means.

The output is a plan you can act on with or without us: every module and dependency classified as upgrade, replace or retire, with effort against each; the migration path that fits; the behaviour changes that need a product decision rather than a code change; the order in which services move; and a fixed price for the implementation.

  • Code — Java and Spring versions, javax usage, removed APIs, custom security and persistence code
  • Dependencies — every library and its supported version, end-of-life components that need replacing
  • Runtime — application server, JVM flags, agents, container images, deployment pipeline
  • Tests — what is covered, what is not, and what needs characterisation tests before migration
  • Deliverables — component-by-component plan, migration path, order of work, fixed-price proposal

Migration paths

The four Spring Boot migration paths, and how we choose between them

Spring Boot 2.7 to 3 is the most common path and the most mechanical one. The javax-to-jakarta change touches imports across the code base and in every library that shares those types; Spring Security drops WebSecurityConfigurerAdapter in favour of SecurityFilterChain beans; Hibernate 6 changes how some queries and ID generators behave; tracing moves from Spring Cloud Sleuth to Micrometer Tracing; and a number of configuration properties are renamed. Recipe-based tools such as OpenRewrite handle most of the mechanical edits; the security configuration and the persistence behaviour are reviewed and tested by hand. From a clean Spring Boot 3 code base, the step to Spring Boot 4 is much smaller.

Spring Boot 1.x, or 2.x before 2.7, goes to 2.7 first. Spring's own guidance is to reach the last 2.x release, clear its deprecation warnings and only then make the jump to 3 — it turns one large, risky change into two smaller ones, each of which can be released and verified on its own.

Java 8 or 11 to 17, 21 or 25 can be done on its own, before the framework moves. Spring Boot 2.7 runs on Java 17, so upgrading the JVM first and the framework second is a common way to split the risk. The work is replacing JDK modules that were removed (JAXB and JAX-WS among them), opening or removing access to internal JDK APIs, updating build plugins, agents and bytecode libraries, and checking garbage-collector and TLS behaviour under production-shaped load.

Spring MVC applications that are not on Spring Boot at all — WAR files on WebLogic, WebSphere, JBoss or Tomcat, configured in XML — are the largest job. We move configuration to Java, externalise it, and either keep a WAR on a current Jakarta EE server or move to Spring Boot's embedded server in a container. Where the application is a monolith, we split it one bounded context at a time behind a routing layer, so the old and new code run side by side until the last route moves. How the resulting services are designed is covered on our Spring Boot microservices page.

Proof from banking

What this looks like on a real platform

Bank of Baroda's Early Warning System was a monolith built for one bank's data. After the mergers with Vijaya Bank and Dena Bank it had to ingest the merged entities' data as well, under tighter RBI scrutiny. We decomposed it into Spring Boot microservices on Java 11 behind Liferay DXP 7.4, with Angular portlets for the risk officers. Ingestion now scales independently of the analytics and the approval workflow — which is how the system absorbed three times the data volume — and risk-review cycles fell from two days to four hours. The migration plan included verification before cut-over, and no data was lost.

ICICI Bank ran four separate Java applications, each with its own infrastructure, team and login. We moved them onto one platform in phases, one application at a time, each phase ending with that application's users and data fully moved before the next began. The business logic stayed in Java 11 and Spring MVC where it belonged, while the screens were rebuilt as React portlets — infrastructure cost fell 45 % and pages loaded 55 % faster.

The same discipline runs through our CareEdge work, where several applications were consolidated into one platform alongside a Spring Boot early-warning system. The architecture behind these systems is written up in Building an Early Warning System on Spring Boot.

Testing

Proving that nothing changed, before and after the switch

The hardest part of a migration is knowing that the new version behaves like the old one. Before we change code we write characterisation tests around the behaviour that matters — API responses, calculations, scheduled jobs, error handling — so the old system documents itself. Contract tests pin every API the service exposes and consumes, and integration tests run against real databases and brokers with Testcontainers rather than mocks.

We also take a performance baseline on the old version — throughput, latency, memory, start-up time — and run the same load against the migrated one. For data-heavy services we compare outputs of the old and new versions on the same input, and where the risk justifies it we run both in parallel in production with the new one in shadow mode before it takes real traffic.

  • Characterisation tests written first, against the running system
  • Contract tests on every API, so consumers are not surprised
  • Testcontainers integration tests against real databases and message brokers
  • Performance baseline before migration, compared after
  • Shadow or parallel running for high-risk, data-heavy services

Timeline & cost

How long a Spring Boot migration takes, and what sets the price

The assessment is a fixed fee and takes one to two weeks. As a rough guide, a single Spring Boot 2.7 service with reasonable test coverage moves to Spring Boot 3 in one to three weeks; a service on an older Spring Boot, or with little test coverage, takes longer because the tests have to be written first; and a Spring MVC monolith split into Spring Boot services runs over several months, released in slices so the business sees progress long before the last route moves. The assessment turns these ranges into a dated plan for your code base.

Six things set the cost: the number of services and modules; how much of the code depends on javax APIs and removed JDK features; custom security and persistence code; test coverage, because missing tests have to be written before anything else; the number of environments and the state of the pipeline; and how much downtime the business can accept. We quote the implementation as a fixed price for the scope in the assessment, with change control for anything found afterwards.

Cut-over & after

Cut-over, rollback and keeping the estate current

Cut-over is rehearsed to a script. Services move one at a time, behind a gateway or load balancer that can send traffic to either version; the old version stays deployed and ready for an agreed rollback window; and the decision to go ahead or roll back is made against a checklist of tests, metrics and reconciliation results, not a feeling. Database schema changes are versioned with Flyway or Liquibase so that they move with the code and can be rolled forward or back.

After cut-over comes a hypercare period with the engineers who did the migration on call, then an optional support retainer that applies Spring Boot and Java updates as they are released — so the next upgrade is a routine dependency bump rather than another project. When the services sit behind a Liferay portal, our Liferay upgrade and migration practice plans both upgrades together.

Still on Spring Boot 2 or Java 8?

A one- to two-week fixed-fee assessment gives you a component-by-component migration plan, the path you are on and a fixed price — whether or not you go ahead with us.

Book a migration assessment

Our technology stack

What a migrated Spring Boot estate runs on

Current Spring Boot on a long-term-support Java release, the databases you already run, containers built and deployed by CI, and the cloud or servers you already use.

Java logoJavaSpring Boot logoSpring BootLiferay DXP logoLiferay DXPPostgreSQL logoPostgreSQLMySQL logoMySQLDocker logoDockerJenkins logoJenkinsGitHub Actions logoGitHub ActionsAWS logoAWSAzure logoAzure

How we deliver

From assessment to a supported Spring Boot estate

Five phases, each ending in something you can check: a plan, a test baseline, migrated services, verified results, and a cut-over with a rollback you did not need.

STEP 01

Assess

Inventory, dependency and javax scan, a trial run on the target Java version, and a component-by-component plan with a fixed price.

STEP 02

Baseline

Characterisation and contract tests around current behaviour, and a performance baseline to compare against later.

STEP 03

Migrate in slices

One service or bounded context at a time — JVM, framework, security, persistence — each released and verified on its own.

STEP 04

Verify

Tests, performance comparison, output reconciliation and, where the risk justifies it, a shadow run in production.

STEP 05

Cut over & support

Staged traffic switch with rollback ready, a hypercare period, then Spring Boot and Java updates on retainer.

FAQs

Spring Boot migration — questions we are asked first

Should we move to Spring Boot 3 or go straight to Spring Boot 4?+

From Spring Boot 2, the large step is the move to the jakarta namespace and Spring Security's new configuration, which arrives with Spring Boot 3. We usually make that step first, release it, and then move to the current Spring Boot line, which from a clean Spring Boot 3 code base is a much smaller change. The assessment decides whether doing both in one project is safe for your code.

Can we upgrade Java without upgrading Spring Boot?+

Yes, within limits. Spring Boot 2.7 runs on Java 17, so many teams move the JVM first and the framework second, which splits the risk into two releases. Spring Boot 3 and later need Java 17 as a minimum, so a Java 8 application has to move its JVM before or with the framework.

How long does a Spring Boot 2 to 3 migration take?+

As a rough guide, one to three weeks for a single Spring Boot 2.7 service with reasonable test coverage; longer for older Spring Boot versions or code with few tests, because the tests are written first; several months, delivered in slices, for a Spring MVC monolith split into services. The fixed-fee assessment turns this into a dated plan for your code base.

Will our WebLogic, WebSphere or JBoss server still work?+

Spring Boot 3 needs a Jakarta EE 9 or later servlet container. Many older WebLogic, WebSphere and JBoss versions implement the older javax-based Java EE and cannot run it. We either move the application to Spring Boot's embedded server in a container, which is what most of our clients choose, or upgrade the application server to a Jakarta-compatible version.

Do you use automated migration tools?+

Yes, for the mechanical changes: recipe-based tools such as OpenRewrite handle package renames, property changes and deprecated API replacements across a large code base quickly and consistently. Security configuration, persistence behaviour and anything that changes what the application does are reviewed and tested by engineers.

Will there be downtime or data loss?+

Services move one at a time behind a gateway that can route to either version, with the old version kept ready for rollback, so most migrations need no downtime beyond a normal release. Schema changes are versioned with Flyway or Liquibase and outputs are reconciled before cut-over; Bank of Baroda's EWS migration was completed with no data lost.

Let’s work together

Tell us what you are running

Send the Java and Spring Boot versions, the application server and roughly how many services — we will come back within a couple of days with the likely migration path and a bracket, and a fixed price after the assessment.