Jan 27, 2025·7 min

Java Licensing in the Enterprise: Inventory and Procurement

Java licensing in an enterprise: how to collect actual usage across servers and PCs, avoid mistakes and choose a safe procurement model.

Java Licensing in the Enterprise: Inventory and Procurement

What Java problems typically surface in corporations

Java often appears in a company unnoticed: someone installed a JRE for an accounting client, developers brought a JDK with an IDE, Java arrived on a server as part of an application, and a VDI image got it "just in case." After a year it's hard to remember where and why it's needed, but the word "license" suddenly becomes very important.

Installations must be counted not out of curiosity. Usually there's one of three triggers: preparing for a renewal, internal control requirements, or a vendor letter asking about compliance. To answer calmly you need facts: how many instances are there, exactly where, and who and how uses them.

The main trap is that "Java is installed" does not equal "Java is used." On workstations it may sit unused for months. On servers several versions often coexist: one for an old service, another for a new one, a third in a test environment that "temporarily" became permanent. Relying only on installation lists can easily lead to overpaying or, conversely, underestimating usage and getting claims.

Risk increases when data is fragmented. One team tracks servers, another tracks workstations, virtual machines live in a separate silo, and cloud instances may be completely out of sight. The result is no single picture: where Java is required by the business, where it is legacy, and where it just "sits".

A "safe procurement model" in practice means a straightforward thing: the chosen licensing scheme is based on confirmed usage and clear boundaries. Then you can explain which systems truly require Java and why, separate production from test and pilots, estimate the impact of infrastructure growth, and reduce the chance of additional charges during an audit.

With confirmed usage across servers and workstations, procurement stops being a "shot in the dark" and becomes a manageable decision.

Five-minute glossary: what exactly we mean

Before discussing Java licensing in an enterprise, agree on terms. Otherwise one department will say "Java is not used" while another shows dozens of servers with Java processes.

JRE and JDK are often confused, but for inventory the difference matters. JRE is the runtime for running Java applications. JDK is the development kit (compiler, tools, libraries); it's usually installed for developers and on build servers.

A separate pain is "embedded Java": Java bundled inside a product (for example, with an application or agent) living in the application's folder. These cases are easy to miss in inventory: "nothing is installed on the system," but a runtime exists.

What counts as usage? Companies follow three approaches, and they must not be mixed:

  • Installation: Java exists on the device or server (including inside an application folder).
  • Execution: java/javaw processes actually start and services, jobs, or containers run.
  • Dependency: an application won't start or loses functionality without Java, even if runs are rare.

The environment also changes the rules. On servers services, schedulers and application instances matter. On laptops, who and why runs Java (banking client, crypto provider, legacy corporate tool) is important. In VDI and terminal farms you must consider how many users actually run Java and whether a single installation is shared or different pools are used.

To make accounting defensible, involve more than IT: InfoSec (policies and exceptions), procurement (models and budgets), and legal (interpretation of terms).

A simple example: on a terminal farm Java was installed "just in case," but it turns out only the accounting team runs it once a quarter for a single report. That immediately affects which metrics to collect and which procurement model to discuss.

Preparation: what data you need and where to get it

So the inventory doesn't become a dispute of "we think we have it" versus "the audit will show otherwise," first agree on boundaries. Create a simple registry: which legal entities and departments are in scope and which environments are considered separately (prod, test, dev). A common mistake is to gather data only for production and forget test clusters, VDI or separate domains.

Next, map the sources you will use to collect facts. Usually 4–6 systems are enough, but it's important to decide in advance which one is the source of truth for each object type.

Data sources that typically give the best coverage

At the start, choose where you take the list of servers and workstations and where you confirm installation and execution:

  • CMDB or inventory — list of assets and owners.
  • AD/Entra and domain data — actual devices, users, OUs and exclusions.
  • Virtualization platform and cloud consoles — VMs, hosts, clusters, migrations.
  • EDR/endpoint management — installed packages, processes, telemetry.
  • Service Desk — service owner, criticality, contacts.

To avoid disagreements at the end, fix rules: what counts as an asset (only managed devices or also contractors), what you exclude (archived VMs, powered-off laptops, labs), how you define "in use" (binaries, running process, application call). Assign a data owner for each zone (servers, workstations, VDI, containers) and a deadline for data exports.

Output format acceptable to procurement and compliance

Agree on the "output table" in advance; otherwise you'll have to redo the work. Usually fields are: asset (hostname/serial/VM ID), environment (prod/test/dev), owner, found Java versions and distributions, indicator of actual usage, source of confirmation, observation date and comments on exceptions.

