2015-12-16 5 views
0

В настоящее время я использую Jetty 9 для развертывания файлов WAR.Как добавить поддержку Weld CDI в рабочее приложение Jetty?

Для управления зависимостями, я использую Gradle; мой build.gradle файл выглядит следующим образом:

apply plugin: 'java' 
apply plugin: 'war' 

repositories { 
    mavenCentral() 
} 

dependencies { 
    /** 
    * Jersey. 
    */ 
    compile 'org.glassfish.jersey.containers:jersey-container-servlet:2.22.1' 
    compile 'org.glassfish.jersey.core:jersey-server:2.22.1' 
    /** 
    * Weld CDI. 
    */ 
    compile 'org.jboss.weld.servlet:weld-servlet-core:2.3.2.Final' 

    /** 
    * JUnit. 
    */ 
    testCompile 'junit:junit:4.12' 
} 

Мой web.xml выглядит следующим образом:

<web-app version="3.0"> 
<display-name>Example Api</display-name> 
<servlet> 
    <servlet-name>RESTful Service</servlet-name> 
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
    <init-param> 
     <param-name>jersey.config.server.provider.packages</param-name> 
     <param-value>com.example.api</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>RESTful Service</servlet-name> 
    <url-pattern>/*</url-pattern> 
</servlet-mapping> 
<listener> 
    <listener-class>org.jboss.weld.environment.servlet.Listener</listener-class> 
</listener> 
</web-app> 

Однако, когда я пытаюсь развернуть, я получаю следующую трассировку стека:

[2015-12-16 09:13:33,315] Artifact Gradle : api : api.war: Artifact is being deployed, please wait... 
Dec 16, 2015 9:13:36 PM org.jboss.weld.environment.servlet.EnhancedListener onStartup 
INFO: WELD-ENV-001008: Initialize Weld using ServletContainerInitializer 
Dec 16, 2015 9:13:36 PM org.jboss.weld.bootstrap.WeldStartup <clinit> 
INFO: WELD-000900: 2.3.2 (Final) 
Dec 16, 2015 9:13:36 PM org.jboss.weld.environment.servlet.WeldServletLifecycle initialize 
INFO: WELD-ENV-000028: Weld initialization skipped - no bean archive found 
Dec 16, 2015 9:13:36 PM org.jboss.weld.environment.servlet.Listener contextInitialized 
INFO: WELD-ENV-001007: Initialize Weld using ServletContextListener 
Dec 16, 2015 9:13:36 PM org.jboss.weld.environment.servlet.WeldServletLifecycle initialize 
INFO: WELD-ENV-000028: Weld initialization skipped - no bean archive found 

Круги по java.lang.IllegalStateException: Singleton not set for STATIC_INSTANCE => [].

Может кто-нибудь, пожалуйста, скажите мне, что нужно сделать, чтобы это работало?

Я просто пытаюсь @Inject свои зависимости в Jetty, но я только найти себя борется с настройками конфигурации в течение нескольких дней подряд ...

+0

Вы используете [тег: встроенный-Jetty]? (либо самостоятельно, либо из градиента?), либо вы развертываете для распределения причалов? –

+0

@JoakimErdfelt Я развертываю дистрибутив приписки (буквально отбрасывая .war внутри $ JETTY_HOME/webapps и запуская 'java -jar start.jar'). – user132169

ответ

1

Если вы хотите использовать Weld/CDI на Jetty Distribution, вы будете необходимо сделать следующее.

This is partly documented on the Weld/CDI side at Environments: Jetty

  1. Включить сварные сосуды, подходящие для вашего использования в WEB-INF/lib каталоге файла WAR. (давайте назовем это mywebapp.war)
  2. Создайте каталог ${jetty.base} и настройте его правильно.
  3. НЕ ИЗМЕНИТЬ/ИЗМЕНИТЬ/ИЗМЕНИТЬ/ИЗМЕНИТЬ/ИЗОБРАЖИТЕ любой контент в ${jetty.home} или $JETTY_HOME. Если вы делаете это, вы уже не используете причал должным образом.
  4. Создание XML развертываемую, чтобы позволить Weld/CDI, чтобы увидеть через изоляцию Стандартный Servlet ClassLoader с файлом под названием ${jetty.base}/webapps/mywebapp.xml
  5. Copy mywebapp.war в ${jetty.base}/webapps/ каталог.
  6. Старт причал.

Пример ${jetty.base} установки

$ mkdir /path/to/mybase 
$ cd /path/to/mybase 
$ java -jar /path/to/jetty-dist/start.jar --add-to-start=http,deploy 

Пример ${jetty.base}/webapps/mywebapp.xml

<?xml version="1.0"?> 

<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd"> 

<Configure class="org.eclipse.jetty.webapp.WebAppContext"> 
    <Set name="contextPath">/weld-numberguess</Set> 
    <Set name="war"><Property name="jetty.webapps" default="."/>/mywebapp.war</Set> 
    <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> 
</Configure> 
+0

Спасибо за поэтапное объяснение! Я пытался это сделать, но теперь я получаю следующую ошибку: '2015-12-17 21: 14: 32.102: INFO: oejw.StandardDescriptorProcessor: main: NO JSP Поддержка /, не найдена org .eclipse.jetty.jsp.JettyJspServlet' снова следуют 'java.lang.IllegalStateException: Singleton не установлен STATIC_INSTANCE => []' Я попытался, глядя на банку, содержащую класс JettyJspServlet, но я не может найти правильную зависимость в www.mvnrepository.com.Вы знаете, где его найти? – user132169

+0

jsp - это другая тема, новый/другой вопрос. –

+0

Хорошо, спасибо! – user132169