{"record":{"id":"b07ba4e139bcb7d1","repo":"quarkusio/quarkus","slug":"more-than-one-quarkusmain-method-found-with-name","errorCode":null,"errorMessage":"More than one @QuarkusMain method found with name '${name}': ${classInfo.name()} and ${quarkusMainAnnotations.get(name)}","messagePattern":"More than one @QuarkusMain method found with name '(.+?)': (.+?) and (.+?)","errorType":"exception","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"core/deployment/src/main/java/io/quarkus/deployment/steps/MainClassBuildStep.java","lineNumber":420,"sourceCode":"    public MainClassBuildItem mainClassBuildStep(BuildProducer<GeneratedClassBuildItem> generatedClass,\n            BuildProducer<BytecodeTransformerBuildItem> transformedClass,\n            CombinedIndexBuildItem combinedIndexBuildItem,\n            Optional<QuarkusApplicationClassBuildItem> quarkusApplicationClass,\n            PackageConfig packageConfig) {\n        String mainClassName = MAIN_CLASS;\n        Map<String, String> quarkusMainAnnotations = new HashMap<>();\n        IndexView index = combinedIndexBuildItem.getIndex();\n        Collection<AnnotationInstance> quarkusMains = index\n                .getAnnotations(DotName.createSimple(QuarkusMain.class.getName()));\n        for (AnnotationInstance i : quarkusMains) {\n            AnnotationValue nameValue = i.value(\"name\");\n            String name = \"\";\n            if (nameValue != null) {\n                name = nameValue.asString();\n            }\n            ClassInfo classInfo = i.target().asClass();\n            if (quarkusMainAnnotations.containsKey(name)) {\n                throw new RuntimeException(\n                        \"More than one @QuarkusMain method found with name '\" + name + \"': \"\n                                + classInfo.name() + \" and \" + quarkusMainAnnotations.get(name));\n            }\n            quarkusMainAnnotations.put(name, sanitizeMainClassName(classInfo, index));\n        }\n\n        MethodInfo mainClassMethod = null;\n        if (packageConfig.mainClass().isPresent()) {\n            String mainAnnotationClass = quarkusMainAnnotations.get(packageConfig.mainClass().get());\n            if (mainAnnotationClass != null) {\n                mainClassName = mainAnnotationClass;\n            } else {\n                mainClassName = packageConfig.mainClass().get();\n            }\n        } else if (quarkusMainAnnotations.containsKey(\"\")) {\n            mainClassName = quarkusMainAnnotations.get(\"\");\n        }\n        if (mainClassName.equals(MAIN_CLASS)) {","sourceCodeStart":402,"sourceCodeEnd":438,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/core/deployment/src/main/java/io/quarkus/deployment/steps/MainClassBuildStep.java#L402-L438","documentation":"@QuarkusMain allows naming an entry point via its 'name' attribute. While indexing all @QuarkusMain annotations, MainClassBuildStep builds a name -> class map; encountering a second annotated class with the same name throws this RuntimeException to avoid ambiguity in -Dquarkus.main-class resolution.","triggerScenarios":"During mainClassBuildStep, an AnnotationInstance target class yields a name that is already a key in quarkusMainAnnotations — two classes (or methods) annotated @QuarkusMain(name=\"same\") or both with the empty default name.","commonSituations":"Two CLI entry classes annotated with the same @QuarkusMain name; two @QuarkusMain classes both left without an explicit name (both map to \"\"); copy-pasting a main class and forgetting to change the name attribute.","solutions":["Give each @QuarkusMain annotation a unique name value","If you intend the default main, keep exactly one @QuarkusMain without a name and name all others","Rename or delete the duplicated entry class","Run a project-wide search for @QuarkusMain to audit all names"],"exampleFix":"// before\n@QuarkusMain(name=\"run\") public class MainA { ... }\n@QuarkusMain(name=\"run\") public class MainB { ... }\n// after\n@QuarkusMain(name=\"run-a\") public class MainA { ... }\n@QuarkusMain(name=\"run-b\") public class MainB { ... }","handlingStrategy":"validation","validationCode":"Set<String> seen = new HashSet<>();\nfor (Class<?> c : allAnnotatedClasses) {\n    QuarkusMain qm = c.getAnnotation(QuarkusMain.class);\n    String name = qm.name().isEmpty() ? \"\" : qm.name();\n    if (!seen.add(name)) {\n        throw new IllegalStateException(\"Duplicate @QuarkusMain name: '\" + name + \"'\");\n    }\n}","typeGuard":null,"tryCatchPattern":"try {\n    quarkusBuild();\n} catch (RuntimeException e) {\n    if (e.getMessage() != null && e.getMessage().startsWith(\"More than one @QuarkusMain method found\")) {\n        // rename one of the listed classes' @QuarkusMain name\n    }\n    throw e;\n}","preventionTips":["Audit @QuarkusMain usages with a project-wide search when adding a new CLI entry","Always give named entry points explicit unique names","Only one @QuarkusMain may omit the name attribute","Rename the annotation value whenever copying an existing main class"],"tags":["quarkus","cli","quarkusmain","build-time"],"backgroundTag":"duplicate-entry-point-name","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"}