How to collect actual usage on servers

Start with a full list of servers where Java could theoretically be present: physical hosts, virtual machines, cloud instances, and container nodes (Kubernetes workers, Docker hosts). Don't limit to the "server room": Java often appears on utility VMs, integration buses, monitoring and legacy apps.

The task is to find not only installations but also executions. For installation checks it's better to use multiple methods because Java may be packaged, unpacked into a folder, or embedded in an application.

Common ways to get good coverage:

  • Check packages (rpm, dpkg) and installed JVM/JRE components;
  • Search typical paths (for example, /usr/lib/jvm, /opt, /app) for java, javac, jre;
  • Environment variables and service configurations (JAVA_HOME, PATH, systemd unit files);
  • Application configs (paths to java, startup parameters);
  • For Windows Server — registry and installed programs list.

Note where Java is bundled with an application and where it is a shared system installation. For example, an app might have its own JVM in /opt/vendor_app/jre. That's one accounting scenario. When multiple services use a common Java (e.g., /usr/lib/jvm/java-17), the licensing and procurement risk is usually higher.

For each finding record at least: version and build vendor (Oracle, OpenJDK, Temurin), installation path and delivery method (package, archive, bundled with app), server and environment (prod/test/dev), service owner and application name, and evidence of execution (process, service, container, scheduler).

Confirm execution with "live" signs: active java processes, systemd services, cron jobs, container parameters. Example: a VM has two Java installations. One is an OpenJDK present on the system but not used by any process. The other is an embedded JVM of an application, and that one is started by billing.service. In the final picture these are two installations, but only one actually runs — and that directly affects procurement.

How to collect actual usage on workstations

Calculate licensing options
We will compare 2–3 procurement models based on confirmed usage.
Request a calculation

To decide correctly you need not only the installation fact but also real usage on PCs. Java often appears quietly: with a banking client, crypto provider, legacy e-signature module or internal app that pulls Java as a dependency.

Start by covering all device types. Corporate laptops and desktops are usually visible in the domain and MDM. Remote and BYOD devices are harder: require registration for access and a scheduled window (for example, 10 business days) to "catch" rarely connected devices.

What to collect exactly

Split the task into two layers: installations and executions. Installation shows risk; execution shows need.

Minimum data per device:

  • device name and owner (employee, contractor, shared PC);
  • discovered Java versions (JRE/JDK), installation path, and, if possible, installation source;
  • initiating application (which program launches java.exe/javaw.exe);
  • execution events over a period (e.g., 30 days): frequency and timestamps;
  • "portable" builds (Java in a user folder, on D:, unpacked archives).

How to do it in practice

Technical means depend on your tools (EDR, MDM, inventory, scripts). The logic is the same.

First collect installations: system directories, registry, installed programs list and common manual install locations. Then check for Java inside application folders: vendors sometimes place their runtime next to the exe and it's not visible as a separate installation.

Then gather run data. Often EDR telemetry or process logs are enough: who launched it, what process was the parent, how often it repeats. This helps separate "sitting on disk" from "required for work."

Mark developers and build agents separately. On their machines and CI nodes Java may run constantly due to builds, tests and IDEs — this is a different consumption model and volume.

Example: out of 200 laptops you find 60 Java installations, but logs show only 18 active runs in 30 days, and most of those belong to one accounting application. The other 42 installations are legacy or shadow and can be removed or replaced before procurement.

Combine results: turning scattered facts into a coherent picture

When you've collected server and workstation data, stop treating it as files and screenshots. For decision-making you need a single picture: where Java exists, why it is there, and how confident you are in each fact.

Start with a master registry (a spreadsheet will do). Each row should represent a distinct asset or a distinct installation, not just "the server." Record at minimum: device (server/PC), role and environment (prod/test/dev/VDI), owner, "Java trace" (installation, package, process, dependency), source and date of confirmation.

Then normalize entries to avoid a "zoo" of names and versions. Standardize vendor, family (JRE/JDK), version (major and update), bitness, and delivery method. Remove duplicates: the same device may appear from multiple sources.

Next classify records by usage scenario. Usually three categories suffice: business application runs, development (IDE/build/test), and administration/utilities (consoles, agents, helper tools). This quickly shows where Java is critical and where it can be removed or replaced.

Flag risk zones separately: internet-exposed assets, contractor workstations, branches and remote sites, systems without a clear owner.

