Hop Plugin Development Guide
Apache Hop is architected around an extensible plugin ecosystem. Nearly every functional capability in Hop is a plugin: the transforms that process rows, the actions in workflows, the databases Hop connects to, the metadata objects edited in the GUI, the GUI perspectives, the CLI sub-commands, and the storage systems accessed via VFS.
This guide provides practical, step-by-step instructions for implementing Hop plugins across 15 primary plugin types, with direct references to real-world implementations in the Apache Hop repository.
How Hop Discovers Plugins
Hop uses annotation-driven discovery powered by Jandex annotation indexes (META-INF/jandex.idx):
-
Native Classpath Plugins: Discovered from jars on the application classpath containing a Jandex index. Core plugins in
hop-core,hop-engine, andhop-uiare loaded this way. -
Plugin Folder Plugins: Discovered from jars inside the
plugins/directory (or custom folders configured viaHOP_PLUGIN_BASE_FOLDERS). Each plugin folder receives its own isolatedURLClassLoadercovering the plugin jar and its privatelib/directory.
|
No Jandex index = No plugin.
Every plugin jar must contain |
Classloading and classLoaderGroup
To avoid classpath conflicts, external plugins run in isolated classloaders. However, related plugins often need to share classes (for example, a database dialect and its corresponding bulk-loader transform, or a VFS plugin and its metadata connection).
Set classLoaderGroup on the plugin annotation to group plugins into a shared classloader:
@VfsPlugin(
type = "azure",
typeDescription = "Azure VFS",
classLoaderGroup = "vfs-azure"
)
Project Structure & Packaging
In the Hop codebase, plugins are organized under plugins/ by category:
-
plugins/transforms: Pipeline transforms -
plugins/actions: Workflow actions -
plugins/databases: Database dialects -
plugins/tech: Technology bundles (AWS, Azure, Google, Neo4j, and the VFS providers) -
plugins/valuetypes: Custom row data types -
plugins/resolvers: Variable resolvers -
plugins/misc: Miscellaneous plugins
Adding a plugin requires:
1. Creating a Maven module inheriting from the category POM (e.g. hop-plugins-transforms).
2. Adding src/assembly/assembly.xml referring to assemblies/shared/hop-plugin-libs.xml.
3. Adding src/main/resources/version.xml with ${project.version}.
4. Adding a <dependency> with <type>zip</type> in assemblies/plugins/pom.xml.
Plugin Types Catalogue
Explore the dedicated development guides below for each plugin type:
| Plugin Type | Annotation | Guide & Overview |
|---|---|---|
Transform |
|
Transform Plugins — Units of work in pipelines streaming rows. |
Action |
|
Action Plugins — Sequential and conditional tasks in workflows. |
Metadata Element |
|
Metadata Element Plugins — Shared configurations persisted as JSON. |
Database Dialect |
|
Database Plugins — Relational database dialects and SQL syntax. |
GUI Contribution |
|
GUI Plugins — Toolbars, menus, settings tabs, and composite widgets. |
File Type |
|
Hop File Types — File formats recognised and opened by Hop GUI. |
Variable Resolver |
|
Variable Resolvers — Retrieving secrets from external vaults. |
Extension Point |
|
Extension Points — Hooking into runtime and GUI lifecycles. |
Hop Command |
|
Hop Commands — New CLI sub-commands ( |
Configuration |
|
Configuration Plugins — CLI option mixins and GUI options tabs. |
Perspective |
|
Perspectives — Full-screen workbenches in Hop GUI. |
VFS Provider |
|
VFS Plugins — Storage URL schemes for Apache Commons VFS. |
Value Metadata |
|
Value Types — Custom data types in the pipeline row stream. |
Hop Server Servlet |
|
Server Servlets — Custom HTTP endpoints on Hop Server. |
Execution Info Location |
|
Execution Information Locations — Storing runtime metrics and logs. |
See also
-
Plugin types — every plugin type, including the ones this guide does not walk through.