{"record":{"id":"dff2f4b1c14adec0","repo":"quarkusio/quarkus","slug":"use-generatedserviceproviderbuilditem-to-register","errorCode":null,"errorMessage":"Use GeneratedServiceProviderBuildItem to register service providers instead of GeneratedResourceBuildItem, or use GeneratedResourceBuildItem.allowingMetaInfServices(...) if your ${name} resource is not a service provider","messagePattern":"Use GeneratedServiceProviderBuildItem to register service providers instead of GeneratedResourceBuildItem, or use GeneratedResourceBuildItem\\.allowingMetaInfServices\\(\\.\\.\\.\\) if your (.+?) resource is not a service provider","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"core/deployment/src/main/java/io/quarkus/deployment/builditem/GeneratedResourceBuildItem.java","lineNumber":43,"sourceCode":"    public GeneratedResourceBuildItem(String name, byte[] data) {\n        this(name, data, false);\n    }\n\n    /**\n     * @deprecated Use {@link GeneratedResourceBuildItem#GeneratedResourceBuildItem(String, byte[])} instead.\n     *             If you want to serve static resources use\n     *             {@link io.quarkus.vertx.http.deployment.spi.GeneratedStaticResourceBuildItem}\n     *             instead.\n     */\n    @Deprecated(since = \"4.0\", forRemoval = true)\n    public GeneratedResourceBuildItem(String name, byte[] data, boolean excludeFromDevCL) {\n        this(name, data, excludeFromDevCL, false);\n    }\n\n    private GeneratedResourceBuildItem(String name, byte[] data, boolean excludeFromDevCL,\n            boolean allowMetaInfServices) {\n        if (name.startsWith(\"META-INF/services/\") && !allowMetaInfServices) {\n            throw new IllegalArgumentException(\n                    \"Use GeneratedServiceProviderBuildItem to register service providers instead of GeneratedResourceBuildItem, or use GeneratedResourceBuildItem.allowingMetaInfServices(...) if your \"\n                            + name + \" resource is not a service provider\");\n        }\n        this.name = name;\n        this.data = data;\n        this.excludeFromDevCL = excludeFromDevCL;\n    }\n\n    /**\n     * Use only for {@code META-INF/services/} resources with a non-standard format incompatible with\n     * {@link GeneratedServiceProviderBuildItem}. Prefer {@link GeneratedServiceProviderBuildItem} for standard\n     * Java {@link java.util.ServiceLoader} registrations.\n     */\n    public static GeneratedResourceBuildItem allowingMetaInfServices(String name, byte[] data) {\n        return new GeneratedResourceBuildItem(name, data, false, true);\n    }\n\n    public String getName() {","sourceCodeStart":25,"sourceCodeEnd":61,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/core/deployment/src/main/java/io/quarkus/deployment/builditem/GeneratedResourceBuildItem.java#L25-L61","documentation":"GeneratedResourceBuildItem is for generated application resources; META-INF/services/ entries, however, are service provider registrations and must go through GeneratedServiceProviderBuildItem so Quarkus can index and handle them correctly. Since this guard was introduced, emitting a generated resource under META-INF/services/ through the plain resource item throws IllegalArgumentException, telling you which item to use instead.","triggerScenarios":"Producing new GeneratedResourceBuildItem(\"META-INF/services/io.quarkus...\", bytes) in a build step without using GeneratedResourceBuildItem.allowingMetaInfServices(...) or switching to GeneratedServiceProviderBuildItem.","commonSituations":"Older extensions that predate the dedicated service-provider build item; code migrating from raw resource emission for ServiceLoader files; copy-pasted build-step code writing service descriptors.","solutions":["Replace the item with new GeneratedServiceProviderBuildItem(serviceInterfaceName, List.of(implementationClassNames)) and drop the manual descriptor bytes.","If the resource genuinely is not a service provider but just happens to live under META-INF/services/, use GeneratedResourceBuildItem.allowingMetaInfServices(...) instead of the plain constructor.","Update related build steps that consume the resource item so they consume the service provider item instead."],"exampleFix":"// before\nbuildProducer.produce(new GeneratedResourceBuildItem(\n        \"META-INF/services/com.acme.MySpi\",\n        implClass.getBytes(StandardCharsets.UTF_8)));\n// after\nbuildProducer.produce(new GeneratedServiceProviderBuildItem(\n        \"com.acme.MySpi\", List.of(\"com.acme.MySpiImpl\")));","handlingStrategy":"validation","validationCode":"void produceGenerated(BuildProducer<GeneratedResourceBuildItem> out, String name, byte[] data) {\n    if (name.startsWith(\"META-INF/services/\")) {\n        throw new IllegalArgumentException(\"Use GeneratedServiceProviderBuildItem for \" + name);\n    }\n    out.produce(new GeneratedResourceBuildItem(name, data));\n}","typeGuard":"boolean isServiceProviderResource(String name) {\n    return name != null && name.startsWith(\"META-INF/services/\");\n}","tryCatchPattern":"try {\n    out.produce(new GeneratedResourceBuildItem(name, data));\n} catch (IllegalArgumentException e) {\n    if (e.getMessage().contains(\"GeneratedServiceProviderBuildItem\")) {\n        String svc = name.substring(\"META-INF/services/\".length());\n        serviceProviderProducer.produce(new GeneratedServiceProviderBuildItem(svc, List.of(implClassName)));\n        return;\n    }\n    throw e;\n}","preventionTips":["Register ServiceLoader providers exclusively via GeneratedServiceProviderBuildItem","Search your build steps for 'META-INF/services/' string literals during migration","Use allowingMetaInfServices(...) only when the file under META-INF/services/ is genuinely not a provider descriptor"],"tags":["quarkus","build-time","service-loader","resources"],"backgroundTag":"wrong-build-item-for-service-provider","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"}