This page consolidates Grimm’s public surface: artefacts to declare, exported Java modules, OpenAPI 3.1 annotations the scanner understands, and mp.openapi.* keys honoured by ConfigApplier.

Maven artefacts

groupId artifactId Role

io.vidocq.grimm

grimm-core

Annotation scanner, JSON/YAML serializer, internal model, merger, OASFactoryResolver.

io.vidocq.grimm

grimm-processor

APT processor generating the $$GrimmModel compile-time companions consumed through io.vidocq.grimm.spi.gen.

io.vidocq.grimm

grimm-cdi-vauban

Vauban BCE, GrimmModelCache, /openapi JAX-RS resource, config producer.

io.vidocq.grimm

grimm-bench

JMH benchmarks (vs SmallRye). Not for production.

io.vidocq.grimm

grimm-examples

Standalone or integrated usage examples.

io.vidocq.grimm

grimm-tck

Official MP OpenAPI 4.1 TCK runner — out of reactor (Model 4.0.0). Do not declare as an application dependency.

Every artefact is at 0.3.0.

Java modules

Module Contents

io.vidocq.grimm.core

Exports io.vidocq.grimm.spi.gen (compile-time contribution SPI) and io.vidocq.grimm.internal.reader (static-document readers) unqualified; exports io.vidocq.grimm.internal, internal.config, internal.merger, internal.schema only to io.vidocq.grimm.cdi.vauban. internal.factory, internal.invoker, internal.model, internal.scanner, internal.serialization are not exported at all.

io.vidocq.grimm.processor

No exports — the APT processor is consumed exclusively through the javax.annotation.processing.Processor service it provides.

io.vidocq.grimm.cdi.vauban

io.vidocq.grimm.cdi — GrimmExtension, OpenApiResource, GrimmModelCache, GrimmConfigProducer, GrimmAutoDiscovery.

Apart from io.vidocq.grimm.internal.reader, the io.vidocq.grimm.internal.* packages are reserved for Grimm’s own modules. Any application class depending on them signals a regression to fix.

Supported MicroProfile OpenAPI annotations

Annotation Effect Status

@OpenAPIDefinition

Root metadata (info, tags, servers, security, externalDocs).

✅

@Operation

Describes a JAX-RS method: summary, description, operationId, deprecated.

✅

@Parameter

Describes a parameter (path, query, header, cookie).

✅

@RequestBody

Describes the request body: content, schema, examples.

✅

@APIResponse / @APIResponses

Describes possible responses, code by code, with headers and links.

✅

@Schema

Describes a type: title, description, constraints, oneOf, discriminator.

✅

@SecurityScheme / @SecurityRequirement / @SecuritySchemes

Security schemes (HTTP, API Key, OAuth2, OpenID Connect) and requirements.

✅

@Server / @Servers

Target URL(s) inscribed on the document, operation, or path.

✅

@Tag / @Tags

Logical grouping of operations.

✅

@Callback / @Callbacks

Server-described webhooks.

✅

@Extension / @Extensions

Free-form x-* extensions.

✅

@ExternalDocumentation

Link to external documentation.

✅

@Components

Explicit reuse catalogue.

✅

@Schema(hidden = true) / @Operation(hidden = true)

Hides a type, property, or operation from the document — MP OpenAPI has no standalone @Hidden annotation; hiding is expressed through the hidden attribute.

✅

JAX-RS annotations consumed by the scanner: @Path, @GET, @POST, @PUT, @DELETE, @PATCH, @HEAD, @OPTIONS, @Produces, @Consumes, @PathParam, @QueryParam, @HeaderParam, @CookieParam, @FormParam, @MatrixParam, @DefaultValue, @ApplicationPath.

MicroProfile Config keys

All keys are read once at startup: GrimmConfigProducer (in io.vidocq.grimm.cdi) calls ConfigProvider.getConfig() and materialises the GrimmConfig record (io.vidocq.grimm.internal.config); ConfigApplier then applies the server and schema overrides at step 5 of the pipeline.

Key Effect

mp.openapi.scan.disable

Boolean. Disables annotation scanning entirely.

mp.openapi.scan.packages

List of packages to scan (whitelist, comma-separated).

mp.openapi.scan.classes

List of classes to scan (whitelist).

mp.openapi.scan.exclude.packages

List of excluded packages.

mp.openapi.scan.exclude.classes

List of excluded classes.

mp.openapi.scan.beanvalidation

Boolean. Enables derivation of Bean Validation constraints into the schema.

mp.openapi.filter

FQCN of an OASFilter applied after merge.

mp.openapi.model.reader

FQCN of an OASModelReader invoked before merge.

mp.openapi.servers

List of server URLs (replaces servers on the document).

mp.openapi.servers.path.<path>

Overrides servers for one specific path.

mp.openapi.servers.operation.<operationId>

Overrides servers for one specific operation.

mp.openapi.schema.<FQCN>

JSON snippet describing a schema for the given class (full override).

mp.openapi.extensions.scan.disable

Boolean. Disables scanning of @Extension annotations.

Two spec keys are deliberately deferred and currently unimplemented: mp.openapi.servers.<name>.* (per-server variable overrides) and mp.openapi.extensions.<key>=<value> (document-level extensions). They are intentionally left out for now and scheduled for a later milestone — see the GrimmConfig Javadoc for the authoritative status.

/openapi endpoint

Path

/openapi

Verb

GET

Media types

application/yaml (default, spec §2.2), application/json

Format override

?format=yaml, ?format=yml, ?format=json (takes precedence over Accept, spec §2.3)

Source

GrimmModelCache.getDocument()

Status

Always 200 when the scan succeeded

Compatibility

  • Java 25 (LTS), Maven 3.9.16.

  • JAX-RS 4.0 (Cassini or any conformant runtime).

  • CDI 4.1 Lite (Vauban) or Lite-compatible.

  • No Jakarta EE Full Profile dependency.

Bugs and benchmarks

  • BUG.md — tracked reproducible bugs (to be created if missing).

  • BENCH.md — JMH benchmarks (to be created if missing).

Further reading

  • Concepts — merge, filters, configuration.

  • Internals — pipeline and threading.

  • TCK — status and execution.