2013-12-09 81 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) –