【问题标题】:Deploying a war to Jetty with CDI使用 CDI 向 Jetty 部署战争
【发布时间】:2013-12-27 07:17:36
【问题描述】:

我在 IntelliJ 中有一个 maven 项目,我正在尝试将 war 文件部署到码头容器。这样做的目的是为了对上述 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 

我已经在我的 pom 中包含了weld-servlet jar,并且还在 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>

【问题讨论】:

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

标签: maven jetty jndi cdi


【解决方案1】:

以下配置适用于 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-servletdependency,它包含所有需要的 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>

不要错过&lt;Item/&gt; 中的-,这是告诉Jetty 类不再是内部类并且可以被webapp 看到的方式。有了这个 Weld 就可以装饰 Jetty 内部 servlet 类,在其中添加 CDI 注入支持。

奖励:使用 Maven 的码头插件

这很简单,您只需将runprofile 添加到您的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 并在其中部署应用。

【讨论】:

  • 小心:带有&lt;Set name="serverClasses"&gt; 的XML 实际上删除了所有webapp 类加载器隔离。使用该技术,您只需使用 1 个条目覆盖整个 serverClasses 数组,从而使来自服务器类加载器的所有内容现在对 webapp 可见。 (在 servlet 规范术语中禁止使用)
【解决方案2】:

Jetty 9.1.0+ 需要 Weld 2.2.0+

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

【讨论】:

    猜你喜欢
    • 2014-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-14
    • 1970-01-01
    • 2015-09-30
    • 2011-10-20
    • 2014-05-06
    相关资源
    最近更新 更多