Add a confidence level. For each row honestly state "confirmed" (there is proof of installation or execution) or "assumption" (Java is mentioned in documentation but the host wasn't checked). This field often resolves internal disputes and prevents paying for guesses.

How to choose a safe procurement model based on facts

When the inventory is done, the main risk is buying the wrong thing. Start with a simple question: what exactly will you pay for? For Java this is often the right to use a specific build commercially, access to security updates and support (SLA, consulting, on-demand patches).

Then map real scenarios to how they are counted in licensing. Server Java often ties to capacity (processors, cores, clusters, virtualization). Workstations are counted by installs or users depending on the vendor. Don't confuse "installed" with "used": for a defensible position it's more important to know what actually runs in production and by whom.

Prepare 2–3 procurement models

It's useful to prepare three calculations and compare cost versus risk:

  • Minimal: only confirmed prod systems and specific teams;
  • Balanced: plus typical "gray zones" (admin utilities, batch jobs, some VDI seats);
  • With buffer: plus expected growth for 6–12 months and a reserve for migrations.

Between the options you'll usually see how much it costs to "sleep easy" and where it's cheaper to clean up than to buy extra licenses.

Find places better changed than expanded

Often it's safer (and cheaper) not to expand licensing but to change one detail: switch to a supported OpenJDK build, update base container images, remove extra runtimes from terminal servers, or move utilities out of the prod segment.

Document assumptions so they can be defended: which Java version is counted, which hosts and clusters are in scope, how virtualization is accounted for, what counts as a "user," and which exceptions are accepted. This short note often saves you during an audit when different parties interpret terms differently.

Common mistakes that lead to additional charges

Make accounting permanent
We will set up regular change control so inventory doesn't become outdated in a month.
Discuss implementation

Additional charges almost always arise from gaps in accounting, not from a "hostile auditor." When data were gathered hastily it's hard to prove where Java is actually used and where it just sits on disk.

The most common trap is counting only installations. Java may be present "just in case" but not executed for months. If a report contains only a package list without execution evidence (processes, services, scheduler jobs, application logs) you risk inflating numbers and buying too much or missing real usage elsewhere.

Second problem — forgotten environments: test, pre‑prod, DR sites, temporary project VMs, containers, contractor stands. Audits usually look wider than the "production contour."

Another error is summarizing everything as "Java is installed" without details. For a controlled decision record the vendor and exact version (both JRE and JDK) and the delivery method: separate installer, bundled with an app, or inside an image.

Shared workstations require special attention: VDI, terminal servers, labs and classrooms. Licensing there may depend on the number of users, devices or host resources. If you don't describe the access scheme, final figures become disputable.

Finally, "ownerless" software. If each usage case doesn't have a responsible owner (department, system, contact), nobody confirms the need or takes responsibility for cleanup. A practical rule: for each finding record "what starts it," "who uses it," "why needed," and "when last run."

Quick checklist before procurement and internal approval

Before procurement, document facts so you can show them to finance, InfoSec and leadership. The goal: make "where Java is and why" clear in five minutes.

Check coverage: a single asset list (servers, VMs, workstations), including branches and remote sites. If part of the estate lives "out of scope" (pilot stands, temporary VMs, contractor laptops), that's where risks most often arise.

Then check record quality. For each server and workstation have the same set of fields: version and build, exact installation location (path, package, container, image), owner (team/department) and environment. Record Dev/Test/Prod and build/CI nodes separately — they usually have different scale and rules.

Add execution confirmation. "Installed" is not enough: for key systems there should be a mark that Java actually runs and how (service, scheduler, container, app).

For budgeting and procurement prepare three numbers in advance: how many units to cover now (based on actual usage), how many to reserve for growth (6–12 months), and how many for known projects (planned deployments, migrations).

Example scenario: results after 2–3 weeks of inventory

Create a single picture
We will consolidate data from CMDB, AD, EDR and virtualization into a single registry.
Submit a request

Imagine a bank (or a large government agency) with 200 workstations and 40 servers. Some servers run in virtualization: several clusters, shared VM templates, different teams owning apps and infrastructure. The goal is to understand the factual picture, not assumptions.

After 2–3 weeks you typically see two layers. On workstations "quiet" old JRE installations surface: once installed for an application that disappeared, Java remained and was irregularly updated. On servers Java often lives inside services: Tomcat apps, homegrown services, monitoring agents, integration buses. Sometimes Java exists even where "everything is on .NET" because a contractor brought a separate component.

Next, separate critical from rare. Critical — payment and accounting systems, integrations that need Java 24/7. Rare — one-off utilities, test stands, forgotten VMs that run Java a couple of times a month.

The result is usually not a single report but a small package: registry of installations by servers and PCs (version, path, owner, environment), a map of applications where Java actually runs, list of assumptions (for example, how virtualization and templates were counted), procurement model options and a plan to remove "tails" with dates and responsible parties.

After that decisions become easier: remove or replace excess, standardize one supported configuration and choose a procurement scheme for critical systems that can be confidently defended in an audit.

Next steps: lock the result so chaos doesn't return

A one‑off inventory gives a useful snapshot, but after a few months it ages: someone installs a new Java, a server is updated, or an old app "temporarily" keeps running for another year. To avoid running in circles, make accounting a regular process.

First step: assign a Java inventory owner. This can be the IT asset team, InfoSec or operations, but responsibility must be tied to a specific role. Set update rhythm: for example, monthly checks for workstations and quarterly for servers, plus ad‑hoc checks for major releases.

Then control the changes that most often break the picture: new installations and embedded runtimes in software, version and distribution changes, new servers and moves to virtualization or cloud, decommissions, and exceptions (labs, test stands, contractors).

To keep procurement discussions focused, prepare short internal rules in advance: allowed versions, who may install, how changes are recorded, what reports are needed for internal control, and how to respond to vendor queries.

If internal resources are limited, consider hiring a system integrator: they can gather data from different sources, reconcile actual usage with licensing models and prepare calculations you can confidently present to internal control.

GSE.kz (gse.kz) as a vendor and system integrator can help with inventory, standardizing workstations and servers, and supporting infrastructure so Java accounting stays current without constant manual reconciliations.

FAQ

Why can't we just count all Java installations and stop there?

Start with a simple clarification: you don't need to just "count installations" — you need to demonstrably understand where Java is actually required by the business. Practically, that means collecting two layers of data: where Java exists (installation, including runtimes embedded inside application folders) and where it runs (processes, services, scheduled jobs, containers) over the chosen observation period.

What period is best to collect actual Java runs?

A convenient baseline is 30 days for workstations and 7–14 days for servers, which usually captures night jobs and infrequent tasks. If you have quarterly processes or rare schedules (for example, accounting routines), add targeted checks for those windows; otherwise you risk marking an important Java instance as “unused.”

What is the practical difference between JRE and JDK for corporate inventory?

JRE is the runtime for running Java applications; JDK is the development kit with compiler and tools. For inventory, separate them because JDKs are generally found on developers' machines and build servers, while JREs are typical on user PCs and application servers — consumption patterns and licensing implications differ.

How do you avoid missing "embedded Java" inside an application?

This is when a runtime sits inside the product folder and doesn't appear as a separate "installation" in software lists. Look for jre/jvm folders inside application directories, check startup configs and Java paths, and examine process origins: often the java process runs from the product's directory rather than a system path.

What should be considered proof of Java usage on a server?

On servers, record not only Java binaries but also proof of execution: active java processes, systemd services, scheduled jobs, and container parameters. If Java is present on disk but no service uses it, treat it differently: plan removal or standardization instead of including everything in a procurement "just in case."

How do you tell whether Java is needed on workstations if it's just installed?

Start by collecting installations via inventory/MDM/EDR and check typical manual install locations, including user folders and unpacked archives. Then confirm runs via process telemetry: who launched java.exe/javaw.exe, which application was the parent process, and how often it happened. This separates "sitting on disk" from "required for work."

How should Java be counted in VDI and on terminal servers to avoid mistakes?

Describe the access model: is it a single installation on the host used by many users, or separate pools/images cloned per user group? Then collect run facts by user sessions over the observation period and tie them to specific applications; without this, numbers become disputable during approvals and audits.

Which environments are most often forgotten when inventorying Java?

At minimum separate production, test/pre‑prod and dev/CI, because they have different criticality and run patterns. Also flag temporary VMs, disaster recovery sites, container hosts and contractor testbeds — these are the places that most often fall out of reports and later create questions.

How to present results so procurement, InfoSec and compliance accept them?

Provide a registry keyed by assets and installations with consistent fields: device, environment, owner, vendor and build, installation path, indicator of execution and source/date of confirmation. Add a confidence level ("confirmed" or "assumption") so it's clear where further investigation is needed and what can be defended with internal control.

How to choose a "safe" Java procurement model based on facts rather than fear?

First produce 2–3 calculations: minimal covering confirmed usage, a balanced option including typical "gray zones," and a plan with buffer for growth and migrations. For expensive or doubtful areas, check alternatives: standardize on a supported OpenJDK build, update base container images, remove extra runtimes from terminal servers. If internal resources are short, a system integrator like GSE.kz can help consolidate data from multiple sources and prepare defensible calculations.

Java Licensing in the Enterprise: Inventory and Procurement | GSE