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