我在IntelliJ中有一个maven项目,我试图将war文件部署到jetty容器中.这样做的目的是对所述war文件中的一些功能进行快速集成测试.
由于开箱即用Jetty没有附带CDI或JNDI,我试图添加对这些的支持,但遇到了一些问题.例如,我在启动时收到以下错误:
15:30:50 [34mINFO [0;39m o.a.s.c.CdiObjectFactory - [lookup]: Checking for BeanManager under JNDI key java:comp/BeanManager 15:30:50 [39mDEBUG[0;39m o.a.s.c.CdiObjectFactory - [lookup]: BeanManager lookup failed for JNDI key java:comp/BeanManager
我已将焊接servlet jar包含在我的pom中,并且还将焊接侦听器添加到web.xml中,但它仍然无效.我正在使用Jetty 9.有什么想法吗?
的pom.xml
org.jboss.weld.servlet weld-servlet-core 2.0.4.Final web.xml中
org.jboss.weld.environment.servlet.Listener
Object factory for the CDI Bean Manager BeanManager javax.enterprise.inject.spi.BeanManager
Antoine Sabo.. 9
以下配置适用于Jetty 8.x和9.0.x(目前不是9.1+)
以下是所需的配置:
在Pom.xml中添加依赖项
........ org.jboss.weld.servlet weld-servlet 2.1.0.Final
请注意我正在使用weld-servlet
依赖项,其中包含所有需要的Weld和CDI类.
在jetty-env.xml
你声明JNDI资源
BeanManager javax.enterprise.inject.spi.BeanManager org.jboss.weld.resources.ManagerObjectFactory
在web.xml
您添加侦听器并公开JNDI资源:
...... org.jboss.weld.environment.servlet.Listener ... BeanManager javax.enterprise.inject.spi.BeanManager
最后,如果你想能够在servlet中注入bean,你需要让Jetty通过jetty-web.xml
在你的WEB-INF
目录中创建以下文件来公开它的一些内部类
- -org.eclipse.jetty.servlet.ServletContextHandler.Decorator
不要错过了-
在
,它告诉码头一个类是没有更多的内部类,可以由Web应用程序可以看到的方式.有了这个,Weld将能够装饰Jetty内部servlet类,在其中添加CDI Injection支持.
额外奖励:使用Maven的jetty插件
这是很容易,你只需要添加一个run
配置文件,您pom.xml
喜欢这个
run clean jetty:run-forked org.eclipse.jetty jetty-maven-plugin 9.0.7.v20131107 1353 quit src/main/webapp/WEB-INF/jetty-web.xml
之后,您只需键入mvn -Prun
以构建应用程序,启动Jetty并在其中部署应用程序.