2013-12-09 7 views
1

У меня есть проект maven в IntelliJ, где я пытаюсь развернуть военный файл в контейнер причала. Целью этого является быстрое тестирование интеграции некоторых функций в указанном военном файле.Развертывание войны с Jetty с CDI

Поскольку 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 

Я включил приварной сервлет банку в моем П, а также добавил слушатель сварки в 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> 
+0

Обнаружили проблему. Оказывается, загрузчик классов путался с тем, чтобы получить соответствующую поддержку WELD. У меня был сварной сервлет, как указано в моем помпе, но в войне, в которой я развертывался, также были другие банки, которые также приваривали. Я отделил проект, который запускал причал в новый проект IntelliJ, и он работал отлично. Спасибо за все ваши предложения. – user2533384

ответ

8

Следующая конфигурация работает для меня на 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 и развернуть приложение в нем.

+1

Осторожно: XML с '' фактически удаляет весь загрузчик классов webapp изоляция. Используя эту технику, вы просто перезаписали весь массив serverClasses с 1 записью, сделав все от серверного загрузчика классов, теперь видимым для webapp. (нет-нет в терминах сервлета) –

1

Jetty 9.1.0+ требует Weld 2.2.0+

См: https://issues.jboss.org/browse/WELD-1561

+0

Спасибо. У меня такая же проблема с причалом 8, однако ... – user2533384

+0

Можете обновить/изменить свой вопрос, чтобы сказать, что тогда :) –

Смежные вопросы