Вложение Jetty в контейнер для сервлетов

Я использую Tomcat для обслуживания своих сервлетов Java, и это больше для меня. Мне просто нужно обслуживать только запросы сервлета, статический контент, ни JSP, и т.д. Поэтому я искал контейнер Servlet, который может быть встроен в мое приложение. Я чувствовал, что если лишить Jetty и использовать его в качестве контейнера Servlet, он может быть более масштабируемым и занимать небольшой объем памяти, [мне не нужен веб-сервер Jetty и другие компоненты]. Поэтому у меня есть несколько вопросов,

  • Как мне вставить Jetty в свой код приложения для обслуживания запросов Servlet?
  • Если я вложу код Jetty в свой код приложения, смогу ли я легко обновить версии Jetty?
  • Я получил код Jetty здесь, если мне нужно вставить Jetty Servlet Container в мое приложение, которое я должен использовать из источника, http://git.eclipse.org/c/jetty/org.eclipse.jetty.project.git/snapshot/jetty-9.0.3.v20130506.tar.bz2, jetty-9.0.3.v20130506/jetty-servlet или jetty-9.0.3.v20130506/jetty-servlets

Я намерен обслуживать запросы API с моими приложениями, и я ищу производительность и масштабируемость в качестве основных ограничений. И, конечно же, поддержка сервлета 3.0.

Ответ 1

Что вы ищете, так это запуск Jetty во встроенном сценарии.

Имеется множество примеров, показывающих, как связать различные предметы, необходимые для достижения ваших целей.

Ознакомьтесь с встроенными примерами в дереве источников причала.

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

Поскольку вы заявили, что хотите Servlet 3.0, не интересуетесь JSP, это довольно просто настроить. (JSP сложнее настроить, но возможно).

Для специфического внедрения в servlet 3.0 есть полный пример проекта, размещенный в github.

https://github.com/jetty-project/embedded-servlet-3.0

Короче говоря, у вас будет следующий код инициализации.

package com.company.foo;

import org.eclipse.jetty.annotations.AnnotationConfiguration;
import org.eclipse.jetty.plus.webapp.EnvConfiguration;
import org.eclipse.jetty.plus.webapp.PlusConfiguration;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.webapp.Configuration;
import org.eclipse.jetty.webapp.FragmentConfiguration;
import org.eclipse.jetty.webapp.MetaInfConfiguration;
import org.eclipse.jetty.webapp.TagLibConfiguration;
import org.eclipse.jetty.webapp.WebAppContext;
import org.eclipse.jetty.webapp.WebInfConfiguration;
import org.eclipse.jetty.webapp.WebXmlConfiguration;

public class EmbedMe {
    public static void main(String[] args) throws Exception {
        int port = 8080;
        Server server = new Server(port);

        String wardir = "target/sample-webapp-1-SNAPSHOT";

        WebAppContext context = new WebAppContext();
        // This can be your own project jar file, but the contents should
        // conform to the WAR layout.
        context.setResourceBase(wardir);
        // A WEB-INF/web.xml is required for Servlet 3.0
        context.setDescriptor(wardir + "WEB-INF/web.xml");
        // Initialize the various configurations required to auto-wire up
        // the Servlet 3.0 annotations, descriptors, and fragments
        context.setConfigurations(new Configuration[] {
                            new AnnotationConfiguration(), 
                            new WebXmlConfiguration(),
                            new WebInfConfiguration(), 
                            new TagLibConfiguration(),
                            new PlusConfiguration(), 
                            new MetaInfConfiguration(),
                            new FragmentConfiguration(), 
                            new EnvConfiguration() });

        // Specify the context path that you want this webapp to show up as
        context.setContextPath("/");
        // Tell the classloader to use the "server" classpath over the
        // webapp classpath. (this is so that jars and libs in your
        // server classpath are used, requiring no WEB-INF/lib 
        // directory to exist)
        context.setParentLoaderPriority(true);
        // Add this webapp to the server
        server.setHandler(context);
        // Start the server thread
        server.start();
        // Wait for the server thread to stop (optional)
        server.join();
    }
}