Languages

Java

The default language for enterprise systems that cannot afford downtime. Used across banking, insurance, and government in Australia.

ANZClearViewIAGEYQantasUnited NationsSwiss Government
The landscape
01

Still the backbone of enterprise

Java has carried enterprise computing for three decades, and most core banking and insurance platforms in Australia still run on it. Backward compatibility is treated as a contract, and code compiled years ago still runs on current JVMs.

Modern Java bears little resemblance to the J2EE era: recent long-term support releases brought virtual threads, records, sealed interfaces and pattern matching. Spring Boot remains the default framework for new services, while Quarkus and Micronaut trade ecosystem breadth for faster start-up and lower memory in containers.

For most organisations the live question is modernisation. Estates built on WebSphere, JBoss or early Spring carry patterns the platform has since replaced, and the choice between modernising in place and rewriting service by service shapes the next several years of investment.

Java is the wrong choice for data science and machine learning work, where the tooling lives in Python, and for small products where a thin API in front of a database ships faster in TypeScript on Node.js. The common enterprise pattern keeps Java for the core and adds other runtimes at the edges where they fit better.

Java was used by 29.4% of respondents to the 2025 Stack Overflow Developer Survey.

Java has shipped a feature release every six months since 2017, with long-term support releases now arriving every two years.

Common in Banking, insurance, government, payments
Key frameworks Spring Boot, Quarkus, Jakarta EE
Runtime JVM with Java 17 or 21 LTS
Typical pattern Microservices, legacy modernisation
  • Enterprise APIs
  • Core Banking
  • Payment Systems
  • Legacy Modernisation
02

Our Java capabilities

Microservices architecture

We decompose monoliths into independently deployable Spring Boot services, drawing boundaries along data ownership so each service can change and fail alone. The difficult decisions are transactional: which operations may become eventually consistent, and which must stay atomic and therefore stay together. Services run on Kubernetes with health probes, resource limits and rolling deployments defined from the first release, and a service mesh carries mTLS and traffic policy once the service count justifies one.

  • Spring Boot 3
  • Kubernetes
  • Service mesh

Legacy modernisation

Application-server estates on WebSphere or JBoss move to containerised services through the strangler fig pattern: an API gateway takes over routing, and endpoints migrate behind it one at a time. Each slice carries its own tests, telemetry and rollback path, so production traffic never depends on the migration finishing on schedule. The old platform is retired only when the routing table shows nothing still reaches it.

  • Strangler fig
  • API gateway
  • Zero-downtime migration

Performance engineering

JVM performance work starts with evidence: JDK Flight Recorder running in production and async-profiler flame graphs establish where time and allocation actually go before anything is changed. For latency-sensitive workloads in trading and payments we match the garbage collector to the workload, moving to ZGC where pauses must stay low regardless of heap size. Every change lands with the measurement that justified it, so the configuration remains explicable years later.

  • ZGC
  • JFR
  • async-profiler
03

Why Adaca for Java?

04

Common Questions

We are still on WebSphere. Should we modernise or rewrite?

For a system that still clears its workload, incremental modernisation is usually the lower-risk path, and it can pause at any point without leaving the estate half-migrated. A rewrite is worth its risk in three cases: the domain model itself is wrong, platform licence costs dominate the economics, or nobody remains who can read the code.

The two are not mutually exclusive across an estate. Some applications modernise in place, some are rewritten small, and some retire; we form that map by reading the estate before recommending anything.

Much of our estate is still on Java 8. How urgent is the move?

The runtime is stable and vendors still support it. The urgency comes from the ecosystem: the current generations of the major frameworks require newer runtimes, so staying on 8 progressively freezes your dependency tree.

The move from 8 to a current LTS is mostly mechanical for application code, with the module system and removed internal APIs causing the friction. We usually fold it into planned work on each service rather than running it as a standalone programme.

Can we run Java and C# services side by side?

Yes, and many enterprises with a history of acquisition do. Both run on mature managed runtimes with strong HTTP, messaging and observability ecosystems, so services interoperate over ordinary APIs and queues without either side noticing the other's language.

The cost is duplicated tooling, duplicated pipelines and two hiring pools. Where an estate has drifted into both by accident, consolidating new work on one platform usually pays; where the split follows a real boundary, such as a .NET division alongside a Java core, it is worth keeping.

Is a Java codebase a good fit for AI coding agents?

Yes, unusually so. The compiler rejects a large class of wrong code before anything runs, decades of public Java give models deep corpus coverage, and the JUnit culture means most estates already hold test suites an agent can run after each change.

The qualifier is the corpus's age: it is thick with J2EE-era idiom, and an unguided agent will reproduce XML-heavy configuration and patterns the platform retired years ago. Repository conventions and current-idiom reference code keep generated Java modern; the correctness signal does the rest.

Can AI tooling take on part of a legacy Java migration?

The mechanical part, yes. Namespace moves such as javax to jakarta, dependency upgrades and repetitive API substitutions are high-volume, pattern-shaped work that agents and recipe tools such as OpenRewrite complete quickly, and a compiling, tested result is straightforward to verify.

The judgements that decide whether a migration succeeds, where the service boundaries fall, what should be retired instead of ported, which framework the target services use, are not in any corpus. We apply the tooling to the volume and keep those decisions with engineers who have read the estate.

How is Java work priced?

Either as a fixed cost for an initial outcome, such as a first release or a defined migration, or as a monthly rate for the team once later phases are under way. We do not publish a figure for a build, because the scale is set by the number of features, platforms, user groups and users, and projects have run from four weeks to several months. The How We Charge page sets out both models, milestone billing and the notice period.

What does the team for Java work look like?

Typically one full-time engineer on the build, with two part-time roles alongside: one running the project and one working with you on priorities and technical decisions. Teams are shaped around the system rather than around one technology, so Java work draws in the neighbouring stack when it needs to. Delivery starts under Australian leadership, with the engineering in our Manila delivery centre.

How quickly can Java work start?

Discovery establishes the scope, systems involved and delivery requirements. We agree the implementation plan and timing after that work, before implementation begins.