Vauban is at 0.1.0-SNAPSHOT. Real application migration is premature until the TCK coverage is consolidated (see TCK status). This page documents model mappings and known pitfalls to prepare the transition.

Vauban implements the CDI 4.1 Lite profile. Migrating therefore implies dropping Full-profile features when used (runtime portable extensions, @ConversationScoped, passivation, application-level EL).

From Quarkus ArC

ArC shares Vauban’s build-time philosophy. The port is conceptually direct; gaps are mostly tooling.

ArC Vauban Note

Full build-time CDI

Full build-time CDI

Identical model. No paradigm shift on the application side.

Bytecode generation via Gizmo

Bytecode generation via Class-File API (JEP 484)

No ASM. Output is compatible with any JVM 25+.

@io.quarkus.arc.Unremovable

No direct equivalent

Vauban currently only removes unreferenced beans. // TODO@user: confirm whether a similar annotation is planned.

@io.quarkus.arc.profile.IfBuildProfile

No equivalent

Build-time profiling is the responsibility of the Vidocq Runtime layer.

Quarkus Dev Mode

vauban-junit + standard Maven cycle

Vauban has no dedicated Dev Mode.

@Startup

@Observes @Initialized(ApplicationScoped.class)

Standard CDI pattern.

From Weld

Weld implements the Full profile; some features used by historical applications have no Lite equivalent.

Key differences:

  • No runtime AnnotatedType lookup — Vauban resolves everything at compile time. Code that calls BeanManager.createAnnotatedType(Class) must be rewritten as a Build Compatible Extension.

  • No runtime BeforeBeanDiscovery / AfterBeanDiscovery — replaced by the BCE phases @Discovery / @Enhancement / @Registration / @Synthesis / @Validation.

  • No portable extensions — the Extension interface is not loaded via ServiceLoader at runtime. Migrate every extension to a compile-time BCE.

  • No @ConversationScoped — refactor to @SessionScoped (// TODO@user: confirm support) or to an explicit application mechanism.

Exhaustive Weld → Vauban table of supported / unsupported features. // TODO@user

From OpenWebBeans

OpenWebBeans is very close to Weld in API. The Weld table mostly applies. OWB-specific traits (deferred bean resolution, custom BeanArchive) are not supported: Vauban has a single, static discovery mode.

CDI 4.1 Lite pitfalls

Lite-profile specifics worth knowing before migrating:

  • @Decorator — supported in Lite, validate against your code. // TODO@user: confirm exact coverage.

  • @Specializes — not supported. Refactor as composition or a prioritised @Alternative.

  • @Alternative + @Priority — supported; check existing priorities.

  • Producer methods with @Disposes — supported.

  • @Inject field on a normal scope — correctly resolves the client proxy (see fix VAU-INJ-001 in BUG.md).

  • InjectionPoint metadata — supported.

  1. Run the existing code on Vauban in a dedicated branch.

  2. Run vauban:analyze to detect split packages and missing JPMS exports.

  3. Execute a vauban-test-suite adapted to your domain.

  4. Activate the CDI 4.1 Lite TCK on the application itself via vauban-junit.

  5. Iterate on BCEs to replace portable extensions.

  6. Run on GraalVM native-image to confirm no residual reflection.

Going further

  • Concepts — vocabulary and implementation choices.

  • Internals — APT pipeline, threading model.

  • BUG.md — tracked reproducible bugs.