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
@RegisterForReflectionto 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-dockerfor 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.