2009-03-12 7 views
55

私は現在、本番環境でTomcat 6でWebアプリケーションを実行していますが、Tomcatが組み込みモードで動作しているか評価したいと考えています。HowtoはTomcat 6を埋め込んでいますか?

api documentationに記載されているもの以外に、良いチュートリアルやその他のリソースはありますか?

+0

Embed Jettyしかし、[Tomcat-embed](http://code.google.com/p/tomcat-embed/)があります。 – stepancheg

+0

ポインタありがとう。しかし、これは完全ではなく、積極的に開発され、維持されているようには見えません。すべてのコミットは2008年5月11日付けであり、ログメッセージの1つは「完全ではありません」と呼びます。 –

+0

このブログの記事を見る価値がある:[埋め込みTomcat 7](http://www.copperykeenclaws.com/embedding-tomcat-7/) –

答えて

38

コードはそれ自身のために話す。 Tomcatを実行するには、pom.xmlスニペットとクラスを参照してください。

<dependency> 
     <groupId>org.apache.tomcat</groupId> 
     <artifactId>catalina</artifactId> 
     <version>6.0.18</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.tomcat</groupId> 
     <artifactId>coyote</artifactId> 
     <version>6.0.18</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.tomcat</groupId> 
     <artifactId>jasper</artifactId> 
     <version>6.0.18</version> 
     <scope>test</scope> 
    </dependency> 


public class RunWebApplicationTomcat { 

    private String path = null; 
    private Embedded container = null; 
    private Log logger = LogFactory.getLog(getClass()); 

    /** 
    * The directory to create the Tomcat server configuration under. 
    */ 
    private String catalinaHome = "tomcat"; 

    /** 
    * The port to run the Tomcat server on. 
    */ 
    private int port = 8089; 

    /** 
    * The classes directory for the web application being run. 
    */ 
    private String classesDir = "target/classes"; 

    /** 
    * The web resources directory for the web application being run. 
    */ 
    private String webappDir = "mywebapp"; 

    /** 
    * Creates a single-webapp configuration to be run in Tomcat on port 8089. If module name does 
    * not conform to the 'contextname-webapp' convention, use the two-args constructor. 
    * 
    * @param contextName without leading slash, for example, "mywebapp" 
    * @throws IOException 
    */ 
    public RunWebApplicationTomcat(String contextName) { 
     Assert.isTrue(!contextName.startsWith("/")); 
     path = "/" + contextName; 
    } 

    /** 
    * Starts the embedded Tomcat server. 
    * 
    * @throws LifecycleException 
    * @throws MalformedURLException if the server could not be configured 
    * @throws LifecycleException if the server could not be started 
    * @throws MalformedURLException 
    */ 
    public void run(int port) throws LifecycleException, MalformedURLException { 
     this.port = port; 
     // create server 
     container = new Embedded(); 
     container.setCatalinaHome(catalinaHome); 
     container.setRealm(new MemoryRealm()); 

     // create webapp loader 
     WebappLoader loader = new WebappLoader(this.getClass().getClassLoader()); 

     if (classesDir != null) { 
      loader.addRepository(new File(classesDir).toURI().toURL().toString()); 
     } 

     // create context 
     // TODO: Context rootContext = container.createContext(path, webappDir); 
     Context rootContext = container.createContext(path, webappDir); 
     rootContext.setLoader(loader); 
     rootContext.setReloadable(true); 

     // create host 
     // String appBase = new File(catalinaHome, "webapps").getAbsolutePath(); 
     Host localHost = container.createHost("localHost", new File("target").getAbsolutePath()); 
     localHost.addChild(rootContext); 

     // create engine 
     Engine engine = container.createEngine(); 
     engine.setName("localEngine"); 
     engine.addChild(localHost); 
     engine.setDefaultHost(localHost.getName()); 
     container.addEngine(engine); 

     // create http connector 
     Connector httpConnector = container.createConnector((InetAddress) null, port, false); 
     container.addConnector(httpConnector); 

     container.setAwait(true); 

     // start server 
     container.start(); 

     // add shutdown hook to stop server 
     Runtime.getRuntime().addShutdownHook(new Thread() { 
      public void run() { 
       stopContainer(); 
      } 
     }); 
    } 
    /** 
    * Stops the embedded Tomcat server. 
    */ 
    public void stopContainer() { 
     try { 
      if (container != null) { 
       container.stop(); 
      } 
     } catch (LifecycleException exception) { 
      logger.warn("Cannot Stop Tomcat" + exception.getMessage()); 
     } 
    } 

    public String getPath() { 
     return path; 
    } 

    public void setPath(String path) { 
     this.path = path; 
    } 

    public static void main(String[] args) throws Exception { 
     RunWebApplicationTomcat inst = new RunWebApplicationTomcat("mywebapp"); 
     inst.run(8089); 
    } 

    public int getPort() { 
     return port; 
    } 

} 
+1

私はこの実行を得ることができません、唯一の404を取得..私は何かが不足していますか? – falstro

+0

catalinaHome、port、classesDir、webappDirの属性を適宜変更しましたか? – Antonio

2

これは役に立ちます。

あなたはTomcat6.xのソースパッケージをダウンロードした場合、あなたはこのクラスを取得:

Embeddクラスの使用方法の一例である

http://tomcat.apache.org/tomcat-6.0-doc/api/org/apache/catalina/startup/Catalina.html#main(java.lang.String[])

:停止するそのシェルを|特定を開始Tomcatのインストール。 (つまり、既存のTomcatインストールを指すようにCATALINA_BASEを設定することができます)。

あなたはこのように実行することができ、このコンパイルする場合:

のjava -D "catalina.base =%CATALINA_BASE%" -D "catalina.home =%CATALINA_HOME%" org.apache.catalina.startup.Catalinaをstart

このコードを変更してサーバをシャットダウンする方法がわかりません!

10

は、1つの桟橋上でTomcatを使用する理由はいくつかあります:

  1. 一つはTomcatですでに精通している
  2. 一つ簡単にTomcatのインストールに輸送する必要があるWebアプリケーションを開発している
  3. Jettyの開発者のドキュメントは実際にはTomcatのものよりもスポンサーです(驚くべきことです)
  4. Jettyコミュニティで回答するには、2007年のように何年もかかることがあります。Embedding Jetty
  5. 重要: Jetty 6.1。*の後、各Webアプリケーションが独自のJVMに開きます。したがって、スタンドアロンアクセスとWebアプリケーションの間でプログラム的にアクセスしようとする場合、唯一の希望はWeb API経由です。
  6. 、それはあなたのための問題だ場合は、Tomcatが知的財産は、Apache財団が所有しているオープンソースプロジェクトである、桟橋は、オープンソースが、小さな民間企業が所有している(Mortbayコンサルティング)

ポイント#5です私の仕事で重要だった。たとえば、Tomcatを使用してJSPWikiインスタンスに直接アクセスできますが、Jettyを使用すると完全にアクセスできません。私は2007年にその解決策を尋ねましたが、まだ答えを聞いていません。私はGlassfishとGrizzlyに目を通しましたが、これまでTomcatは最も安定していて、よく文書化されたWebコンテナです(これはあまり意味がありません)。

+3

"各Webアプリケーションが独自のJVMにオープンします":この情報はどこから入手できましたか?私はこれが正確であるとは思わない。 – Bruno

+0

もっとクラスローダーのようなものです。伝えるのは難しい。 –

+3

私はかなり自らのJVMでwebappsが開かないことを確信しています。彼らはデフォルトで別のクラスローダーを使用します。あなたが望むクラスローダーの振る舞いを得るには 'webapp.setParentLoaderPriority(true);'を使用してください - これはJettyのドキュメントにあると思います。 –

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'を見ることによって、私はそれが(それが警告であれば、見つけやすいだろう)と疑った。rootContext.setDefaultWebXml("web.xml")をTomcat conf/web.xmlと一緒に使用して使用しています。その理由は、HTML、JSのような静的ファイルを扱うDefaultServletが含まれているからです。 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からインスピレーションを受けています。

+0

私はあなたのサンプルを試してみました、アプリケーションが上がって、私は春が初期化されていますが、私は、私のjspのためのマッピングが見つからなかったという春のエラーメッセージを受け取ります。 – Thiago

+0

マイナーアップデート: 'org.apache.catalina.startup.Embedded'は推奨されておらず、代わりに' org.apache.catalina.startup.Tomcat'を使うことをお勧めします。この変更を行うと、コードを実行可能にするために多くのチェーン変更が行われます。 – Athafoud

0

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

関連する問題