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