Chapter 02Lesson 03~115 minutes

JMeter Architecture, Java Setup, Installation, and First Test Plan: Configuration, Design Patterns, and Trade-Offs

Installation is an engineering choice, not a one-time click. Compare distribution, runtime, configuration, and versioning patterns by asking which state each pattern controls, how it fails, and whether another workstation or CI runner can reproduce it.

DistributionJDKPropertiesPinningPortability

Learning objectives

  • Compare official archive installation with an externally maintained pinned container image.
  • Choose a JRE/runtime versus JDK based on required tooling rather than habit.
  • Separate GUI authoring from CLI execution as an architecture invariant.
  • Choose between environment-local settings and version-controlled project configuration.
  • Explain exact pinning, controlled upgrade policy, and why floating “latest” is poor evidence.
  • Keep JMeter, JVM, OS/network, SUT, plugins, CI, and containers as separate configuration layers.

1. Official archive versus pinned container

Lab target boundary: every mandatory executable example remains on the disposable fixture at http://127.0.0.1:8000; container discussion is architectural only and does not broaden target authorization.

Apache JMeter's primary release artifacts are binary/source archives. A local archive installation is therefore the most direct path to Apache's published release and signatures/checksums. Containers can improve portability, but the image itself adds another supply-chain layer: base image, maintainer, packaging choices, entrypoint, filesystem, user, and networking.

Important boundary: do not assume a community JMeter container image is an official Apache image. If a project chooses an external image, verify the maintainer and license, pin both JMeter and Java versions, preferably pin the image digest for release evidence, and preserve results outside ephemeral container layers. The mandatory course path remains the official Apache archive.
Choice Advantages Costs / risks Best fit
Official binary archive Direct Apache release, published checksum/signature, transparent directory layout Host Java/path management is your responsibility Learning, dedicated injectors, controlled CI images.
Pinned external container Repeatable filesystem/runtime bundle, easy ephemeral execution External image trust, container networking, artifact persistence, image drift if not digest-pinned Teams already operating controlled container supply chains.
Floating container tag Convenient initial experimentation The same command can resolve to different bits later Avoid for baselines/gates.

2. Runtime-only Java versus JDK

For JMeter 5.6.3 execution, a compatible Java runtime is enough. A JDK adds developer and certificate utilities. If a future lab must use keytool for the HTTPS recorder, a JDK makes that requirement explicit. If you are building JMeter or plugins, you also need compiler/build tooling.

The practical course standard is Java 17 JDK: it satisfies 5.6.3, supplies keytool, and aligns with the next-major development direction. But write manifests as “Java 17.x vendor/build actually used,” not merely “JDK installed.”

3. GUI authoring and CLI execution are deliberately asymmetric

A plan can be authored in GUI mode and then executed by a headless CLI runner. That asymmetry is a feature. It prevents the production-like load path from depending on a desktop environment and reduces visual-listener overhead on the generator.

A robust project therefore treats the GUI as an editor for JMX—not as the deployment runtime. CI should be able to execute the plan without opening the GUI.

4. Project configuration versus distribution configuration

The Properties Reference says properties found in jmeter.properties or report-generator properties should generally be set in user.properties. JMeter also supports additional property files with -q and local JMeter property overrides with -J. These mechanisms allow project/environment state to stay explicit without rewriting the shipped defaults.

