Understanding Quarkus Architecture

Build-Time Bootstrapping

Unlike traditional Java frameworks, Quarkus performs most initialization at build time. Errors related to CDI, configuration injection, and resource scanning are often surfaced during the quarkus:build phase, rather than at runtime.

GraalVM Native Image Integration

Quarkus supports native image generation via GraalVM, dramatically reducing startup time and memory. However, it requires reflection configuration and compatibility across dependencies, which is a frequent source of compilation errors.

Common Quarkus Issues

1. CDI Beans Not Injected Properly

Occurs when beans lack a proper scope, are incorrectly discovered, or dependencies are missing from the quarkus.arc.exclude-types configuration.

2. Native Image Build Fails

Triggered by use of reflection, unsupported classes, or missing reflect-config.json. GraalVM strict static analysis halts compilation when reflection metadata is missing.

3. REST Endpoints Not Accessible

Caused by incorrect @Path annotations, missing JAX-RS dependencies, or improper application.properties port bindings.

4. Configuration Not Loaded at Runtime

Happens when values injected with @ConfigProperty are not resolvable due to missing entries, build-time config expectation, or lack of default values.

5. Docker/Kubernetes Deployments Break

Deployment descriptors may lack correct labels, ports, or volume mounts. Quarkus extensions like quarkus-kubernetes need proper metadata or YAML customization to work reliably.

Diagnostics and Debugging Techniques

Enable Quarkus Dev Mode

Run in live reload mode with:

./mvnw quarkus:dev

Use CDI Diagnostic Output

Enable verbose bean discovery logging by setting:

-Dquarkus.log.category."io.quarkus.arc".level=DEBUG

Inspect Native Image Logs

Build with full debug logs for native image creation:

./mvnw package -Pnative -Dquarkus.native.native-image-xmx=4g -Dquarkus.native.additional-build-args="--report-unsupported-elements-at-runtime --no-fallback"

List Available Endpoints

Use /q/openapi or /q/health endpoints to verify REST visibility and actuator availability:

curl http://localhost:8080/q/openapi

Check Configuration Resolution

Run with -Dquarkus.debug and inspect effective configuration:

./mvnw compile quarkus:dev -Dquarkus.debug

Step-by-Step Resolution Guide

1. Fix CDI Injection Issues

Ensure beans are annotated with proper scopes like @ApplicationScoped. Avoid using constructor injection for beans not managed by CDI.

2. Solve Native Build Failures

Add reflection metadata via reflect-config.json or register classes using @RegisterForReflection. Reduce dynamic class loading when possible.

3. Debug Inaccessible REST APIs

Confirm endpoint paths and HTTP method annotations. Ensure quarkus-resteasy or quarkus-resteasy-reactive dependencies are declared.

4. Resolve Configuration Problems

Ensure values in application.properties or environment variables are correctly formatted and match injection keys. Use @ConfigProperty(defaultValue="...") as fallback.

5. Fix Kubernetes Deployment Errors

Use quarkus.kubernetes.deploy=true and check generated manifests under target/kubernetes. Customize service metadata or ports if default assumptions fail.

Best Practices for Stable Quarkus Applications

  • Always run dev mode locally before building native images.
  • Use @RegisterForReflection to minimize native image errors.
  • Leverage Quarkus config profiles for dev/test/prod environments.
  • Enable health, metrics, and OpenAPI endpoints during development.
  • Use container image extensions like quarkus-container-image-docker for build automation.

Conclusion

Quarkus enables high-performance cloud-native Java applications, but requires a build-time mindset and awareness of native image constraints. Most issues arise from dependency injection gaps, configuration misalignment, or reflection-related native build failures. By utilizing diagnostics, dev mode, and clear annotations, developers can build resilient microservices optimized for containers, Kubernetes, and serverless environments.

FAQs

1. Why are my Quarkus beans not injected?

Ensure beans are annotated with proper scopes and not excluded via configuration. Use CDI debug logging to trace injection resolution.

2. What causes native image build to fail?

Reflection, unsupported classes, or missing metadata. Use @RegisterForReflection or reflect-config.json to fix.

3. Why are my REST endpoints returning 404?

Check if @Path and HTTP verb annotations are present. Ensure RESTEasy or RESTEasy Reactive extensions are enabled.

4. How do I debug config not loading?

Use @ConfigProperty with default values, validate property keys, and inspect active config profile with dev mode logs.

5. Can Quarkus auto-deploy to Kubernetes?

Yes, via quarkus-kubernetes or quarkus-openshift. Generated manifests are found in target/kubernetes/ and can be customized.