Несмотря на то, что этот пост несколько устарел, я отвечаю на свой собственный ответ, так как он может сэкономить другое время
<code>package com.creativefella;
import org.apache.catalina.Engine;
import org.apache.catalina.Host;
import org.apache.catalina.LifecycleException;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.core.StandardContext;
import org.apache.catalina.startup.Embedded;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class TomcatServer {
private Embedded server;
private int port;
private boolean isRunning;
private static final Logger LOG = LoggerFactory.getLogger(TomcatServer.class);
private static final boolean isInfo = LOG.isInfoEnabled();
/**
* Create a new Tomcat embedded server instance. Setup looks like:
* <pre><Server>
* <Service>
* <Connector />
* <Engine>
* <Host>
* <Context />
* </Host>
* </Engine>
* </Service>
*</Server>
* & будет создан автоматически. Нам нужно подключить остальное к экземпляру {@link Embedded}
* @param contextPath Контекстный путь для приложения
* @param port Номер порта, который будет использоваться для встроенного сервера Tomcat
* @param appBase Путь к файлам приложения (для веб-приложений на основе Maven, в общем:
/src/main/
)
* @param shutdownHook Если true, регистрирует хук отключения сервера с помощью JVM. Это полезно для выключения сервера
* в ошибочных случаях.
* Исключения @throws
* /
public TomcatServer (String contextPath, int port, String appBase, логический shutdownHook) {
if (contextPath == null || appBase == null || appBase.length () == 0) {
бросить новое IllegalArgumentException («Путь к контексту или база приложения не должны быть нулевыми»);
}
if (! contextPath.startsWith ("/")) {
contextPath = "/" + contextPath;
}
this.port = port;
сервер = новый Embedded ();
server.setName ( "TomcatEmbeddedServer");
Host localHost = server.createHost ("localhost", appBase);
localHost.setAutoDeploy (ложь);
StandardContext rootContext = (StandardContext) server.createContext (contextPath, "webapp");
rootContext.setDefaultWebXml ( "web.xml");
localHost.addChild (rootContext);
Engine engine = server.createEngine ();
engine.setDefaultHost (localHost.getName ());
engine.setName ( "TomcatEngine");
engine.addChild (LocalHost);
server.addEngine (двигатель);
Соединитель соединитель = server.createConnector (localHost.getName (), порт, ложь);
server.addConnector (разъем);
// зарегистрируем отключение
if (shutdownHook) {
Runtime.getRuntime (). AddShutdownHook (new Thread () {
public void run () {
if (isRunning) {
if (isInfo) LOG.info («Остановка сервера Tomcat через хук отключения»);
пытаться {
if (server! = null) {
server.stop ();
}
} catch (LifecycleException e) {
LOG.error («Ошибка при остановке сервера Tomcat через хук отключения», e);
}
}
}
});
}
}
/ **
* Запустите встроенный сервер Tomcat
* /
public void start () создает исключение LifecycleException {
if (isRunning) {
LOG.warn («Сервер Tomcat уже работает @ port = {}; игнорирование запуска», порт);
вернуть;
}
if (isInfo) LOG.info («Запуск сервера Tomcat @ port = {}», порт);
server.setAwait (истина);
server.start ();
isRunning = true;
}
/ **
* Остановите встроенный сервер Tomcat
* /
public void stop () выбрасывает LifecycleException {
if (! isRunning) {
LOG.warn («Сервер Tomcat не работает @ port = {}», порт);
вернуть;
}
if (isInfo) LOG.info («Остановка сервера Tomcat»);
server.stop ();
isRunning = false;
}
public boolean isRunning () {
возврат isRunning;
}
}
Я также столкнулся с ошибкой 404
и некоторое время боролся. Увидев журнал 'INFO: No default web.xml
', я заподозрил его (если бы это было предупреждением, его было бы легко заметить) . Хитрость заключается в использовании web.xml
(rootContext.setDefaultWebXml("web.xml")
) , поставляемом с Tomcat (conf/web.xml
) . Причина в том, что он включает DefaultServlet, который обслуживает статические файлы, такие как HTML, JS. Либо используйте web.xml
, либо зарегистрируйте сервлет вручную в своем коде.
Использование
// start the server at http://localhost:8080/myapp
TomcatServer server = new TomcatServer("myapp", 8080, "/src/main/", true);
server.start();
// .....
server.stop();
Не забудьте поместить web.xml
по умолчанию в тот же каталог этой программы или указать правильное местоположение.
Следует отметить, что отключающий крюк основан на ответе Антонио .