{"record":{"id":"1524f8083b472cbb","repo":"hibernate/hibernate-orm","slug":"multiple-beancontainer-service-implementations-fou","errorCode":null,"errorMessage":"Multiple BeanContainer service implementations found (set 'hibernate.resource.beans.container' explicitly)","messagePattern":"Multiple BeanContainer service implementations found \\(set 'hibernate\\.resource\\.beans\\.container' explicitly\\)","errorType":"exception","errorClass":"ServiceException","httpStatus":null,"severity":"critical","filePath":"hibernate-core/src/main/java/org/hibernate/resource/beans/spi/ManagedBeanRegistryInitiator.java","lineNumber":69,"sourceCode":"\t\treturn new ManagedBeanRegistryImpl( resolveBeanContainer( configurationValues, serviceRegistry ) );\n\t}\n\n\tprivate BeanContainer resolveBeanContainer(Map<?,?> configurationValues, ServiceRegistry serviceRegistry) {\n\t\t// was a specific container explicitly specified?\n\t\tfinal Object explicitBeanContainer = configurationValues.get( BEAN_CONTAINER );\n\t\treturn explicitBeanContainer == null\n\t\t\t\t? interpretImplicitBeanContainer( serviceRegistry )\n\t\t\t\t: interpretExplicitBeanContainer( explicitBeanContainer, serviceRegistry );\n\t}\n\n\tprivate static BeanContainer interpretImplicitBeanContainer(ServiceRegistry serviceRegistry) {\n\t\tfinal Collection<BeanContainer> beanContainers =\n\t\t\t\tserviceRegistry.requireService( ClassLoaderService.class )\n\t\t\t\t\t\t.loadJavaServices( BeanContainer.class );\n\t\treturn switch ( beanContainers.size() ) {\n\t\t\tcase 1 -> beanContainers.iterator().next();\n\t\t\tcase 0 -> interpretImplicitCdiBeanContainer( serviceRegistry );\n\t\t\tdefault -> throw new ServiceException( \"Multiple BeanContainer service implementations found\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t+ \" (set '\" + BEAN_CONTAINER + \"' explicitly)\" );\n\t\t};\n\t}\n\n\t// simplified CDI support\n\tprivate static BeanContainer interpretImplicitCdiBeanContainer(ServiceRegistry serviceRegistry) {\n\t\tfinal Object beanManager = getConfiguredBeanManager( serviceRegistry );\n\t\tfinal boolean isCdiAvailable = isCdiAvailable( serviceRegistry );\n\t\tif ( beanManager != null ) {\n\t\t\tif ( !isCdiAvailable ) {\n\t\t\t\tthrow new ServiceException( \"A bean manager was provided via '\" + JAKARTA_CDI_BEAN_MANAGER\n\t\t\t\t\t\t\t\t\t\t\t+ \"' but CDI is not available on the Hibernate class loader\");\n\t\t\t}\n\t\t\treturn CdiBeanContainerBuilder.fromBeanManagerReference( beanManager, serviceRegistry );\n\t\t}\n\t\telse {\n\t\t\tif ( isCdiAvailable ) {\n\t\t\t\tBEANS_MSG_LOGGER.noBeanManagerButCdiAvailable();","sourceCodeStart":51,"sourceCodeEnd":87,"githubUrl":"https://github.com/hibernate/hibernate-orm/blob/fad1729dce015f908198d57a8d80274a30f905a5/hibernate-core/src/main/java/org/hibernate/resource/beans/spi/ManagedBeanRegistryInitiator.java#L51-L87","documentation":"ManagedBeanRegistryInitiator discovers BeanContainer implementations through the Java ServiceLoader (META-INF/services/org.hibernate.resource.beans.spi.BeanContainer) and requires exactly one when 'hibernate.resource.beans.container' is unset. Finding more than one is ambiguous, so bootstrap fails with ServiceException('Multiple BeanContainer service implementations found (set hibernate.resource.beans.container explicitly)').","triggerScenarios":"The runtime classpath carries two or more BeanContainer service registrations: e.g. a Weld/Omnifaces-style CDI integration plus a platform-specific one (Quarkus, app server), or two copies of an integration jar.","commonSituations":"Fat/shaded jars that merge multiple META-INF/services files; mixing app-server integration fragments into a SE app; dependency upgrades pulling in an extra Hibernate-CDI integration transitively.","solutions":["Set the property explicitly to one implementation: props.put(\"hibernate.resource.beans.container\", \"org.hibernate.resource.beans.container.internal.CdiBeanContainerImpl\").","Find and exclude the duplicate integration dependency from the classpath (check the dependency tree).","Inspect the merged META-INF/services/org.hibernate.resource.beans.spi.BeanContainer file in fat jars and keep a single line.","Verify with ServiceLoader.load(BeanContainer.class) in a startup self-check that exactly one provider resolves."],"exampleFix":"// before\n// classpath contains both weld-hibernate-integration.jar and appserver-integration.jar,\n// each registering META-INF/services/...BeanContainer -> ServiceException at boot\n\n// after\nMap<String, Object> props = new HashMap<>();\nprops.put(\"hibernate.resource.beans.container\",\n    \"org.hibernate.resource.beans.container.internal.CdiBeanContainerImpl\");\nEntityManagerFactory emf = Persistence.createEntityManagerFactory(\"pu\", props);","handlingStrategy":"validation","validationCode":"// startup self-check: exactly one BeanContainer provider on the classpath\nList<BeanContainer> providers = new ArrayList<>();\nfor (BeanContainer bc : ServiceLoader.load(BeanContainer.class, Thread.currentThread().getContextClassLoader())) {\n    providers.add(bc);\n}\nif (providers.size() > 1) {\n    props.put(\"hibernate.resource.beans.container\", chosenProvider.getClass().getName());\n}","typeGuard":null,"tryCatchPattern":"try {\n    emf = Persistence.createEntityManagerFactory(\"pu\", props);\n} catch (org.hibernate.service.spi.ServiceException e) {\n    if (e.getMessage().contains(\"Multiple BeanContainer\")) {\n        // set hibernate.resource.beans.container explicitly or drop the duplicate integration jar\n        throw new ConfigurationException(e.getMessage(), e);\n    }\n    throw e;\n}","preventionTips":["Audit META-INF/services/org.hibernate.resource.beans.spi.BeanContainer after shading or merging jars.","Keep a single CDI integration dependency on the classpath.","Set 'hibernate.resource.beans.container' explicitly in managed environments."],"tags":["hibernate","cdi","service-loader","classpath","bootstrap"],"backgroundTag":"duplicate-service-provider","analyzedSha":"fad1729dce015f908198d57a8d80274a30f905a5","analyzedAt":"2026-08-22T04:13:57.527Z","schemaVersion":2},"datasetVersion":"2026-08-22T09:17:25.309Z"}