{"record":{"id":"713b6c2367f92ba5","repo":"quarkusio/quarkus","slug":"more-than-one-application-class-applications","errorCode":null,"errorMessage":"More than one Application class: ${applications}","messagePattern":"More than one Application class: (.+?)","errorType":"exception","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"independent-projects/resteasy-reactive/common/processor/src/main/java/org/jboss/resteasy/reactive/common/processor/scanning/ResteasyReactiveScanner.java","lineNumber":92,"sourceCode":"    public static ApplicationScanningResult scanForApplicationClass(IndexView index, Set<String> excludedClasses) {\n        Collection<ClassInfo> applications = index\n                .getAllKnownSubclasses(ResteasyReactiveDotNames.APPLICATION);\n        Set<String> allowedClasses = new HashSet<>();\n        Set<String> singletonClasses = new HashSet<>();\n        Set<String> globalNameBindings = new HashSet<>();\n        boolean filterClasses = !excludedClasses.isEmpty();\n        Application application = null;\n        ClassInfo selectedAppClass = null;\n        BlockingDefault blocking = BlockingDefault.AUTOMATIC;\n        for (ClassInfo applicationClassInfo : applications) {\n            if (Modifier.isAbstract(applicationClassInfo.flags())) {\n                continue;\n            }\n            if (excludedClasses.contains(applicationClassInfo.name().toString())) {\n                continue;\n            }\n            if (selectedAppClass != null) {\n                throw new RuntimeException(\"More than one Application class: \" + applications);\n            }\n            selectedAppClass = applicationClassInfo;\n            if (appClassHasInject(selectedAppClass)) {\n                throw new RuntimeException(\"'@Inject' cannot be used with a '\" + ResteasyReactiveDotNames.APPLICATION\n                        + \"' class. Offending class is: '\" + selectedAppClass.name() + \"'\");\n            }\n            String applicationClass = applicationClassInfo.name().toString();\n            try {\n                Class<?> appClass = Thread.currentThread().getContextClassLoader().loadClass(applicationClass);\n                application = (Application) appClass.getConstructor().newInstance();\n                Set<Class<?>> classes = application.getClasses();\n                if (!classes.isEmpty()) {\n                    for (Class<?> klass : classes) {\n                        allowedClasses.add(klass.getName());\n                    }\n                    filterClasses = true;\n                }\n                classes = application.getSingletons().stream().map(Object::getClass).collect(Collectors.toSet());","sourceCodeStart":74,"sourceCodeEnd":110,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/independent-projects/resteasy-reactive/common/processor/src/main/java/org/jboss/resteasy/reactive/common/processor/scanning/ResteasyReactiveScanner.java#L74-L110","documentation":"During RESTEasy Reactive scanning, more than one class extending jakarta.ws.rs.core.Application was found in the application index. The JAX-RS spec allows only a single Application subclass per deployment, so the scanner aborts the build. The message lists all Application classes found.","triggerScenarios":"Calling ResteasyReactiveScanner.scanForApplicationClass when the indexed classes contain two or more subclasses of jakarta.ws.rs.core.Application (and neither is excluded).","commonSituations":"Copying an existing RestApplication class into a new package and forgetting to delete the original; adding a third-party JAX-RS module that ships its own Application subclass; code-generation leaving a stale generated Application class.","solutions":["Delete or rename one of the Application subclasses so exactly one remains in the deployment.","If one of the Applications comes from a dependency, exclude that dependency or add the unwanted class to the excluded classes set passed to scanForApplicationClass.","Consolidate the two Application classes' registration logic (classes, singletons) into a single @ApplicationPath class."],"exampleFix":"// before\nclass AppOne extends Application { ... }\nclass AppTwo extends Application { ... }\n// after\nclass AppOne extends Application {\n    @Override\n    public Set<Class<?>> getClasses() {\n        // merge resources previously in AppTwo here\n    }\n}","handlingStrategy":"validation","validationCode":"// build-time check\nList<String> apps = classIndex.getAllKnownSubclasses(Application.class)\n        .stream().map(ci -> ci.name().toString()).collect(Collectors.toList());\nif (apps.size() > 1)\n    throw new IllegalStateException(\"Only one JAX-RS Application class allowed, found: \" + apps);","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Keep exactly one Application subclass per deployment module","grep the project for 'extends Application' before adding a new one","Audit dependencies for shipped Application classes"],"tags":["jaxrs","resteasy-reactive","build-time","duplicate-class"],"backgroundTag":"multiple-application-classes","analyzedSha":"e1c734241f34c7919086ceb4c9262b4a58f6de44","analyzedAt":"2026-09-05T17:01:29.979Z","contentChangedAt":"2026-09-05T17:01:29.979Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}