gpt4 book ai didi

maven - 使用 CDI 向 Jetty 部署 war

转载 作者:行者123 更新时间:2023-12-03 11:52:18 24 4
gpt4 key购买 nike

我在 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

我已将 weld-servlet jar 包含在我的 pom 中,并将焊接监听器添加到 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>

最佳答案

以下配置适用于 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包含所有需要的焊接和 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 中注入(inject) bean,您需要要求 Jetty 通过创建以下 jetty-web.xml 来公开它的一些内部类。文件在你的 WEB-INF目录

<!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 注入(inject)支持。

奖励:使用 Maven 的 jetty 插件

这很简单,您只需添加一个 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 并在其中部署应用程序。

关于maven - 使用 CDI 向 Jetty 部署 war ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20483186/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com