In JSF Tip #66 I described what you need to do to get JSF running on a Servlet container. Of course this is not the end of the story. What if you need CDI? Well than you need just a little more. First start with the dependency.
<dependency>
<groupId>org.jboss.weld.servlet</groupId>
<artifactId>weld-servlet</artifactId>
<version>2.3.5.Final</version>
<scope>compile</scope>
</dependency>
Then make sure to add a beans.xml to your WEB-INF directory. Like the one below.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
bean-discovery-mode="annotated">
</beans>
If you are running this on Tomcat you will also have to add the following to your context.xml.
<Resource name="BeanManager"
auth="Container"
type="javax.enterprise.inject.spi.BeanManager"
factory="org.jboss.weld.resources.ManagerObjectFactory"
/>
If you are running this on Tomcat you will also have to add the following to your web.xml
<resource-env-ref>
<resource-env-ref-name>BeanManager</resource-env-ref-name>
<resource-env-ref-type>javax.enterprise.inject.spi.BeanManager</resource-env-ref-type>
</resource-env-ref>
And voila you now have CDI with JSF on a servlet container!
Posted October 6, 2016