Upgrading a large Java 8 + Spring Boot 2.1 codebase to Java 17 feels scary.
Modules, removed APIs, dependency conflicts, Jakarta migration β a lot can break.
This guide gives you a safe, production-tested path to upgrade without downtime.
β Why Upgrade to Java 17?
| Benefit | Why It Matters |
|---|---|
| LTS until 2029 | Long-term support & security updates |
| 40β60% faster JVM | Better GC (G1/ZGC), faster execution |
| Modern language features | var, records, sealed classes, switch expressions |
| Better memory usage | Reduced heap footprint |
| More secure | Stronger TLS, crypto, JVM rules |
π§ Safe Upgrade Path (The Only Path That Wonβt Break Everything)
- Phase 1 β Java 8 β Java 11
- Phase 2 β Spring Boot 2.1 β 2.7
- Phase 3 β Java 11 β Java 17
- Phase 4 β Spring Boot 2.7 β 3.x (Jakarta)
πΉ Phase 1 β Upgrade Java 8 β Java 11
Update pom.xml:
<properties>
<java.version>11</java.version>
</properties>
Fix removed Java EE modules:
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
Check incompatible libraries:
mvn dependency:tree
πΉ Phase 2 β Upgrade Spring Boot 2.1 β 2.7
Update Boot version:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.18</version>
</parent>
Things to fix before Spring Boot 3:
- Replace Springfox with springdoc-openapi
- Move to new constructor-binding style for
@ConfigurationProperties - Clean deprecated security config
- Start migrating from
RestTemplateβWebClient(optional)
πΉ Phase 3 β Upgrade Java 11 β Java 17
Update in pom.xml:
<properties>
<java.version>17</java.version>
</properties>
Common fixes:
- Reflection warnings (
--add-opens) - Replace any legacy HTTP clients
- Ensure all dependencies support Java 17
πΉ Phase 4 β Upgrade Spring Boot 2.7 β 3.x (Jakarta Mandatory)
Spring Boot 3 uses Jakarta EE 9+.
All javax.* packages are now jakarta.*.
Example:
import javax.servlet.http.HttpServletRequest;
becomes:
import jakarta.servlet.http.HttpServletRequest;
Update Boot:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.4</version>
</parent>
Required Migrations
1. Javax β Jakarta
Run to find:
grep -R "javax" src/
2. Spring Security Rewrite
Old:
http.authorizeRequests().anyRequest().authenticated();
New:
http.authorizeHttpRequests(auth -> auth
.requestMatchers("/api/**").authenticated()
);
3. Hibernate/JPA
Replace:
<groupId>javax.persistence</groupId>
with:
<groupId>jakarta.persistence</groupId>
4. Swagger Migration
Remove Springfox and add:
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.6.0</version>
</dependency>
π§ͺ Testing Strategy
Add JDK 17 to CI
- name: Setup JDK
uses: actions/setup-java@v3
with:
distribution: 'temurin'
java-version: '17'
Run full integration tests
- Controllers
- WebClient/Feign
- Kafka/RabbitMQ
- Flyway/Liquibase
- Full database workflows
π§° Common Issues & Fixes
| Error | Fix |
|---|---|
ClassNotFound: javax.* |
Replace with jakarta |
| Spring Security not working | Rewrite security config |
| Swagger UI not loading | Use springdoc-openapi, not Springfox |
| Reflection warnings | Temporary: --add-opens
|
π Final Upgrade Checklist
Java Upgrade
- [ ] Java 8 β 11
- [ ] Fix removed Java EE modules
- [ ] Java 11 β 17
- [ ] Update CI pipeline
Spring Boot Upgrade
- [ ] Upgrade 2.1 β 2.7
- [ ] Remove deprecated Spring APIs
- [ ] Upgrade 2.7 β 3.x
- [ ] Migrate javax β jakarta
- [ ] Update Spring Security
- [ ] Replace Springfox β springdoc
- [ ] Update Hibernate/JPA
- [ ] Run full integration tests
π Conclusion
Upgrading Java 8 + Spring Boot 2.1 directly to Java 17 + Spring Boot 3.x is risky.
But using the safe 4-phase approach prevents almost all breaking changes:
1οΈβ£ Java 8 β 11
2οΈβ£ Spring Boot 2.1 β 2.7
3οΈβ£ Java 11 β 17
4οΈβ£ Spring Boot 2.7 β 3.x (Jakarta)
Follow the checklist, fix deprecated APIs early, and test thoroughly β and your upgrade will be smooth.
Top comments (0)