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.












































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 assessmentOur 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.
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.
Assess
Inventory, dependency and javax scan, a trial run on the target Java version, and a component-by-component plan with a fixed price.
Baseline
Characterisation and contract tests around current behaviour, and a performance baseline to compare against later.
Migrate in slices
One service or bounded context at a time — JVM, framework, security, persistence — each released and verified on its own.
Verify
Tests, performance comparison, output reconciliation and, where the risk justifies it, a shadow run in production.
Cut over & support
Staged traffic switch with rollback ready, a hypercare period, then Spring Boot and Java updates on retainer.
Case studies
Java platform migrations we have delivered
Monoliths split into Spring Boot services and Java applications consolidated in phases — each with the outcome the client measured.
Bank of Baroda — EWS Migration
Early Warning System Migration & Enhancement for Public Sector Bank. ATS led the complete migration to a Spring Boot + Angular architecture on Liferay DXP 7.4, introducing Angular portlets for dynamic UI, a multi-level maker-checker approval workflow, and predictive analytics modules for real-time financial risk flagging.
Read case study
Banking & Financial ServicesICICI Bank — DXP Migration
Consolidation of 4 Legacy Banking Applications into Single Liferay DXP Platform. ATS architected a phased migration strategy consolidating all four applications into a single Liferay DXP 7.4 instance.
Read case study
Financial Services / Credit RatingCareEdge Analytics & Advisory
Early Warning System (EWS) for Banking Risk Analytics. ATS Global Techsoft designed and deployed a mission-critical Early Warning System (EWS) on a modern Angular + Spring Boot architecture.
Read case study
Also in our Java practice
Spring Boot & Java development
New Spring Boot builds — microservices, REST APIs and batch pipelines — and the full list of our Java case studies.
ExploreLiferay upgrade & migration
When the Spring Boot services sit behind a Liferay portal, both upgrades are planned and released together.
ExploreBanking & financial services
Bank of Baroda, ICICI Bank and CareEdge — the sector where most of our Java migration work sits.
ExploreFAQs
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.