Следующая конфигурация работает для меня на 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 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>
...
И в конце концов, если вы хотите, чтобы иметь возможность вводить фасоль в сервлет вам необходимо попросить 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, чтобы добавить поддержку CDI Injection.
Бонус: используя причалу плагин для 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. У меня был сварной сервлет, как указано в моем помпе, но в войне, в которой я развертывался, также были другие банки, которые также приваривали. Я отделил проект, который запускал причал в новый проект IntelliJ, и он работал отлично. Спасибо за все ваши предложения. – user2533384