{"record":{"id":"5d4ab1e1101724cd","repo":"quarkusio/quarkus","slug":"cannot-construct-empty-build-items","errorCode":null,"errorMessage":"Cannot construct empty build items","messagePattern":"Cannot construct empty build items","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"core/builder/src/main/java/io/quarkus/builder/item/EmptyBuildItem.java","lineNumber":12,"sourceCode":"package io.quarkus.builder.item;\n\n/**\n * An empty build item. Empty build items carry no data and may be used, for example, for ordering and for\n * running steps which don't otherwise produce anything.\n *\n * Empty build items cannot be instantiated, you must use <code>@Produce(MyEmptyBuildItem.class)</code> or\n * <code>@Consume(MyEmptyBuildItem.class)</code> instead of the standard ways to consume or produce build items.\n */\npublic abstract class EmptyBuildItem extends BuildItem {\n    protected EmptyBuildItem() {\n        throw new UnsupportedOperationException(\"Cannot construct empty build items\");\n    }\n}\n","sourceCodeStart":1,"sourceCodeEnd":15,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/core/builder/src/main/java/io/quarkus/builder/item/EmptyBuildItem.java#L1-L15","documentation":"EmptyBuildItem represents a build item used only as a signal, consumed/produced via @Consume/@Produce without an actual instance. Its (protected) constructor unconditionally throws UnsupportedOperationException, so any attempt to directly instantiate an EmptyBuildItem subclass fails with \"Cannot construct empty build items\". It is a deliberate API guard, not a runtime fault.","triggerScenarios":"Calling `new MyEmptyBuildItem()` (or via reflection/serialization) on a class extending EmptyBuildItem instead of referencing the class object in @Produce(MyEmptyBuildItem.class) or @Consume(MyEmptyBuildItem.class); a build step method that tries to return a new instance of an empty item.","commonSituations":"Misunderstanding the empty build item idiom when writing build steps; code generators or tests constructing instances generically; migrating a normal build item to EmptyBuildItem while leaving old `new` call sites in place.","solutions":["Do not instantiate it: reference the class literal in annotations, e.g. @BuildStep @Produce(MyEmptyBuildItem.class) ... or declare the item type as a build-step parameter for consumption.","If the step must actually produce a value-bearing item, switch the class to extend BuildItem (non-empty) and return a real instance.","Remove any `new MyEmptyBuildItem()` calls, including in tests and reflection-based code.","For pure ordering, produce/consume via @Produce/@Consume annotations or MultiBuildItem-free signal types exactly as the class Javadoc describes."],"exampleFix":"// before\n@BuildStep\nvoid produceSignal() { new MySignalItem(); }\n\n// after\n@BuildStep\n@Produce(MySignalItem.class)\nvoid produceSignal() { /* no instance needed */ }","handlingStrategy":"validation","validationCode":"// never instantiate; assert usage in tests\nstatic void assertNotInstantiated(Class<? extends EmptyBuildItem> clazz) {\n    // only the class literal should be referenced:\n    // @Produce(clazz) / @Consume(clazz) / method parameters of type clazz\n}","typeGuard":"static <T extends EmptyBuildItem> T neverCreate(Class<T> clazz) {\n    throw new UnsupportedOperationException(\n        clazz + \" is an EmptyBuildItem: use @Produce/@Consume(\" + clazz.getSimpleName() + \".class), not new\");\n}","tryCatchPattern":"try {\n    processSignal();\n} catch (UnsupportedOperationException e) {\n    if (e.getMessage().equals(\"Cannot construct empty build items\")) {\n        throw new IllegalStateException(\"Replace direct construction of \" + MySignalItem.class.getSimpleName()\n            + \" with @Produce/@Consume class references\", e);\n    }\n    throw e;\n}","preventionTips":["Reference empty build items only via class literals in @Produce/@Consume or as build-step parameter types","Grep for `new` on EmptyBuildItem subclasses during code review","If the item must carry data, extend BuildItem instead of EmptyBuildItem"],"tags":["quarkus","build-item","api-misuse"],"backgroundTag":"empty-build-item-instantiation","analyzedSha":"e1c734241f34c7919086ceb4c9262b4a58f6de44","analyzedAt":"2026-09-05T17:01:29.979Z","contentChangedAt":"2026-09-05T17:01:29.979Z","schemaVersion":2},"datasetVersion":"2026-09-12T22:17:10.623Z"}