58

現在、本番環境のTomcat 6でWebアプリケーションを実行していますが、組み込みモードでのTomcatの実行を評価したいと思います。

APIドキュメントにあるもの以外に、優れたチュートリアルやその他のリソースはありますか?

4

6 に答える 6

16

この投稿はかなり古くなっていますが、他の人の時間を節約できるので、私は自分の答えに答えています

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&gt
 *            <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.xmlweb.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から着想を得ていることに注意してください。

于 2011-09-26T12:34:02.657 に答える
12

Jetty で Tomcat を使用する理由はいくつかあります。

  1. 1 つは既に Tomcat に精通している
  2. 1 つは、Tomcat インストールに簡単に転送する必要がある Web アプリケーションの開発です。
  3. Jetty の開発者向けドキュメントは、実際には Tomcat のものよりもむらがあります (すごい!)
  4. Jetty コミュニティで質問に答えてもらうには、2007 年のように何年もかかることがあります。Jetty の埋め込みを参照してください。
  5. 重要: Jetty 6.1.* 以降、各 Web アプリケーションは独自の JVM で開くため、スタンドアロン アクセスと Web アプリの間でプログラムによるアクセスを取得しようとしている場合、Web API を使用するしかありません。
  6. それがあなたにとって問題である場合、Tomcat は知的財産が Apache Foundation によって所有されているオープン ソース プロジェクトであり、Jetty はオープン ソースですが小さな民間企業 (Mortbay Consulting) によって所有されています。

ポイント#5は私の仕事で重要でした。たとえば、Tomcat を介して JSPWiki インスタンスに直接アクセスできますが、Jetty を使用すると完全にアクセスできなくなります。私は 2007 年にその解決策を求めましたが、まだ答えを聞いていません。だから私はついにあきらめて、Tomcat 6 を使い始めました。私は Glassfish と Grizzly を調べましたが、これまでのところ、Tomcat は (驚くほど) 最も安定しており、十分に文書化された Web コンテナーです (実際にはあまり語られていません)。

于 2009-12-14T04:01:02.690 に答える
0

数か月前にこのスレッドを読んだ後、私はこのプロジェクトを書きました: spring-embedded-tomcat。Tomcat6 を Spring ベースのアプリケーションに埋め込むために使用できます。

于 2012-03-16T15:44:24.293 に答える