Languages

Java

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

ANZProspaClearViewIAGEYQantasUnited 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

How We Staff It

Enterprise Java briefs usually call for Spring Boot depth alongside the surrounding disciplines: SQL and data modelling, Kubernetes, and the messaging systems a core platform speaks to. Modernisation programmes add a different profile, engineers who have read a WebSphere or JBoss estate before, because the first weeks are as much archaeology as engineering.

Java sits at the enterprise core of our pool, and our engineers work in current idiom: records, virtual threads and Spring Boot 3 rather than the J2EE patterns of the estates they modernise. They join your repositories and ceremonies and keep to your working day.

05

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 long before we see Java candidates?

A shortlist for a Java brief usually arrives within 48 hours, drawn from engineers we already employ or already know, with dedicated recruitment covering rarer profiles such as low-latency JVM tuning or specific banking platforms. Spring Boot generalists come fastest, because they are the deepest part of the bench.

Engagements start at one engineer and run for three, six, nine or twelve months, agreed up front.