{"record":{"id":"1410839f863b6cc2","repo":"quarkusio/quarkus","slug":"file-name-already-used-name","errorCode":null,"errorMessage":"File name already used: ${name}","messagePattern":"File name already used: (.+?)","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"extensions/grpc/reflection/src/main/java/io/quarkus/grpc/reflection/service/GrpcServerIndex.java","lineNumber":108,"sourceCode":"    }\n\n    public FileDescriptor getFileDescriptorByExtensionAndNumber(String type, int number) {\n        Map<Integer, FileDescriptor> map = descriptorsByExtensionAndNumber\n                .getOrDefault(type, Collections.emptyMap());\n        return map.get(number);\n    }\n\n    public Set<Integer> getExtensionNumbersOfType(String type) {\n        return descriptorsByExtensionAndNumber.getOrDefault(type, Collections.emptyMap()).keySet();\n    }\n\n    private void processFileDescriptor(FileDescriptor fd,\n            Map<String, FileDescriptor> descriptorsByName,\n            Map<String, FileDescriptor> descriptorsBySymbol,\n            Map<String, Map<Integer, FileDescriptor>> descriptorsByExtensionAndNumber) {\n        String name = fd.getName();\n        if (descriptorsByName.containsKey(name)) {\n            throw new IllegalStateException(\"File name already used: \" + name);\n        }\n        descriptorsByName.put(name, fd);\n        for (Descriptors.ServiceDescriptor service : fd.getServices()) {\n            processService(service, fd, descriptorsBySymbol);\n        }\n        for (Descriptors.Descriptor type : fd.getMessageTypes()) {\n            processType(type, fd, descriptorsBySymbol, descriptorsByExtensionAndNumber);\n        }\n        for (Descriptors.FieldDescriptor extension : fd.getExtensions()) {\n            processExtension(extension, fd, descriptorsByExtensionAndNumber);\n        }\n    }\n\n    private void processService(Descriptors.ServiceDescriptor service, FileDescriptor fd,\n            Map<String, FileDescriptor> descriptorsBySymbol) {\n        String fullyQualifiedServiceName = service.getFullName();\n        if (descriptorsBySymbol.containsKey(fullyQualifiedServiceName)) {\n            throw new IllegalStateException(\"Service already defined: \" + fullyQualifiedServiceName);","sourceCodeStart":90,"sourceCodeEnd":126,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/extensions/grpc/reflection/src/main/java/io/quarkus/grpc/reflection/service/GrpcServerIndex.java#L90-L126","documentation":"While recursively indexing FileDescriptors for gRPC server reflection, each proto file name must map to exactly one FileDescriptor. processFileDescriptor throws this IllegalStateException if a FileDescriptor with the same name was already recorded.","triggerScenarios":"Two ServiceDefinitions whose schema descriptors resolve to FileDescriptors with the same file name (e.g. the same .proto name defined in two different jars/versions on the classpath).","commonSituations":"Same proto file name in two dependency jars (common.proto, empty.proto collisions); shaded/duplicated proto artifacts; two versions of an SDK both bundling the same proto.","solutions":["Run mvn dependency:tree to find artifacts shipping the same .proto name and exclude the duplicate.","Rename your own proto files to be project-unique (avoid generic names like common.proto).","If a transitive dependency duplicates protos, use Maven exclusions or a dependency management pin to a single version.","Ensure only one version of the library that generates those descriptors is on the runtime classpath."],"exampleFix":"// before (two jars bundle)\nproto/common.proto\n// after (exclude one)\n<exclusion><groupId>com.example</groupId><artifactId>legacy-sdk</artifactId></exclusion>","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n    startServer();\n} catch (IllegalStateException e) {\n    if (e.getMessage().startsWith(\"File name already used:\")) {\n        // find the jar shipping a second copy of that .proto and exclude it\n    } else throw e;\n}","preventionTips":["Use unique, project-scoped proto file names (avoid common.proto, empty.proto)","Run mvn dependency:tree to spot protos shipped by multiple artifacts","Pin shared proto artifacts to a single version via dependencyManagement","Avoid copying well-known protos into your own source tree"],"tags":["grpc","reflection","protobuf","duplicate-file"],"backgroundTag":"duplicate-proto-file","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"}