2013-12-09 79 views
1

我在IntelliJ中有一个maven项目,我试图将一个war文件部署到jetty容器。这样做的目的是对所述战争文件中的一些功能进行快速集成测试。用CDI部署战争到Jetty

由于开箱即用的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 

我已经包含在我的POM的焊接servlet的罐子,还增加了焊接监听到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

发现问题。事实证明,类加载器对于在哪里获得适当的WELD支持感到困惑。我在我的pom中指定了焊接servlet,但是我正在部署的战争中也有其他一些也引入焊接的罐子。 我将启动jetty的项目分隔成一个新的IntelliJ项目,它工作得很好。 感谢您的所有建议。 – user2533384

回答

8

以下配置适用于我在码头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 ressources

<!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中注入豆您需要通过在您的WEB-INF目录中创建以下jetty-web.xml文件来要求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注入支持。

奖励:使用码头插件的Maven

这是很容易,你只需要一个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

小心:带有的XML实际上删除所有的webapp类加载器隔离。使用这种技术,您只需使用1个条目覆盖整个serverClasses数组,从而使服务器类加载器中的所有内容现在都可见到webapp。 (servlet规范中的no-no) –