現在、本番環境のTomcat 6でWebアプリケーションを実行していますが、組み込みモードでのTomcatの実行を評価したいと思います。
APIドキュメントにあるもの以外に、優れたチュートリアルやその他のリソースはありますか?
この投稿はかなり古くなっていますが、他の人の時間を節約できるので、私は自分の答えに答えています
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></pre>
* <Server> & <Service> will be created automcatically. We need to hook the remaining to an {@link Embedded} instnace
* @param contextPath Context path for the application
* @param port Port number to be used for the embedded Tomcat server
* @param appBase Path to the Application files (for Maven based web apps, in general: <code>/src/main/</code>)
* @param shutdownHook If true, registers a server' shutdown hook with JVM. This is useful to shutdown the server
* in erroneous cases.
* @throws Exception
*/
public TomcatServer(String contextPath, int port, String appBase, boolean shutdownHook) {
if(contextPath == null || appBase == null || appBase.length() == 0) {
throw new IllegalArgumentException("Context path or appbase should not be null");
}
if(!contextPath.startsWith("/")) {
contextPath = "/" + contextPath;
}
this.port = port;
server = new Embedded();
server.setName("TomcatEmbeddedServer");
Host localHost = server.createHost("localhost", appBase);
localHost.setAutoDeploy(false);
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(engine);
Connector connector = server.createConnector(localHost.getName(), port, false);
server.addConnector(connector);
// register shutdown hook
if(shutdownHook) {
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
if(isRunning) {
if(isInfo) LOG.info("Stopping the Tomcat server, through shutdown hook");
try {
if (server != null) {
server.stop();
}
} catch (LifecycleException e) {
LOG.error("Error while stopping the Tomcat server, through shutdown hook", e);
}
}
}
});
}
}
/**
* Start the tomcat embedded server
*/
public void start() throws LifecycleException {
if(isRunning) {
LOG.warn("Tomcat server is already running @ port={}; ignoring the start", port);
return;
}
if(isInfo) LOG.info("Starting the Tomcat server @ port={}", port);
server.setAwait(true);
server.start();
isRunning = true;
}
/**
* Stop the tomcat embedded server
*/
public void stop() throws LifecycleException {
if(!isRunning) {
LOG.warn("Tomcat server is not running @ port={}", port);
return;
}
if(isInfo) LOG.info("Stopping the Tomcat server");
server.stop();
isRunning = false;
}
public boolean isRunning() {
return isRunning;
}
}
私もエラーに直面し、404
しばらく苦労しました。ログ ' INFO: No default web.xml
' を見て、私はそれを疑いました(それが警告であれば、簡単に見つけることができたはずです)。トリックは、Tomcat ( )で提供されるweb.xml
( rootContext.setDefaultWebXml("web.xml")
)を使用することです。その理由は、HTML、JS などの静的ファイルを提供する DefaultServlet が含まれているからです。を使用するか、サーブレットをコードに手動で登録してください。conf/web.xml
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
このプログラムの同じディレクトリにデフォルトを配置するか、正しい場所を指すことを忘れないでください。
シャットダウンフックはAntonio's answerから着想を得ていることに注意してください。
Jetty で Tomcat を使用する理由はいくつかあります。
ポイント#5は私の仕事で重要でした。たとえば、Tomcat を介して JSPWiki インスタンスに直接アクセスできますが、Jetty を使用すると完全にアクセスできなくなります。私は 2007 年にその解決策を求めましたが、まだ答えを聞いていません。だから私はついにあきらめて、Tomcat 6 を使い始めました。私は Glassfish と Grizzly を調べましたが、これまでのところ、Tomcat は (驚くほど) 最も安定しており、十分に文書化された Web コンテナーです (実際にはあまり語られていません)。
数か月前にこのスレッドを読んだ後、私はこのプロジェクトを書きました: spring-embedded-tomcat。Tomcat6 を Spring ベースのアプリケーションに埋め込むために使用できます。