Skip to main content

creating-extensions

How to create a new Quarkus extension: full module layout, package naming, artifact naming, dependency rules, and Dev UI setup.

Source facts

Repository
quarkusio/quarkus
Last source activity
April 9, 2026 at 00:19
Detected SKILL.md language
English
Stars
15,942
Forks
3,337

Install options

The review-first prompt is selected by default. You can switch to a direct command or download a local copy.

Review the source files

Read SKILL.md and any companion files shown by SkillsMP before deciding whether to install.

Showing SKILL.md

SKILL.md
Source instructions · Read-only preview
name
creating-extensions
description
How to create a new Quarkus extension: full module layout, package naming, artifact naming, dependency rules, and Dev UI setup.
# Creating Extensions ## Extension Module Layout Every extension lives under `extensions/<name>/` with this structure: ``` extensions/<name>/ runtime/ # Runtime classes, recorders, beans (quarkus-<name>) runtime-api/ # (optional) Public APIs for loose coupling (quarkus-<name>-api) deployment/ # @BuildStep processors (quarkus-<name>-deployment) deployment-spi/ # (optional) Public build items for cross-extension use (quarkus-<name>-deployment-spi) runtime-dev/ # (optional) Dev UI/Shell components, dev mode only (quarkus-<name>-dev) codegen/ # (optional) Code generation utilities (quarkus-<name>-codegen) cli/ # (optional) CLI commands (quarkus-<name>-cli) codestart/ # (optional) Codestart templates (quarkus-<name>-codestart) ``` Only `runtime` and `deployment` are mandatory. ## Dependency Rules - **Deployment depends on runtime**, never the reverse - External consumers use `runtime-api` or `deployment-spi` for loose coupling - External consumers use `runtime` or `deployment` for tight coupling - Both `runtime/` and `deployment/` POMs must include `quarkus-extension-processor` as an annotation processor path ## Package Naming | Module | Package | |--------|---------| | Runtime | `io.quarkus.<extension-name>` | | Runtime internals | `io.quarkus.<extension-name>.runtime.internal` | | Runtime API | `io.quarkus.<extension-name>.api` | | Deployment | `io.quarkus.<extension-name>.deployment` | | Deployment SPI | `io.quarkus.<extension-name>.deployment.spi` | | Runtime Dev | `io.quarkus.<extension-name>.dev` | Hyphenated names become underscored: `quarkus-foo-bar` -> `io.quarkus.foo_bar` ## Artifact Naming - Runtime: `quarkus-<name>` - Deployment: `quarkus-<name>-deployment` - See `adr/0009-extension-structure.adoc` for the full naming table ## Dev UI - Provide `CardPageBuildItem` and `JsonRPCProvidersBuildItem` in deployment processors guarded by `@BuildSteps(onlyIf = IsLocalDevelopment.class)` - Dev-only classes go in `runtime-dev/` modules - See the `classloading-and-runtime-dev` skill for runtime-dev wiring details ## After Creating an Extension - Run `./update-extension-dependencies.sh` after adding/removing/renaming — this ensures modules like `devtools/bom-descriptor-json` build in the correct order relative to the new extension - Always `install` (not just `compile`) so dependent modules can find it - If you change a runtime module, rebuild its deployment module too - Run `mvn -Dowasp-check` in the extension directory to check for known security vulnerabilities in dependencies ## External Maven Repositories Quarkus uses `--ignore-transitive-repositories` to ensure all dependencies come from Maven Central. If your extension needs an external repository: 1. Discuss with the Quarkus Core team first — external repos are avoided 2. Add the repository to the specific extension module's `pom.xml`, not the root `pom.xml` 3. Declare Maven Central **first** in the `<repositories>` element 4. Add a `.mvn/rrf/groupId-<REPOSITORY-ID>.txt` file listing authorized `groupId`s (one per line) 5. Verify with: `./mvnw -Dquickly -Dmaven.repo.local=/tmp/temp-repo` ## Independent Projects Some sub-projects in `independent-projects/` have their own build lifecycle: - `arc/` — The CDI implementation - `resteasy-reactive/` — RESTEasy Reactive - `qute/` — The templating engine - `tools/` — Shared tooling utilities These can be built standalone but are also included in the main Quarkus build.
View on GitHub