我在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
<dependency> <groupId>org.jboss.weld.servlet</groupId> <artifactId>weld-servlet-core</artifactId> <version>2.0.4.Final</version> </dependency>
的web.xml
<listener> <listener-class>org.jboss.weld.environment.servlet.Listener</listener-class> </listener>
<resource-env-ref>
<description>Object factory for the CDI Bean Manager</description>
<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>
答案 0 :(得分:9)
以下配置适用于Jetty 8.x和9.0.x(目前不是9.1+)
以下是所需的配置:
在Pom.xml中添加依赖项
....
<dependency>
<groupId>org.jboss.weld.servlet</groupId>
<artifactId>weld-servlet</artifactId>
<version>2.1.0.Final</version>
</dependency>
....
请注意我正在使用weld-servlet
依赖项,其中包含所有需要的Weld和CDI类。
在jetty-env.xml
中声明JNDI资源
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">
<Configure id="webAppCtx" class="org.eclipse.jetty.webapp.WebAppContext">
<New id="BeanManager" class="org.eclipse.jetty.plus.jndi.Resource">
<Arg>
<Ref id="webAppCtx"/>
</Arg>
<Arg>BeanManager</Arg>
<Arg>
<New class="javax.naming.Reference">
<Arg>javax.enterprise.inject.spi.BeanManager</Arg>
<Arg>org.jboss.weld.resources.ManagerObjectFactory</Arg>
<Arg/>
</New>
</Arg>
</New>
</Configure>
在web.xml
中添加侦听器并公开JNDI资源:
...
<listener>
<listener-class>org.jboss.weld.environment.servlet.Listener</listener-class>
</listener>
...
<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>
...
最后如果你想能够在servlet中注入bean,你需要通过在jetty-web.xml
目录中创建以下WEB-INF
文件来让Jetty公开它的一些内部类
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
<Set name="serverClasses">
<Array type="java.lang.String">
<Item>-org.eclipse.jetty.servlet.ServletContextHandler.Decorator</Item>
</Array>
</Set>
</Configure>
不要错过-
中的<Item/>
,这是告诉Jetty一个类不再是内部类并且可以被webapp看到的方法。有了这个,Weld将能够装饰Jetty内部servlet类以在其中添加CDI Injection支持。
奖励:使用Maven的jetty插件
这很简单,您只需要为run
添加pom.xml
个人资料
<profile>
<id>run</id>
<build>
<defaultGoal>clean jetty:run-forked</defaultGoal>
<plugins>
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.0.7.v20131107</version>
<configuration>
<stopPort>1353</stopPort>
<stopKey>quit</stopKey>
<contextXml>src/main/webapp/WEB-INF/jetty-web.xml</contextXml>
</configuration>
</plugin>
</plugins>
</build>
</profile>
之后,您只需键入mvn -Prun
即可构建您的应用,启动Jetty并在其中部署应用。
答案 1 :(得分:1)
Jetty 9.1.0+需要Weld 2.2.0 +