CDI: beans.xml, where do I put you?
JavaJakarta EeMavenCdiJboss WeldJava Problem Overview
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 :/
Java Solutions
Solution 1 - Java
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 - Java
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.
Solution 3 - Java
http://www.javamonamour.org/2017/11/cdi-in-java-se-8.html here you can see where I have put it with success, that is under src/META-INF . The post contains a full working example of CDI in Java SE.