Plugins & Plugins Manager
|
This content was generated with the assistance of AI and should be verified against the official documentation before being relied on in production. |
The reference material consulted while preparing these pages is listed in the section bibliography.
Core JMeter covers HTTP, JDBC, JMS, TCP and a dozen other protocols, but several things load testers ask for every day are not in it: concurrency and arrival-rate thread groups with a step or free-form schedule, a timer that shapes requests per second over time, HTTP/2, WebSocket, Kafka, MQTT and gRPC. They come from plugins. This page explains how JMeter finds plugin code, how to install plugins reproducibly with the JMeter Plugins Manager (in the GUI, on the command line, in Docker and through Maven), how to add a plugin without the manager, and how to judge whether a plugin is safe to build a test on. It ends with a catalogue of the plugins this section uses, with the version, purpose and maintenance status of each.
jmeter-plugins.org is a community project, not an Apache project. The site, the Plugins Manager and the
jpgc-* plugins are maintained by Andrey Pokhilko and contributors (the site footer states the Apache 2.0 licence for
the project), and the catalogue also lists plugins from third-party vendors (BlazeMeter, independent developers,
companies) that are only distributed through it. None of them is released, reviewed or supported by the Apache JMeter
project. Treat each plugin as a third-party dependency with its own licence, release cadence and security record.
Versions this page was written against, all re-checked on 2026-10-14:
-
Apache JMeter 5.6.3, the latest release (Java 8 or later, Java 17 or later recommended; the examples use Java 21). JMeter 6.0 is not released; the changes planned for it on the
apache/jmetermaster branch that matter for plugins are described as planned, not as released behaviour. -
JMeter Plugins Manager 2.0 (
kg.apc:jmeter-plugins-manager:2.0, published to Maven Central on 2026-08-14; its catalogue entry says "Requires JMeter 3.2+") and its command-line runnercmdrunner2.3. -
jmeter-maven-plugin 3.8.0 (
com.lazerycode.jmeter), the latest release. -
The gRPC Request plugin 2.0.2 (
jmeter-grpc-request, the bakthava continuation of the archived zalopay-oss project). -
Plugin ids and latest versions as listed in the repository catalogue at https://jmeter-plugins.org/repo/ on the same date. Release dates come from Maven Central or from the plugin’s GitHub releases, whichever hosts the jar.
The classpath properties referred to below (search_paths, user.classpath, plugin_dependency_paths) are described
in Installation & Configuration. The plugins named here are used
in detail on later pages of this section: the custom thread groups and load shaping page (Concurrency, Ultimate,
Arrivals thread groups and the Throughput Shaping Timer), the gRPC load testing page (jmeter-grpc-request) and the
CI/CD page (plugins inside a Docker image and a Maven build).
Who publishes what
| Source | What it provides | Where the jars come from | Support |
|---|---|---|---|
Apache JMeter (core) |
Everything in the official download: samplers, controllers, timers, listeners, functions. |
|
The Apache JMeter project (mailing lists, GitHub issues). |
jmeter-plugins.org ( |
The "classic" community plugins: Custom Thread Groups, Throughput Shaping Timer, graphs, PerfMon, Auto-Stop, Dummy Sampler, custom functions and others, plus the Plugins Manager itself. |
Mostly Maven Central under the |
Community: the project’s support forum and GitHub repositories. |
Third-party vendors listed in the catalogue |
BlazeMeter ( |
Maven Central, GitHub release assets or |
The vendor or author only, through their own repository. |
The Plugins Manager catalogue also contains entries for parts of core JMeter (jmeter-core, jmeter-http,
jmeter-jdbc, jmeter-jms, jmeter-ftp, jmeter-tcp, jmeter-ldap, jmeter-mail, jmeter-mongodb, jmeter-junit,
jmeter-java, jmeter-native, jmeter-components, vendor "JMeter Core Team"). These entries have no downloadable
versions: they let the manager recognise core jars that are already installed and, if you want, uninstall rarely used
ones to shorten JMeter’s menus.
The plugin model
Where plugin code lives
A JMeter plugin is a jar file that contains test elements (samplers, controllers, timers, listeners, config elements, pre- and post-processors, assertions, thread groups) or functions. JMeter’s rules for jars are:
| Location | What goes there |
|---|---|
|
Plugin jars: JMeter scans them for test elements and functions. The Plugins Manager jar itself goes here too. |
|
Libraries that plugins depend on (for example |
|
Extra directories or jars searched for plugin classes, in addition to |
|
Extra locations for libraries; |
Restart JMeter after adding or removing any jar: the class loaders are built once at start-up. A test plan that names a class which is not on the classpath cannot be loaded at all, in the GUI or in CLI mode, so a missing plugin is a hard failure, not a warning.
How JMeter 5.6 discovers plugin classes
Until 5.5, JMeter found test elements by scanning every class in lib/ext (and search_paths) for subclasses of
the relevant interfaces. JMeter 5.6 introduced Java’s ServiceLoader for this: the changes list for 5.6 says "Use
Java’s ServiceLoader for loading plugins instead of classpath scanning. It enables faster startup" (PR 5885). A plugin
that wants to be found this way declares its classes in META-INF/services files inside its jar.
Older plugins do not have those files, so 5.6.3 does both. Reading the 5.6.3 sources (JMeterUtils.loadServicesAndScanJars
and ClassFinder), JMeter first loads everything the ServiceLoader finds and then still scans the jars in lib/ext and
search_paths for further implementations, skipping classes it already loaded. A jar whose manifest declares
JMeter-Skip-Class-Scanning: true is skipped by that scan, which is how a modern plugin tells JMeter that its
ServiceLoader metadata is complete. In 5.6.3 the attribute only applies to the lookups of functions, Java Request
clients and Backend Listener clients; samplers, TestBeans and GUI classes are still found by scanning lib/ext (the
extending page shows the effect). In practice this means:
-
old
jpgc-*plugins built years before 5.6 keep working in 5.6.3; -
every jar in
lib/extstill costs start-up time, which is one more reason to install only what a plan uses; -
the scanning API is marked deprecated since 5.6, so plugin authors should ship
META-INF/servicesfiles.
What a plugin looks like inside a .jmx
A .jmx file records each element with its guiclass and testclass. For a plugin element these are the plugin’s
class names, so the plan itself tells you which plugins it needs. This fragment is the Bookshelf stress profile with
the Concurrency Thread Group from jpgc-casutg (its fields are explained on the custom thread groups page):
<?xml version="1.0" encoding="UTF-8"?>
<jmeterTestPlan version="1.2" properties="5.0" jmeter="5.6.3">
<hashTree>
<TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="bookshelf-stress">
<elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments">
<collectionProp name="Arguments.arguments"/>
</elementProp>
</TestPlan>
<hashTree>
<com.blazemeter.jmeter.threads.concurrency.ConcurrencyThreadGroup
guiclass="com.blazemeter.jmeter.threads.concurrency.ConcurrencyThreadGroupGui"
testclass="com.blazemeter.jmeter.threads.concurrency.ConcurrencyThreadGroup" testname="Search users (stepped)">
<elementProp name="ThreadGroup.main_controller" elementType="com.blazemeter.jmeter.control.VirtualUserController"/>
<stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
<stringProp name="TargetLevel">${__P(threads,50)}</stringProp>
<stringProp name="RampUp">${__P(rampup,60)}</stringProp>
<stringProp name="Steps">5</stringProp>
<stringProp name="Hold">600</stringProp>
<stringProp name="LogFilename"></stringProp>
<stringProp name="Iterations"></stringProp>
<stringProp name="Unit">S</stringProp>
</com.blazemeter.jmeter.threads.concurrency.ConcurrencyThreadGroup>
<hashTree/>
</hashTree>
</hashTree>
</jmeterTestPlan>
Worked numbers: 50 threads reached in 5 steps over 60 s means 10 more threads every 12 s; the 600 s hold then gives the same 660 s total as the core Thread Group profile used elsewhere in this section (60 s ramp-up plus a 10-minute hold).
Opening this file on a JMeter without jpgc-casutg fails because
com.blazemeter.jmeter.threads.concurrency.ConcurrencyThreadGroup cannot be resolved. The Plugins Manager’s
install-for-jmx command, shown below, reads exactly these class names to work out which plugin to install.
Source: Concurrency Thread Group (JMeter Plugins wiki), JMeter Plugins repository catalogue (the componentClasses of jpgc-casutg)
What plugins cost on the load generator
Plugins run inside the same JVM as the virtual users, so their cost is your test’s cost:
-
Start-up and memory. Every jar in
lib/extis scanned at start-up, and every library inlibis loaded into the same heap. A generator image with "everything installed" starts slower and has a larger class footprint than one with the four plugins the plan uses. -
Listeners and graphs. The
jpgc-graphs-*listeners are GUI listeners. Like View Results Tree, they keep data in memory to draw it, so they belong in a debugging session, not in a load run; disable them or remove them from the plan before running in CLI mode. -
Samplers with their own client stacks. HTTP/2, gRPC, Kafka and MQTT plugins bring their own network libraries (Jetty, Netty,
kafka-clients) with their own thread pools and buffers. Size the heap for them and watch generator CPU as closely as for the core HTTP Request. -
Monitoring plugins. PerfMon collects server metrics through a separate agent and plots them in the GUI; it adds its own sampling traffic and memory. Real-time monitoring with the core Backend Listener is covered on a later page.
How the Plugins Manager installs a plugin
The Plugins Manager is itself a plugin. When you open it, it downloads the catalogue (a JSON document), compares it with the jars it finds on JMeter’s classpath, and works out which plugins are installed, which can be installed and which can be upgraded. When you apply changes it resolves dependencies between plugins, downloads the plugin jars and their libraries to temporary files, and hands the actual file moves to a separate helper process, because JMeter cannot replace jars it has open. In the GUI, that process then restarts JMeter.
Details that matter when something goes wrong, taken from the Plugins Manager 2.0 sources:
-
Plugin jars are written next to the Plugins Manager jar (normally
lib/ext); libraries are written to its parent directory (lib) when it is writable. -
Uninstalled jars are not deleted but moved to a temporary folder whose name starts with
jpgc-deleted-jars-; the manager logs the folder name, so an accidental uninstall can be undone by moving the jars back. -
The manager refuses to apply changes when it cannot write to JMeter’s directories ("Have no write access for JMeter directories, not possible to use Plugins Manager"). Install JMeter in a directory the user running it owns.
-
The catalogue is cached in
pmgr_cacheunder thejava.io.tmpdirdirectory; without server cache headers a cached copy is treated as valid for one hour.
Installing the Plugins Manager
In the GUI
-
Download the Plugins Manager jar. The install page links to
https://jmeter-plugins.org/get/, which always serves the latest version; for a reproducible install take the versioned jar from Maven Central instead (below). -
Put the jar into
lib/extof your JMeter installation. -
Restart JMeter.
-
Open Options → Plugins Manager. A toolbar button with the same function is added as well.
export JMETER_HOME=/opt/apache-jmeter-5.6.3
# the Plugins Manager itself, pinned to 2.0
curl -fL -o "$JMETER_HOME/lib/ext/jmeter-plugins-manager-2.0.jar" \
https://repo1.maven.org/maven2/kg/apc/jmeter-plugins-manager/2.0/jmeter-plugins-manager-2.0.jar
# its command-line runner, needed for PluginsManagerCMD (see below)
curl -fL -o "$JMETER_HOME/lib/cmdrunner-2.3.jar" \
https://repo1.maven.org/maven2/kg/apc/cmdrunner/2.3/cmdrunner-2.3.jar
ls "$JMETER_HOME/lib/ext" | grep plugins-manager
Output:
jmeter-plugins-manager-2.0.jar
Maven Central publishes a .sha1 (and .md5) file next to each jar, so the download can be checked the same way as the
JMeter archive on the installation page.
The Plugins Manager dialog
| Element | What it does |
|---|---|
Options → Plugins Manager menu item and toolbar button |
Open the dialog. When any installed plugin has a newer version, the label reads "Plugins Manager (has upgrades)". |
Installed Plugins tab |
Every plugin the manager recognises on the classpath, core JMeter parts included. Removing a tick schedules the plugin for uninstall. |
Available Plugins tab |
Every catalogue entry that is not installed. Setting a tick schedules the plugin for installation. |
Upgrades tab |
Installed plugins with a newer version. All of them are pre-selected for upgrade; upgradable plugins are also shown in italics on the Installed tab. |
Search… field |
Filters the list of the current tab by name. |
Description pane |
The selected plugin’s description, vendor and a link to its documentation (the catalogue’s |
Version: drop-down |
Chooses which catalogue version to install or upgrade to. This is how you pin an older version in the GUI. |
Review Changes pane |
Lists every change that Apply will make, including plugins that are uninstalled or installed because of dependencies. Read it before applying. |
Apply Changes and Restart JMeter button |
Downloads, hands the file moves to the helper process and restarts JMeter. Save the open plan first. |
Toggle All (right-click on a list) |
Ticks or unticks every item in the list. Slow on the Available tab, and rarely what you want. |
The wiki suggests one more use of the dialog: uninstalling core parts you never use (for example jmeter-ldap or
jmeter-ftp) to tidy the Add menus. On a load generator that runs one plan, a smaller installation also starts
faster. Never uninstall jmeter-core or a component your plans use.
An empty dialog almost always means that the manager cannot reach the catalogue, usually because a proxy is needed.
New plugins that do not appear mean a stale cache: delete the pmgr_cache folder in the java.io.tmpdir directory
and reopen the dialog.
Proxy, timeout and TLS
The manager respects JMeter’s proxy settings. The wiki recommends passing them through JVM_ARGS rather than editing
properties files; credentials use the http.proxyUser and http.proxyPass properties:
JVM_ARGS="-Dhttps.proxyHost=proxy.example.internal -Dhttps.proxyPort=8080" "$JMETER_HOME/bin/jmeter"
| Property | Default | Meaning |
|---|---|---|
|
Catalogue location(s), separated by |
|
|
|
Send anonymous usage statistics (see below). Set to |
|
|
Network timeout for the catalogue and downloads in the GUI. The wiki suggests |
|
unset |
Proxy for the manager’s downloads, passed as JVM system properties. |
The defaults are taken from the 2.0 source; the wiki gives the property names and the suggested timeout value. For the
"trustAnchors parameter must be non-empty" TLS error, the wiki suggests pointing javax.net.ssl.trustStore at the
JDK’s cacerts file through JVM_ARGS.
Command-line installs for CI and Docker
A load generator in CI or in a container has no GUI. The Plugins Manager ships a command-line tool for that case,
PluginsManagerCMD, which runs through cmdrunner.
Preparing the command-line tool
The wiki lists two prerequisites:
-
cmdrunnerinlib. The wiki still namescmdrunner-2.0.jar, but thePluginsManagerCMD.shscript that Plugins Manager 2.0 generates runslib/cmdrunner-2.3.jar, and the 2.0 catalogue entry depends oncmdrunner>=2.3. Install 2.3, as in the download step above. -
PluginsManagerCMD.sh(or.bat) inbin. Generate both scripts with the installer class shipped inside the manager jar:
java -cp "$JMETER_HOME/lib/ext/jmeter-plugins-manager-2.0.jar" \
org.jmeterplugins.repository.PluginManagerCMDInstaller
ls "$JMETER_HOME/bin" | grep PluginsManagerCMD
Output:
PluginsManagerCMD.bat
PluginsManagerCMD.sh
The generated Unix script is one line: it runs Java headless with $JVM_ARGS and starts
org.jmeterplugins.repository.PluginManagerCMD through lib/cmdrunner-2.3.jar, so proxy settings go into JVM_ARGS
exactly as for the GUI.
Commands
The syntax is PluginsManagerCMD <command> [<params>]. Plugin lists are comma-separated ids, and id=version pins a
version.
| Command | Parameters | Effect |
|---|---|---|
|
none |
Prints the usage text. |
|
none |
Prints the installed plugins as |
|
none |
Prints every catalogue entry that is not installed with its versions, newest first. |
|
none |
Prints installed plugins that have a newer version as |
|
|
Installs (or upgrades or downgrades to) the given plugins and their dependencies. |
|
|
Installs every available plugin except the listed ones. Avoid on load generators: it installs everything. |
|
path(s) of |
Analyses the plans, finds the classes they reference that are not installed, and installs the plugins whose catalogue entries declare those classes. |
|
|
Uninstalls the given plugins (core parts such as |
Command-line changes are applied without a restart: there is no JMeter process to restart. The file moves are still
done by a helper process that the command starts, so check the result with status (or by listing lib/ext) before
running a test.
Example: the Bookshelf generator
The Bookshelf plans use the Concurrency Thread Group (jpgc-casutg), the Throughput Shaping Timer (jpgc-tst), the
Dummy Sampler for debugging extractors (jpgc-dummy) and, for bookshelf-grpc.jmx, the gRPC Request sampler
(jmeter-grpc-request). Pin all four:
cd "$JMETER_HOME"
bin/PluginsManagerCMD.sh install jpgc-casutg=3.1.1,jpgc-tst=2.6,jpgc-dummy=0.4,jmeter-grpc-request=2.0.2
bin/PluginsManagerCMD.sh status
The last line of status lists what is installed (abridged here; the core parts appear with the JMeter version):
[jpgc-casutg=3.1.1, jpgc-tst=2.6, jpgc-dummy=0.4, jmeter-grpc-request=2.0.2, jpgc-plugins-manager=2.0, jmeter-core=5.6.3, jmeter-http=5.6.3, ...]
Alternatively, let the plans decide:
bin/PluginsManagerCMD.sh install-for-jmx /work/plans/bookshelf-load.jmx,/work/plans/bookshelf-grpc.jmx
install-for-jmx is convenient but installs the latest version of each plugin it finds, so it is not reproducible
over time. Use it once to discover the ids, then pin them with install id=version in scripts.
Example: a Docker image with pinned plugins
There is no official Apache JMeter image. This Dockerfile builds a generator from the official binary distribution and installs the Plugins Manager and the Bookshelf plugins at fixed versions, so every container runs the same code:
FROM eclipse-temurin:21-jre
ARG JMETER_VERSION=5.6.3
ARG PMGR_VERSION=2.0
ARG CMDRUNNER_VERSION=2.3
ENV JMETER_HOME=/opt/apache-jmeter-${JMETER_VERSION}
ENV PATH="${JMETER_HOME}/bin:${PATH}"
RUN apt-get update && apt-get install -y --no-install-recommends curl && rm -rf /var/lib/apt/lists/* \
&& curl -fL https://dlcdn.apache.org/jmeter/binaries/apache-jmeter-${JMETER_VERSION}.tgz | tar -xz -C /opt \
&& curl -fL -o ${JMETER_HOME}/lib/ext/jmeter-plugins-manager-${PMGR_VERSION}.jar \
https://repo1.maven.org/maven2/kg/apc/jmeter-plugins-manager/${PMGR_VERSION}/jmeter-plugins-manager-${PMGR_VERSION}.jar \
&& curl -fL -o ${JMETER_HOME}/lib/cmdrunner-${CMDRUNNER_VERSION}.jar \
https://repo1.maven.org/maven2/kg/apc/cmdrunner/${CMDRUNNER_VERSION}/cmdrunner-${CMDRUNNER_VERSION}.jar \
&& java -cp ${JMETER_HOME}/lib/ext/jmeter-plugins-manager-${PMGR_VERSION}.jar \
org.jmeterplugins.repository.PluginManagerCMDInstaller \
&& echo "jpgc.repo.sendstats=false" >> ${JMETER_HOME}/bin/jmeter.properties \
&& PluginsManagerCMD.sh install jpgc-casutg=3.1.1,jpgc-tst=2.6,jpgc-dummy=0.4,jmeter-grpc-request=2.0.2 \
&& sleep 5 && PluginsManagerCMD.sh status
WORKDIR /work
ENTRYPOINT ["jmeter"]
Build it and run the smoke profile against the local Bookshelf API:
docker build -t bookshelf-jmeter:5.6.3 .
docker run --rm --network host -v "$PWD:/work" bookshelf-jmeter:5.6.3 \
-n -t bookshelf-load.jmx -Jthreads=1 -Jrampup=1 -Jduration=60 -l results.jtl
Three details in this file are deliberate:
-
The SHA-512 check is omitted for brevity. In a real image, verify the JMeter archive as shown on the installation page before unpacking it.
-
Statistics are switched off in
jmeter.properties. Normally properties belong inuser.properties, but the 2.0 source of the command-line tool loads onlybin/jmeter.propertiesbefore it readsjpgc.repo.sendstats, so a value inuser.propertieswould not reachPluginsManagerCMD. Appending one line in an image build is a reproducible change, not a hand edit. In the GUI,user.propertiesworks as usual. -
The
sleepbeforestatusgives the helper process that moves the jars time to finish inside the sameRUNstep; thestatusoutput in the build log is the record of what the image contains.
Configuration
Pinning versions
The catalogue changes without notice: new versions appear, and occasionally the distribution of a plugin moves to a
different maintainer (as happened to jmeter-grpc-request, see the catalogue below). Results are only comparable when
the generator runs the same plugin code, so pin versions everywhere:
-
in scripts and Dockerfiles, always use
install id=version, never a bareinstall idorinstall-for-jmx; -
keep the list in one place (a build argument, a
plugins.txtfile read by the build, or the Mavenpom.xml) and review changes to it like any dependency upgrade; -
record the output of
PluginsManagerCMD.sh statuswith each test’s results, next to the JMeter and Java versions; -
in the GUI, choose the version in the Version: drop-down rather than accepting the pre-selected upgrades;
-
make sure every node of a distributed test has the same plugins at the same versions; the distributed testing page explains why every node must be identical.
A private repository
jpgc.repo.address accepts several catalogue URLs separated by ;. The first is normally the public catalogue; the
others are your own. When two catalogues declare the same plugin id, the first one wins:
# user.properties
jpgc.repo.address=https://jmeter-plugins.org/repo/;https://repo.example.internal/jmeter/plugins-repo.json
A catalogue is a JSON array of plugin entries. This entry publishes a hypothetical internal function library used by the Bookshelf team, in the same shape as the public entries:
[
{
"id": "bookshelf-functions",
"name": "Bookshelf test functions",
"description": "Internal functions for Bookshelf test data",
"helpUrl": "https://repo.example.internal/jmeter/bookshelf-functions.html",
"vendor": "Bookshelf QA",
"markerClass": "org.example.bookshelf.jmeter.IsbnFunction",
"componentClasses": ["org.example.bookshelf.jmeter.IsbnFunction"],
"versions": {
"1.0.0": {
"changes": "First release",
"downloadUrl": "https://repo.example.internal/jmeter/bookshelf-functions-1.0.0.jar",
"depends": ["jmeter-core"],
"libs": {}
}
}
}
]
The fields mirror the public catalogue: markerClass is the class the manager looks for to decide whether the plugin
is installed, componentClasses lists the classes install-for-jmx matches against, depends names other plugin ids
and libs maps library names to jar URLs that are installed into lib. The wiki says the JSON must satisfy the
catalogue’s format requirements and points plugin authors to the project’s forum for details; the public catalogue is
the best reference for valid entries.
For an air-gapped network, mirror the public catalogue and the jars it points to on an internal server and list only
the internal URL. The 2.0 source also accepts a path to a local JSON file as the value of jpgc.repo.address (a single
file, not a list); this is not described in the wiki.
The command-line tool reads jpgc.repo.address from jmeter.properties or, failing that, from a JVM system property,
so in CI pass it as JVM_ARGS="-Djpgc.repo.address=...".
Usage statistics
By default the Plugins Manager sends anonymous information to jmeter-plugins.org: the full JMeter version, the list of installed plugins with their versions, and an anonymous unique id for the installation. The wiki states that no personally identifiable information is sent and that the statistics are published on the site’s statistics page. Organisations that do not allow outbound telemetry from test infrastructure should opt out:
# user.properties (GUI); bin/jmeter.properties for the command-line tool, see the Docker example
jpgc.repo.sendstats=false
In the 2.0 source, install-for-jmx never sends statistics, while install, uninstall and install-all-except do
unless the property is false.
Checking plugin versions from a test
The Plugins Manager exposes two static methods that scripts can call. They are useful in a setUp Thread Group that logs the generator’s plugin set, or that fails the test early when a required plugin is missing:
// JSR223 Sampler (Groovy) in a setUp Thread Group
import org.jmeterplugins.repository.PluginManager
def casutg = PluginManager.getPluginStatus('jpgc-casutg') // e.g. "3.1.1", or null if not installed
log.info('Plugins on this generator: ' + PluginManager.getAllPluginsStatus())
if (casutg == null) {
SampleResult.setSuccessful(false)
SampleResult.setResponseMessage('jpgc-casutg is not installed on this load generator')
}
Scripting with JSR223 elements and the log and SampleResult bindings is covered in
Scripting with JSR223 & Groovy.
Adding plugins without the manager
With the jmeter-maven-plugin
The jmeter-maven-plugin builds its own JMeter installation under target and runs the plans in src/test/jmeter. It
does not use the Plugins Manager; plugins are Maven artifacts listed in <jmeterExtensions> and copied into the
generated lib/ext. Three configuration elements decide what ends up on the classpath:
| Element | Default | Meaning |
|---|---|---|
|
empty |
|
|
|
Also copy the transitive dependencies of the extensions into |
|
empty |
|
|
empty |
Artifacts copied into |
|
|
The JMeter version the plugin builds. |
The wiki’s own example sets <downloadExtensionDependencies> to false because some plugins "use some broken
dependencies". The jpgc-* POMs show why: jmeter-plugins-casutg 3.1.1 declares a compile dependency on
ApacheJMeter_core 5.2.1, and jmeter-plugins-cmn-jmeter on ApacheJMeter_core 2.13, so resolving transitively would
copy old JMeter core jars next to the current ones. The reliable pattern is to switch transitive resolution off and list
exactly the jars the Plugins Manager catalogue would install, the plugin plus its libs. For the Bookshelf plans that is:
<plugin>
<groupId>com.lazerycode.jmeter</groupId>
<artifactId>jmeter-maven-plugin</artifactId>
<version>3.8.0</version>
<executions>
<execution>
<id>configuration</id>
<goals>
<goal>configure</goal>
</goals>
</execution>
<execution>
<id>jmeter-tests</id>
<goals>
<goal>jmeter</goal>
</goals>
</execution>
<execution>
<id>jmeter-check-results</id>
<goals>
<goal>results</goal>
</goals>
</execution>
</executions>
<configuration>
<jmeterVersion>5.6.3</jmeterVersion>
<jmeterExtensions>
<artifact>kg.apc:jmeter-plugins-casutg:3.1.1</artifact>
<artifact>kg.apc:jmeter-plugins-tst:2.6</artifact>
<artifact>kg.apc:jmeter-plugins-dummy:0.4</artifact>
<!-- library that the jpgc plugins need, as listed in their catalogue entries -->
<artifact>kg.apc:jmeter-plugins-cmn-jmeter:0.7</artifact>
</jmeterExtensions>
<downloadExtensionDependencies>false</downloadExtensionDependencies>
</configuration>
</plugin>
After mvn verify, the generated lib/ext contains exactly those jars:
mvn -q verify
ls target/*/jmeter/lib/ext | grep -E 'casutg|tst|dummy|cmn'
jmeter-plugins-casutg-3.1.1.jar
jmeter-plugins-cmn-jmeter-0.7.jar
jmeter-plugins-dummy-0.4.jar
jmeter-plugins-tst-2.6.jar
The plugin creates the JMeter installation in a generated (UUID-named) folder under target, as the wiki shows, hence
the wildcard. The library jar lands in lib/ext rather than lib here; that works because lib/ext is also on the
classpath.
Plugins that are not on Maven Central. At the time of writing, the 2.0.x releases of jmeter-grpc-request are
published only as GitHub release assets (the catalogue’s downloadUrl points there), and bzm-http2 3.x likewise; Maven
Central holds only com.blazemeter:jmeter-bzm-http2 up to 1.4. Download the release jar, install it into your
repository manager (or the local repository with Maven’s standard install:install-file goal) under coordinates of your
choosing, and list those coordinates in <jmeterExtensions>.
The jmeter-maven-plugin itself, its goals and the CI pipeline around it are covered on the CI/CD page of this section; Performance Testing with JMeter in the Spring Boot reference shows the same plugin in a Spring Boot project.
Manual jar install
Without network access from the generator, or for a one-off check, install a plugin by hand. The catalogue entry tells
you exactly which files the Plugins Manager would install: downloadUrl is the plugin jar for lib/ext, libs are the
libraries for lib, and depends lists other plugin ids that must be installed first. Read them with jq:
curl -fsSL https://jmeter-plugins.org/repo/ -o jpgc-repo.json
jq '.[] | select(.id=="jpgc-tst") | .versions["2.6"]' jpgc-repo.json
Output:
{
"changes": "Added support for multiple load_profile properties",
"downloadUrl": "https://repo.maven.apache.org/maven2/kg/apc/jmeter-plugins-tst/2.6/jmeter-plugins-tst-2.6.jar",
"libs": {
"jmeter-plugins-cmn-jmeter": "https://repo.maven.apache.org/maven2/kg/apc/jmeter-plugins-cmn-jmeter/0.7/jmeter-plugins-cmn-jmeter-0.7.jar"
}
}
Then copy the files and restart JMeter:
curl -fL -o "$JMETER_HOME/lib/ext/jmeter-plugins-tst-2.6.jar" \
https://repo.maven.apache.org/maven2/kg/apc/jmeter-plugins-tst/2.6/jmeter-plugins-tst-2.6.jar
curl -fL -o "$JMETER_HOME/lib/jmeter-plugins-cmn-jmeter-0.7.jar" \
https://repo.maven.apache.org/maven2/kg/apc/jmeter-plugins-cmn-jmeter/0.7/jmeter-plugins-cmn-jmeter-0.7.jar
Manual installs have two classic failure modes:
-
Two versions of the same jar. Copying
jmeter-plugins-tst-2.6.jarnext to an olderjmeter-plugins-tst-2.5.jarleaves both on the classpath, and which class wins is undefined. Remove the old jar first. -
A library in the wrong place, or missing. A plugin without its
libsfails when the element is added or the plan is loaded, typically with aNoClassDefFoundError. Libraries belong inlib(orplugin_dependency_paths), not inlib/ext, when you install by hand.
If the Plugins Manager is installed as well, it recognises manually copied jars through their markerClass, so the
manual install shows up on the Installed Plugins tab.
Catalogue of useful plugins
The table lists the plugins this section refers to, with the id to use in PluginsManagerCMD, the latest version in
the catalogue, its purpose and its maintenance status on 2026-10-14. "Last release" is the publication date of that
version on Maven Central or on the plugin’s GitHub releases page; a plugin that has not changed for years is not
necessarily broken, but nobody is fixing it either.
| Plugin | Id | Version | Purpose | Maintenance status |
|---|---|---|---|---|
Plugins Manager |
|
2.0 |
Installs, upgrades and removes plugins; GUI dialog and |
Active: 2.0 released 2026-08. Requires JMeter 3.2 or later and |
Custom Thread Groups |
|
3.1.1 |
Concurrency, Ultimate, Stepping, Arrivals and Free-Form Arrivals thread groups. |
Maintained: 3.1.1 released 2025-05. The Stepping Thread Group is superseded by the Concurrency Thread Group. |
Throughput Shaping Timer |
|
2.6 |
Shapes requests per second over time with a |
Stable: 2.6 released 2023-07 (multiple |
3 Basic Graphs |
|
2.0 |
Average Response Time, Active Threads and Successful/Failed Transactions graphs in the GUI. |
Unchanged since 2016. GUI-only; use the HTML dashboard for reports. |
PerfMon (Servers Performance Monitoring) |
|
2.1 |
Collects CPU, memory, disk and network metrics from a ServerAgent started on the target machine. |
Legacy: unchanged since 2016. Prefer the Backend Listener with server-side metrics (Prometheus, Actuator). |
Auto-Stop Listener |
|
0.3 |
Stops the test when runtime KPIs (response time, errors, latency) cross a threshold. |
Maintained: 0.3 released 2025-06 (response-time percentile criterion). |
Dummy Sampler |
|
0.4 |
Generates a sample with the response you specify, without network traffic; for debugging extractors and logic. |
Stable: unchanged since 2019. |
Custom JMeter Functions |
|
2.2 |
Extra functions such as |
Stable: 2.2 released 2022-10. Check core functions first; many needs are covered by |
Inter-Thread Communication |
|
0.2 |
Global string queues for passing values between threads and thread groups. |
Unchanged since 2016. |
JSON/YAML Plugins (deprecated) |
|
2.7 |
JSONPath extractor and assertion, plus YAML variants. |
Deprecated in the catalogue "in favor of core JMeter 4.0+": use the core JSON Extractor, JSON JMESPath Extractor
and JSON Assertion. Bundles old |
jpgc - Standard Set |
|
2.0 |
Virtual package that installs |
Convenience only; install the individual plugins you need instead. |
BlazeMeter - HTTP Plugin |
|
3.2.0 |
|
Active: 3.2.0 released 2026-08-25 (GitHub). Requires Java 17 or later; depends on core |
WebSocket Samplers by Peter Doornbosch |
|
1.3.2 |
Six samplers for WebSocket connections, including a request-response sampler. |
Maintained: 1.3.2 released 2026-01 (Maven Central). The other WebSocket entry, |
DI KafkaMeter |
|
1.3 |
Kafka producer and consumer samplers and configuration elements. |
Low activity: 1.3 released 2024-09. No licence file at the repository root when checked. The older |
MQTT Protocol Samplers (XMeter) |
|
2.0.2 |
Connect, publish, subscribe and disconnect samplers for MQTT. |
Low activity: repository last updated 2023-05; the jar bundles its dependencies. The |
JMeter gRPC Request |
|
2.0.2 |
gRPC sampler that parses |
Continuation: the original zalopay-oss repository was archived (last release 1.2.6, 2022-12); the catalogue now points to the bakthava fork, 2.0.0 to 2.0.2 released 2026-04 (CVE fixes, mTLS fields, Java 21 build fixes). Low adoption. |
Two things this table does not change: core JMeter has no HTTP/2, WebSocket, Kafka, MQTT or gRPC support, so for
those protocols a plugin is the only JMeter option; and the presence of an entry in the catalogue says nothing about its
quality. The HTTP/2 sampler is introduced on HTTP Requests, and the core JSON
extractors that replace jpgc-json on Correlation & Extractors.
How to judge a plugin before using it
A plugin becomes part of every measurement it touches. Before building a test on one, check:
| Check | How to check it |
|---|---|
Last release and activity |
The newest version in the catalogue, its date on Maven Central or GitHub, and whether issues get answers. Years without a release are acceptable for a simple, finished plugin (Dummy Sampler) and a risk for one that wraps a fast-moving client library (Kafka, gRPC, HTTP/3). |
Maintainer and archive status |
Who publishes it, and whether the repository is archived or has moved. |
JMeter and Java compatibility |
The catalogue’s |
Licence |
A |
Dependencies |
The |
Where the jar comes from |
Maven Central, a GitHub release, or |
SNAPSHOT versions |
An entry offering only a |
A core alternative |
Core JMeter has absorbed several plugins over time (JSON extractors and assertions in 4.0, the Precise Throughput Timer in 4.0, the Open Model Thread Group in 5.5). A core element is supported by the Apache project; a plugin is not. |
From the books to 5.6 to 6.0
| Era | How plugins were installed and used |
|---|---|
JMeter 2.11 to 3.0 (the books) |
JMeter Cookbook (appendix) installs plugins by unzipping the "Standard" and "Extras" sets into the JMeter directory;
chapter 6 uses the Ultimate and Stepping Thread Groups and the Throughput Shaping Timer, and chapter 2 the JSON Path
Extractor plugin. Performance Testing with JMeter (chapter 5) and Pro Apache JMeter (chapter 9) monitor servers with
PerfMon and ServerAgent. Plugin elements were prefixed |
JMeter 3.x to 5.5 |
The Plugins Manager replaces the zip sets; plugins are installed one by one with dependencies resolved. JMeter 4.0
moves JSON extraction and assertion into core, which deprecates |
JMeter 5.6 to 5.6.3 |
Plugins are found through |
JMeter 6.0 (planned) |
Per |
Pitfalls
-
Treating jmeter-plugins.org as part of Apache JMeter. It is a separate community project; Apache does not support its plugins, and bugs in them are reported to their own maintainers.
-
Unpinned installs.
install idandinstall-for-jmxtake the newest version on the day the image is built, so two builds of the "same" generator can differ. Pin withid=version. -
Different plugins on different nodes. A distributed test where one node lacks a plugin fails on that node; one with a different version produces results that cannot be compared.
-
Jars in the wrong directory. Libraries in
lib/extslow start-up; plugins inlibare never found; two versions of a jar on the classpath behave unpredictably. -
Following the wiki’s
cmdrunner-2.0.jar. The command-line script generated by Plugins Manager 2.0 runscmdrunner-2.3.jar; with only 2.0 present it fails to start. -
No write access. A JMeter installed by root and run as another user cannot be changed by the Plugins Manager.
-
Stale cache. Plugins missing from the dialog after a catalogue update: delete
pmgr_cacheinjava.io.tmpdir. -
GUI graph listeners left in a load run. They hold results in memory; remove or disable them for CLI runs.
-
Transitive Maven dependencies.
<downloadExtensionDependencies>left attruecopies oldApacheJMeter_corejars into the build’s JMeter; switch it off and list the libraries explicitly. -
Deprecated plugins kept out of habit.
jpgc-jsonand PerfMon still install, but core elements and server-side monitoring do the job with support from the Apache project or from your monitoring stack.
References
-
JMeter Plugins (jmeter-plugins.org): the community project, its install page and support forum.
-
JMeter Plugins Manager (JMeter Plugins wiki): installation, dialog, cache, private repositories, usage statistics.
-
Plugins Manager from Command-Line (JMeter Plugins wiki):
cmdrunner,PluginManagerCMDInstaller,PluginsManagerCMDcommands, scripting methods. -
Plugins Manager Network Configuration (JMeter Plugins wiki): proxy,
jpgc.repo.timeout, TLS trust store. -
JMeter Plugins repository catalogue: plugin ids, versions, download URLs, libraries and dependencies.
-
jmeter-plugins-manager source and README (GitHub): property defaults, file locations and command-line behaviour of version 2.0.
-
Concurrency Thread Group, Throughput Shaping Timer, PerfMon, Auto-Stop and Custom JMeter Functions (JMeter Plugins wiki).
-
BlazeMeter HTTP Plugin (GitHub), jmeter-grpc-request (bakthava) and jmeter-grpc-request (zalopay-oss, archived).
-
jmeter-maven-plugin and its wiki pages Adding/Excluding libraries to/from the classpath and Specifying JMeter Version.
-
Getting Started (Apache JMeter User Manual): classpath configuration and
lib/ext. -
Changes History: ServiceLoader plugin loading in 5.6, core JSON elements in 4.0.
-
apache/jmeter on GitHub:
JMeterUtilsandClassFinderatrel/v5.6.3, and the planned 6.0 changes inxdocs/changes.xmlon master. -
Bayo Erinle, JMeter Cookbook, Packt, 2014: chapter 2 (JSON Path Extractor plugin), chapter 6 (Ultimate and Stepping Thread Groups, Throughput Shaping Timer), appendix (installing plugins).
-
Bayo Erinle, Performance Testing with JMeter, 2nd ed., Packt, 2015: chapter 5 (PerfMon).
-
Sai Matam and Jagdeep Jain, Pro Apache JMeter, Apress, 2017: chapter 9 (PerfMon and ServerAgent).