Привет! Запись актуальна для Jetty 9.4.11.
Цель: подключение Jetty в качестве плагина для Maven с поддержкой CDI.
Стоит отметить, что для работы CDI, Jetty 9.1+ требует наличие Weld 2.2.0 и выше. Поэтому добавим weld-servlet в проект:
1 2 3 4 5 |
<dependency> <groupId>org.jboss.weld.servlet</groupId> <artifactId>weld-servlet</artifactId> <version>2.4.7.Final</version> </dependency> |
Добавьте в дескриптор развертывания web.xml слушатель и элемент окружения BeanManager:
1 2 3 4 5 6 7 8 9 |
<!-- Jetty CDI environment --> <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> <!-- end of Jetty CDI environment --> |
Создайте файл jetty-env.xml в директории WEB-INF вашего проекта и добавьте в него конфигурацию webAppCtx содержащую веб-контекст и JNDI ресурс:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
<?xml version="1.0"?> <!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"> <Call name="prependServerClass"> <Arg>-org.eclipse.jetty.server.handler.ContextHandler</Arg> </Call> <Call name="prependServerClass"> <Arg>-org.eclipse.jetty.servlet.FilterHolder</Arg> </Call> <Call name="prependServerClass"> <Arg>-org.eclipse.jetty.servlet.ServletContextHandler</Arg> </Call> <Call name="prependServerClass"> <Arg>-org.eclipse.jetty.servlet.ServletHolder</Arg> </Call> <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> |
Теперь создайте новый профиль «jetty» в pom.xml.
Вот как это должно примерно выглядеть:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
<profiles> <!-- mvn -P jetty --> <profile> <id>jetty</id> <build> <defaultGoal>clean jetty:run-forked</defaultGoal> <plugins> <plugin> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <version>9.4.11.v20180605</version> <configuration> <stopPort>1353</stopPort> <stopKey>quit</stopKey> <contextXml>src/main/webapp/WEB-INF/jetty-env.xml</contextXml> </configuration> <dependencies> <dependency> <groupId>org.eclipse.sisu</groupId> <artifactId>org.eclipse.sisu.plexus</artifactId> <version>0.3.3</version> <exclusions> <exclusion> <groupId>javax.enterprise</groupId> <artifactId>cdi-api</artifactId> </exclusion> </exclusions> </dependency> </dependencies> </plugin> </plugins> </build> </profile> </profiles> |
Запуск профиля происходит командой:
mvn -P jetty
После успешного запуска Jetty, нужно вручную открыть страницу проекта, например:
http://localhost:8080/index.jsf
На этом всё, ниже будет прокомментировано исключение старой старой версии CDI из weld-servlet.jar.
Что делать, если WELD-000144: CDI API version mismatch
Что-бы в jetty-maven-plugin 9.4.* не возникло исключение при запуске с активным Weld’ом:
org.jboss.weld.exceptions.IllegalStateException: WELD-000144: CDI API version mismatch. CDI 1.0 API detected on classpath. Weld requires version 1.1 or better.
Нужно исключить старую версию cdi-api библиотеки, которую подтягивает sisu:
1 2 3 4 5 6 7 8 9 10 11 |
<dependency> <groupId>org.eclipse.sisu</groupId> <artifactId>org.eclipse.sisu.plexus</artifactId> <version>0.3.3</version> <exclusions> <exclusion> <groupId>javax.enterprise</groupId> <artifactId>cdi-api</artifactId> </exclusion> </exclusions> </dependency> |