CDI: beans.xml, where do I put you?

50,948

Solution 1

For EJB and JAR packaging you should place the beans.xml in src/main/resources/META-INF/.

For WAR packaging you should place the beans.xml in src/main/webapp/WEB-INF/.

Remember that only .java files should be put in the src/main/java and src/test/java directories. Resources like .xml files should be in src/main/resources.

Solution 2

Just to complement the above answer, here is an official reference on this: https://docs.oracle.com/javaee/6/tutorial/doc/gjbnz.html

quote:

An application that uses CDI must have a file named beans.xml. The file can be completely empty (it has content only in certain limited situations), but it must be present. For a web application, the beans.xml file must be in the WEB-INF directory. For EJB modules or JAR files, the beans.xml file must be in the META-INF directory.

Share:
50,948
Xorty
Author by

Xorty

Freelance Java developer chronically obsessed with clean design. Focusing mainly on Spring Framework and Java EE. Dependency Injection worshipper.

Updated on July 08, 2022

Comments

  • Xorty
    Xorty almost 2 years

    I am using Weld as CDI implementation. My integration test, that tries to assemble object graph instantiating Weld container works well, when I have empty beans.xml in src/test/java/META-INF/beans.xml. Here is that simple test:

    public class WeldIntegrationTest {
        @Test
        public void testInjector() {
            new Weld().initialize();
            // shouldn't throw exception
        }
    }
    

    Now when I run mvn clean install, I always get: Missing beans.xml file in META-INF!

    My root folders are "src" and "web" which contains WEB-INF folder, but I also tried to use default maven structure and renamed "web" to "webapp" and moved it to src/main. I tried all the reasonable locations I could thought of:

     - src/main/java/META-INF/beans.xml
     - src/test/java/META-INF/beans.xml
     - web/WEB-INF/beans.xml
     - src/main/webapp/WEB-INF/beans.xml
     - src/main/webapp/META-INF/beans.xml
     - src/main/webapp/META-INF/(empty) and src/main/webapp/WEB-INF/beans.xml
    

    Nothing works so far :/