以下配置適用於我在碼頭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並在其中部署應用。
發現問題。事實證明,類加載器對於在哪裏獲得適當的WELD支持感到困惑。我在我的pom中指定了焊接servlet,但是我正在部署的戰爭中也有其他一些也引入焊接的罐子。 我將啓動jetty的項目分隔成一個新的IntelliJ項目,它工作得很好。 感謝您的所有建議。 – user2533384