quarkusio/quarkus · error · IllegalStateException
Failed to find any non-blocking provider for startup actions
Error message
Failed to find any non-blocking provider for startup actions. Either import the quarkus-vertx module, or do not declare non-blocking startup actions.
What it means
StartupBuildSteps verifies at build time that a non-blocking provider (the vertx module) is present when the application declares non-blocking startup actions (@Startup methods/observers that are non-blocking). If no NonBlockingProvider service is found on the classpath, it fails with this message telling you to import quarkus-vertx or avoid non-blocking startup actions.
Source
Thrown at extensions/arc/deployment/src/main/java/io/quarkus/arc/deployment/StartupBuildSteps.java:192
}
}
}
}
if (!startupMethods.isEmpty()) {
for (MethodInfo method : startupMethods) {
AnnotationValue priority = annotationStore.getAnnotation(method, STARTUP_NAME).value();
registerStartupObserver(observerRegistration, bean, bean.getIdentifier() + method.toString(),
priority != null ? priority.asInt() : ObserverMethod.DEFAULT_PRIORITY, method);
}
}
}
}
}
// Verify at build-time that we do have the non-blocking provider
if (checkNonBlockingProviders) {
if (ServiceUtil.classNamesNamedIn(Thread.currentThread().getContextClassLoader(),
"META-INF/services/" + NonBlockingProvider.class.getName()).isEmpty()) {
throw new IllegalStateException(NonBlockingSupport.ERROR_MSG);
}
}
}
private void registerStartupObserver(ObserverRegistrationPhaseBuildItem observerRegistration, BeanInfo btBean, String id,
int priority, MethodInfo startupMethod) {
ObserverConfigurator configurator = observerRegistration.getContext().configure()
.beanClass(btBean.getBeanClass())
.observedType(StartupEvent.class);
configurator.id(id);
configurator.priority(priority);
configurator.notify(ng -> {
BlockCreator b0 = ng.notifyMethod();
// InjectableBean<Foo> bean = Arc.container().bean("bflmpsvz");
LocalVar arc = b0.localVar("arc", b0.invokeStatic(ARC_CONTAINER));
LocalVar rtBean = b0.localVar("bean",
b0.invokeInterface(ARC_CONTAINER_BEAN, arc, Const.of(btBean.getIdentifier())));View on GitHub (pinned to e1c734241f)
Solutions
- Add the quarkus-vertx dependency to the project (io.quarkus:quarkus-vertx)
- Or make the startup action blocking (return void instead of Uni/CompletionStage)
- Or remove the non-blocking @Startup method if it is not needed
- Verify with mvn dependency:tree that quarkus-vertx is actually resolved (a BOM entry alone does not add it)
Example fix
// before (pom.xml): no vertx module // after: <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-vertx</artifactId> </dependency>
Defensive patterns
Strategy: validation
Validate before calling
// pom.xml — ensure this dependency exists:
// io.quarkus:quarkus-vertx
// or verify no startup method is reactive:
// @Startup void init() { ... } // blocking, OK Prevention
- Add quarkus-vertx whenever reactive (Uni/CompletionStage) startup actions are used
- Keep @Startup methods blocking (void) unless vertx is present
- Run mvn dependency:tree after dependency cleanups
When it happens
Trigger: Declaring a non-blocking startup action (e.g. @Startup on a bean method returning Uni/CompletionStage) while the quarkus-vertx module is not among the application's dependencies, so META-INF/services for NonBlockingProvider is empty.
Common situations: Using reactive startup logic in an app built without the vertx extension; removing quarkus-vertx in a dependency cleanup; templates/projects generated without vertx that later add reactive startup beans.
Related errors
- The @Blocking, @NonBlocking and @RunOnVirtualThread annotati
- Unsupported injection point target: <injectionPoint>
- Synthetic bean does not provide a creation method, use Exten
- Synthetic bean has ExtendedBeanConfigurator#checkActive(), b
- It is not possible to specify multiple creation methods
AI-assisted analysis of quarkusio/quarkus@e1c734241f (2026-09-05).
Data as JSON: /api/errors/eec9e78462896a64.
Report an issue: GitHub.