Ace8 is the modernization practice of AceMQ.24/7 support from AceMQ after go-live
Book an Assessment

Checklist

Technical debt examples: seven you can find with a command.

Each example below is a thing you can point at in a Java codebase, with the check that counts it. If you cannot measure it, it is an opinion, not debt.

AceMQ engineering team4 min readEngineer-reviewed

The short answer

Technical debt examples in an enterprise Java estate include frameworks several major versions behind, javax imports that block Jakarta, modules with no tests, hard-coded configuration, and code locked to one application server. Each can be counted with a build report, a search or a coverage run, which is how you turn debt into a ranked list.

01Ground rule

What makes something an example of debt, not just old code?

Debt has interest. An item counts when it makes the next change slower, riskier or impossible, and when you can show that with a measurement. A twenty-year-old class that works and never changes is not debt. A two-year-old class that nobody dares touch is.

That test keeps the list honest. For how to score and order what you find, see technical debt reduction. This page is the catalog of what to look for.

02The catalog

Seven examples and the check for each

ExampleWhat it looks likeHow it is measured
Framework versions several majors behindA Spring, Struts or JSF line that no longer gets fixes, with libraries pinned to matchDependency tree from the build; compare each version to the vendor's supported releases
javax namespace importsThousands of imports of javax.servlet, javax.persistence and similar that block Jakarta-based releasesCount files containing javax imports; list the libraries that still need them
Untested modulesBusiness logic with no automated tests, or tests that fail and are ignoredCoverage report per module (for example JaCoCo) and the pass rate of the suite
Hard-coded configurationURLs, hostnames, credentials or file paths inside source or inside the packaged archiveSearch for IP patterns, connection strings and absolute paths; list what changes between environments by hand
Application server lock-inVendor descriptors, vendor classes and JNDI names that exist on a single serverSearch for vendor package imports and descriptor files; count the modules that cannot start on a plain servlet container
Unpatchable vulnerable librariesA library with a known flaw that cannot be upgraded because another component pins itSoftware composition analysis; for each finding, record what blocks the upgrade
Release frictionManual deploys, a build that runs on one laptop, environments that driftTime and steps from merge to production; number of people who can do it

Planning this for your estate? Get a fixed scope and price first.

03Example in detail

How do you measure javax debt?

Count the files that import from the javax namespace, then separate the packages that moved to Jakarta (servlet, persistence, validation, and others) from the ones that did not (the JDK's own javax packages stay). The first number is the size of the move. The second list is the dependency work: each library that has no Jakarta release is a blocker.

A deterministic recipe can rewrite the imports, so the count is rarely the hard part. The libraries are. See javax to Jakarta migration for how that move runs.

04Example in detail

How do you measure missing tests?

Line coverage is a weak number alone, since a test can execute a line without checking anything. Use three figures per module: coverage, how many tests assert on results, and whether the suite passes on a clean checkout. A module at 70 percent coverage with a failing suite is worse than one at 40 percent that is green.

Where coverage is missing, the fix is characterization tests that record what the code does today. We cover that in legacy code refactoring.

05Example in detail

How do you measure application server lock-in?

Search the code and descriptors for vendor-specific packages, proprietary deployment descriptors and lookups of JNDI names that the server alone defines. Group the hits by module. A module with no hits can move to a plain container as is. A module with hits is a work item, and the count gives its size.

Lock-in counts as debt when you intend to move or the license cost matters. Record it either way. If a move is planned, the WebLogic and WebSphere pages show what the exit involves.

06Limits

What looks like debt but usually is not?

  • Old code that is stable, tested and rarely changed. The interest is near zero.
  • Style disagreements, naming and formatting. Worth a linter, not a project.
  • An internal tool with a retirement date. Record it and accept the cost.
  • A design you would not choose today but that meets its load and changes easily.

07Pending proof

What will a real inventory look like?

08How Ace8 helps

From examples to a ranked list

Ace8 is the AI-assisted application modernization practice of AceMQ.

The fixed-price modernization assessment runs these checks across your applications, scores them on one scale and returns a payoff order you own. To fix the items, start with technical debt reduction.

FAQ

Frequently asked.

Something else on your mind? Ask an engineer.

Outdated framework versions, javax imports that block Jakarta, modules without tests, hard-coded configuration, code tied to one application server, vulnerable libraries that cannot be upgraded, and manual releases.

Start here

Know the cost before anything moves.

A fixed-price assessment gives you the inventory, the risk score and a phased plan. Scope and cost are fixed before the migration starts.

Get in touch

Talk to a modernization engineer

Tell us what you run today. An engineer, not a sales script, replies within one business day.

305-204-2607info@ace8.io

66 W. Flagler St. 9th Floor
Miami, FL 33130

What are you moving off? *

Fixed price. Scope and cost before any migration starts.