Как мне загрузить сервлеты из web.xml со встроенным молом? - PullRequest
0 голосов
/ 04 октября 2019

Я пытаюсь перенести мое приложение с tomcat на встроенный причал . Я создал точку входа в веб-модуле, следуя некоторым руководствам ( это , это , это и т. Д.). Полученный файл представлен ниже:

import org.eclipse.jetty.server.Server
import org.eclipse.jetty.webapp.WebAppContext

object EPILauncher extends App {
  val server: Server = new Server(8080)
  val coolWebApplication = new WebAppContext()
  coolWebApplication.setResourceBase("warehouse/src/main/webapp/")
  coolWebApplication.setContextPath("/api")
  coolWebApplication.setDescriptor("warehouse/src/main/webapp/WEB-INF/web.xml")
  coolWebApplication.setParentLoaderPriority(true)
  server.start()
  System.out.println("Started!")
  server.join()
}

У меня есть следующее объявление сервлета в моем web.xml файле

     <servlet>
        <servlet-name>CustomerApplication</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>com.xxxx.yyyy.warehouse.web.Root</param-value>
        </init-param>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>
                io.swagger.jaxrs.listing,
                org.owasp.csrfguard.servlet,
                com.xxxx.yyyy.warehouse.resource
            </param-value>
        </init-param>
        <init-param>
            <param-name>jersey.config.server.provider.scanning.recursive</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <param-name>jersey.config.servlet.filter.staticContentRegex</param-name>
            <param-value>.*(html|css|js|eot|svg|ttf|woff)</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>CustomerApplication</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

Пакет com.xxxx.yyyy.warehouse.resource содержит реализации, например:

@Singleton
@Path("/settings")
@Api("/settings")
class SettingsResource @Inject()(config: Config) {
  @GET
  @Path("/version")
  @Produces(Array(MediaType.APPLICATION_JSON))
  def getBackendVersion(@Context servletContext: ServletContext): Response = {
    val manifestStream = servletContext.getResourceAsStream("META-INF/MANIFEST.MF")
    val version: String = Option(manifestStream)
      .map(Utils.using(_) { is =>
        val attrs = new java.util.jar.Manifest(is).getMainAttributes
        val version = attrs.getOrDefault(new Attributes.Name("Specification-Version"), "local-version").toString
        val build = attrs.getOrDefault(new Attributes.Name("Implementation-Version"), "local-build").toString
        s"$version.$build"
      }).getOrElse("local-version.local-build")
    Response.ok(VersionInfo(version)).build()
  }
}

Итак, когда я запускаю свое приложение и перехожу на localhost:8080/api/settings/version, все, что я вижу, это:

URI:    /api/settings/version
STATUS: 404
MESSAGE:    Not Found
SERVLET:    -

Итак, я думаю, что не понимаю некоторые концепции должным образом. Должен ли я указать в своем методе main, какие сервлеты я хочу использовать? Могут ли они автоматически загружаться из файла web.xml? Спасибо.

1 Ответ

1 голос
/ 04 октября 2019

Хотя сервлеты можно загружать из WEB-INF/web.xml или из аннотаций, это не самый идеальный способ использования встроенного сервера.

Почему?

Для Jetty использовать либо WEB-INF/web.xml или аннотации у вас есть WebAppContext. Который является тяжеловесным компонентом с полными правилами сервлета и поведением загрузчика классов (re: изоляция загрузчика классов).

Это часто излишне для встроенного сервера.

Далее, если вы полагаетесь на аннотации, то выбудет добавлено требование для сканирования байт-кода ваших классов, что сделает настройку вашей среды более сложной.

Более традиционная настройка на Jetty - это использование ServletContextHandler, а не WebAppContext и ручное объявлениевсе сервлеты и фильтры и их сопоставления.

Это также делает запуск очень быстрым (подходит для среды док-станции или микросервисов). Подумайте за секунду запуска. Таким образом, запуск при 100 мс возможен при минимальных усилиях.

Если вам нужно придерживаться войны и WebAppContext, рассмотрите возможность сканирования во время сборки конфигурации и ресурсов войны, а затем добавьте метаданные jetty-quickstart в свой файл. война. Этот маленький кусочек XML, а также быстрый запуск также позволят вам запустить невероятно быстрый запуск без шага обнаружения веб-приложения.

...