Layer Typical location / mechanism Good use Anti-pattern
Distribution defaults JMETER_HOME/bin/jmeter.properties Read as the shipped baseline Editing it per project and forgetting what changed.
User/local properties user.properties Machine/user defaults that genuinely belong to that installation Committing secrets or environment-specific production endpoints.
Project property file Project conf/*.properties passed with -q Versioned non-secret test configuration Using it as a secret vault.
CLI JMeter property -Jname=value Explicit per-run override Putting secrets on command lines/history.
Java system property -Dname=value JVM/system behavior when required Confusing it with a JMeter property.

Chapter 06 will teach variables and properties deeply. Here, the design principle is provenance: a reviewer should be able to tell which layer owns a value.

5. Exact pinning versus controlled upgrade ranges

For performance baselines, exact tool versions make comparisons easier to explain. “JMeter 5.x” is not enough when defaults, dependencies, Java compatibility, or result behavior can change. Pin the release used for a baseline, record Java and plugins, and upgrade through an explicit validation process.

Exact pinning does not mean “never upgrade.” It means upgrades are intentional experiments: run compatibility checks, compare controlled baselines, inspect deprecations/changes, update the manifest, and preserve rollback ability.

6. Configuration layer map

Layer Examples Do not confuse with
JMeter core/test plan JMX tree, Thread Group, sampler, timers Java heap or OS sockets.
JMeter runtime properties user.properties, -q, -J Per-thread variables.
Java/JVM Java release, heap, GC, -D JMeter property namespace.
OS/network PATH, DNS, sockets, filesystem permissions JMX semantics.
System under test service build, DB pool, cache Load-generator installation.
Plugins/drivers extra jars and plugin versions Apache JMeter core release.
CI/container runner image, workspace, mounted artifacts Performance acceptance criteria.

7. Worked scenario: local authoring plus CI execution

A team wants developers to edit plans locally on Windows/macOS/Linux and run a nightly gate in CI. A defensible design is:

  1. Pin JMeter 5.6.3 and Java 17 for the current baseline.
  2. Keep JMX and non-secret project property files in source control.
  3. Use official archives on developer machines or build a controlled internal image from the official archive; do not rely on an unverified floating community tag.
  4. Execute load in CLI mode locally and in CI using the same launcher contract.
  5. Inject environment-specific non-secret endpoints through explicit property files; inject secrets through the CI secret mechanism rather than JMX or command history.
  6. Persist JTL, jmeter.log, report, and run manifest as CI artifacts even when the gate fails.

This design optimizes for reviewability and portability, not for the smallest number of setup steps.

8. Decision matrix

Question Prefer A when... Prefer B when... Evidence required
Archive vs container You want direct Apache artifacts and simple host execution. You have a controlled container supply chain and need runtime bundling. Archive checksum/signature or image digest + embedded JMeter/Java versions.
JRE/runtime vs JDK Only execution is required and runtime tooling is sufficient. Recorder certificate tooling or development utilities are needed. java -version; keytool availability if required.
GUI vs CLI You are authoring/debugging a tiny plan. You are generating actual load or automating. Mode, command line, artifacts, generator health.
Local vs committed config Value genuinely belongs to one installation/user. Value defines a non-secret project test behavior. Resolved property source and versioned file/manifest.
Pin vs float Result must be comparable/reproducible. Exploration tolerates tool drift and results are not baseline evidence. Exact versions/digests for any claim used in governance.

9. Portability can improve validity—but can also hide drift

Containers, CI runners, and infrastructure-as-code can make generator environments more repeatable. They do not automatically make tests valid. If an image silently changes under the same tag, if CPU limits differ, if container networking adds a new path, or if artifacts remain only in an ephemeral filesystem, the apparent portability can hide measurement drift.

Always verify configured load, achieved load, generator resource headroom, target build/environment, and result provenance after changing the execution platform.

Knowledge check

Why is a floating container tag weak evidence for a performance baseline?

When is a JDK preferable to a runtime-only Java installation for this course?

Where should a project-specific non-secret JMeter property generally live?

Does exact version pinning mean the project should never upgrade JMeter?

What additional evidence does a containerized JMeter run need?

Next lesson

Diagnose identity and provenance failures

Lesson 4 turns common installation/runtime mistakes into evidence-driven incidents: wrong Java on PATH, release/development confusion, GUI load misuse, direct default edits, permission/path failures, and overwritten result provenance.

Official references and version notes

Version and compatibility note

Version-sensitive statements were rechecked against current Apache JMeter primary sources on 2026-09-04. The current production release is Apache JMeter 5.6.3, whose download page states Java 8+; the 5.6.x change notes recommend Java 17 or later. The current development repository/next major line requires Java 17, so those development requirements are not retroactively applied to the 5.6.3 release. Mandatory labs use Java 17, the official 5.6.3 binary archive, no third-party plugins, the loopback target 127.0.0.1:8000, and CLI mode for the actual load run. The published SHA-512 for apache-jmeter-5.6.3.zip is 387fadca903ee0aa30e3f2115fdfedb3898b102e6b9fe7cc3942703094bd2e65b235df2b0c6d0d3248e74c9a7950a36e42625fd74425368342c12e40b0163076.

Keep the academy open

Support free, practical DevOps education.

Every lesson is designed to remain readable in a browser, downloadable from GitHub, and usable without a paid learning platform. Contributions help expand and maintain the curriculum.

Ethereum / ERC-20
0x716c4Ab160C4B66F31a28AE2448BfF68fc3a2ef0 Send only Ethereum/ERC-20 compatible assets to this address.