Legacy Java EE Support and Modernization

Assessment, stabilization, incremental migration, and continued development of grown enterprise applications.

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 take on the continued development and technical modernization of existing Java EE applications—from getting to grips with a historically grown codebase to implementing specific changes.

How I can help

Taking over existing applications

I work my way into existing codebases, architectures, and deployment environments—even when documentation is incomplete and important decisions were made many years ago.

The first step is to understand the system well enough that changes can be made in a controlled way and with acceptable 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
  • extending existing functionality
  • implementing new requirements
  • stabilizing problematic areas
  • analyzing production issues that are hard to reproduce

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, Hibernate, and other frameworks
  • adapting build and deployment processes
  • 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 connected a historical authentication interface to Keycloak through an adapter. 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. Equally, an old system should not be left unchanged at any cost.

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
  • traditional monolithic enterprise architectures

Experience with grown systems

I have been developing web applications since the mid-1990s and have worked as an independent developer since 2001.

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