Legacy Java EE Support and Modernization
Many enterprise applications have been in production for ten, fifteen, or twenty years. They still perform an important function, but cannot simply be replaced.
At the same time, keeping them reliable and maintainable becomes increasingly difficult. Knowledge of the application concentrates among only a few people, former developers leave the company, and older frameworks or runtime environments need to be reconciled with current security and infrastructure requirements.
I support teams in developing and technically modernizing existing Java EE applications—or take full responsibility for the work.
I have successfully done both: worked as part of a team and taken full responsibility for an application. Still, I prefer having at least one sparring partner who can dedicate an hour or two each week to discussing options, trade-offs, and priorities. The decisions tend to be better, and teamwork is simply more enjoyable.
Assessment
I work my way into existing codebases—even when documentation is incomplete or missing altogether, key decisions were made many years ago, and the people who could explain the reasoning behind them are no longer available.
The first step is to understand the system well enough to make even substantial changes in a controlled manner and at an acceptable level of risk.
Fixing defects and developing functionality further
A legacy application is not a finished system. Business requirements change, new interfaces are needed, and existing features must be adapted.
I can help with:
- diagnosing and fixing defects
- analyzing production issues that are hard to reproduce
- stabilizing problematic areas
- implementing new requirements
Updating dependencies and runtime environments
Even when the application itself remains in place, its technical foundation cannot stay unchanged indefinitely.
I support projects including:
- updates of Java and Jakarta EE
- migrations to current JBoss and WildFly versions
- upgrading Struts (including upgrades from Struts 1 to 2)
- upgrading Hibernate
- replacing unsupported libraries
- resolving compatibility issues after updates
Addressing security issues and CVEs
Older Java applications often contain extensive dependency trees. A reported vulnerability therefore cannot always be resolved with a simple version update.
I analyze whether and how an application is affected, which dependencies need to be updated, and what changes are required so that it continues to work reliably afterwards.
Integrating modern systems
Existing applications increasingly need to work with newer infrastructure—such as modern authentication, new APIs, or central platform services.
Depending on the starting point, this may involve a direct adaptation, a gradual migration, or a compatibility adapter.
In one of my projects, for example, I developed a Keycloak adapter for a historical authentication interface. Existing legacy applications were able to keep using their previous interface, while central authentication was modernized.
Modernizing without losing sight of day-to-day operations
Not every application needs an immediate full rewrite.
Which parts should be updated, replaced, or deliberately kept for now depends on the specific application and its planned lifetime.
I do not design an abstract target architecture on the drawing board. I proceed incrementally: understand the existing application, solve acute problems, and modernize its technical foundation where this is necessary for operations, security, and continued development.
Technologies
My focus is on historically grown enterprise web applications, including:
- Java EE and Jakarta EE
- Struts 1 and 2, Servlets
- JSP and Freemarker
- Hibernate
- JBoss and WildFly
Experience with grown systems
I am particularly interested in systems where you first need to get oriented, reconstruct how things fit together, and find a workable path through historically grown structures.
Agentic Engineering now helps me examine large codebases more quickly, trace dependencies, and prepare changes. What remains decisive, however, is the experience to interpret results, recognize risks, and implement changes so that the application continues to run reliably afterwards.
Do you need support for an existing Java application?
For project enquiries or an initial discussion: raphael.kirchner@customwebcode.com