首页 文章

使用CDI将战争部署到Jetty

提问于
浏览
1

我在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的>焊接servlet的芯</ artifactId的>
<版本> 2.0.4.Final </版本>
</依赖性>
web.xml <listener>
<监听级> org.jboss.weld.environment.servlet.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>

2 回答

  • 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,你需要通过在 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 Injection支持 .

    Bonus : using the jetty plugin for Maven

    它's quite easy, you' ll只需要为你的 pom.xml 添加 run Profiles

    <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

    Jetty 9.1.0需要Weld 2.2.0

    见:https://issues.jboss.org/browse/WELD-1561

相关问题