Tomcat, встроенный в приложение.

29.11.2017
Иванов Аркадий

 Запускать webapps в Tomcat - дело привычное. Всякий раз надо настраивать отдельно конфигурацию Tomcat-a, делать для него скрипты автозапуска. Иногда это приходится делать ради одного малюсенького приложения. Рутина..., блин.

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

Описание подходит для Tomcat 9 версии.

 

Какие для этого потребуются библиотеки (JAR-ы) и где их взять?

1. Копирую текущие исходники  tomcat-а из SVN-репозитория к себе:

    svn co https://svn.apache.org/repos/asf/tomcat/trunk tomcat

2. Перехожу в получившуюся папку и запускаю сборку embedded-варианта:

    cd tomcat
    ant embed-jars

    ant спотыкается на отсутствии библиотек annotations-api.jar и tomcat-dbcp.jar в каталоге tomcat/output/build/lib.
    Ладно, копирую их туда из обычного дистрибутива tomcat-а. и снова:

    ant embed-jars
3. В каталоге tomcat/output/embed получаю нужный для работы набор JAR-ов:
   annotations-api.jar
   ecj-4.6.3.jar
   tomcat-dbcp.jar
   tomcat-embed-core.jar
   tomcat-embed-el.jar
   tomcat-embed-jasper.jar
   tomcat-embed-websocket.jar

 4. В простейшем случае без поддержки JSP достаточно tomcat-embed-core.jar.

 

Helloworld со встроенным Tomcat-ом.

Итак, ниже приведена простая программа, которая использует embedded Tomcat.
Она слушает порт 8080.
Содержит 2 сервлета.
Первый здоровается при вызове URL с "localhost:8080/hello".
Второй реагирует на все остальные URL.

import java.io.File;
import java.io.IOException;
import java.io.Writer;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.catalina.Context;
import org.apache.catalina.LifecycleException;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.startup.Tomcat;

public class HelloWorld {
    public static void main(String[] args)
            throws LifecycleException, InterruptedException, ServletException {
        Tomcat tomcat = new Tomcat();
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        connector.setPort(8080);
        tomcat.setConnector(connector);
        
        Context ctx = tomcat.addContext("/", new File(".").getAbsolutePath());
        
        // Сервлет, который здоровается на URL "localhost:8080/hello"
        tomcat.addServlet(ctx, "helloworld", new HelloServlet());
        ctx.addServletMappingDecoded("/hello", "helloworld");

        // Сервлет, который реагирует на все остальные URL "localhost:8080/*"
        tomcat.addServlet(ctx, "what", new WhatServlet());
        ctx.addServletMappingDecoded("/*", "what");

        tomcat.start();
        tomcat.getServer().await();
    }
}

class HelloServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse res)
            throws ServletException, IOException {
        Writer w = res.getWriter();
        w.write("Hello, world!");
        w.flush();
    }
}

class WhatServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse res)
            throws ServletException, IOException {
        Writer w = res.getWriter();
        w.write("What do you want?");
        w.flush();
    }
}

 

Запуск программы:

java -cp .:/home/arc/lib/tomcat-embed-core.jar  HelloWorld