1

OK、私は完全に立ち往生しています。別のプロセスでサーバーを実行せずにアプリケーションをテストできるように、組み込みモードで Tomcat を実行したいと考えています。単純で愚かで重要なものが欠けています。それを確認するにはあなたの助けが必要です。

このテストは、HTTP エラー 400、Bad Request で失敗します。MemoryProtocolHandler、context.invoke() などを試しましたが、どうすればよいかわかりません。多分あなたは単純なものを見ます。

パッケージ ca.jbrains.jsfunit.learning.test;

org.apache.catalina.Container をインポートします。
org.apache.catalina.Context をインポートします。
org.apache.catalina.Engine をインポートします。
org.apache.catalina.connector.Connector をインポートします。
org.apache.catalina.connector.Request をインポートします。
org.apache.catalina.realm.MemoryRealm をインポートします。
org.apache.catalina.startup.Embedded をインポートします。
org.junit.After をインポートします。
org.junit.Test をインポートします。

com.gargoylesoftware.htmlunit.WebClient をインポートします。

public class LearnEmbeddedTomcatTest {
    プライベート 埋め込み 埋め込み;
    プライベート コンテナ ホスト。
    プライベート エンジン エンジン;

    @テスト
    public void deploySampleApplicationFromFileSystem() は例外をスローします {
        String tomcatPath = "/Users/jbrains/ThirdParty/apache-tomcat-5.5.28-embed";

        // 組み込みサーバーを作成します
        埋め込み = 新しい埋め込み ();
        embedded.setCatalinaHome(TomcatPath);
        embedded.setRealm(新しいMemoryRealm());

        // エンジンを作成する
        エンジン = embedded.createEngine();
        engine.setDefaultHost("localhost");

        // デフォルトの仮想ホストを作成します
        ホスト = embedded.createHost("localhost", tomcatPath + "/webapps");
        engine.addChild(ホスト);

        // アプリケーション コンテキストを作成します
        コンテキスト context = embedded.createContext("TddJsfWeb", tomcatPath
                + "/webapps/TddJsfWeb");
        host.addChild(コンテキスト);

        // 組み立てられたコンテナ階層をインストールします
        embedded.addEngine(エンジン);

        // デフォルトの HTTP コネクタを組み立ててインストールする
        コネクタ コネクタ = embedded.createConnector("localhost", 8080,
                "http");
        embedded.addConnector(コネクタ);

        // 組み込みサーバーを起動します
        embedded.setAwait(真);
        埋め込み.start();

        WebClient webClient = new WebClient();
        webClient.getPage("http://localhost:8080/TddJsfWeb/static.xhtml");
    }
}

解凍された .war は、解凍された .war フォルダーのルートにあります/Users/jbrains/ThirdParty/apache-tomcat-5.5.28-embed/webapps/TddJsfWeb/...static.xhtml

どうか、どうか、私がどれほど愚かなのか見せてください。ありがとう。

4

3 に答える 3

1

私はTomcatで同様の経験をしました。代わりに Jetty を使用することになりました。コードの観点からは、管理がはるかに簡単でした。

于 2010-01-19T13:48:43.097 に答える
0

このために、Tomcat よりも Jettyを2 番目にしたいと思います。Jetty を実行するには、次のものが必要です。

import java.awt.Desktop;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

import org.mortbay.jetty.Connector;
import org.mortbay.jetty.Server;
import org.mortbay.jetty.bio.SocketConnector;
import org.mortbay.jetty.webapp.WebAppContext;

public class StartJetty {
       public static void main(String[] args) throws Exception {
               Server server = new Server();
               SocketConnector connector = new SocketConnector();
               // Set some timeout options to make debugging easier.
               connector.setMaxIdleTime(1000 * 60 * 60);
               connector.setSoLingerTime(-1);
               connector.setPort(8081);
               server.setConnectors(new Connector[] { connector });

               WebAppContext bb = new WebAppContext();
               bb.setServer(server);
               bb.setContextPath("/");
               bb.setWar("src/main/webapp");
               server.addHandler(bb);

               try {
                       System.out.println(">>> STARTING EMBEDDED JETTY SERVER, PRESS ANY
KEY TO STOP");
                       server.start();

                       //Launch browser
                       if (Desktop.isDesktopSupported())
                               if (Desktop.getDesktop().isSupported(Desktop.Action.BROWSE))
                                       try {
                                               Desktop.getDesktop().browse(new URI("http://localhost:8081/"));
                                       }
                                       catch (IOException ioe) {
                                               ioe.printStackTrace();
                                       }
                                       catch (URISyntaxException use) {
                                               use.printStackTrace();
                                       }

                       System.in.read();
                       System.out.println(">>> STOPPING EMBEDDED JETTY SERVER");
                       server.stop();
                       server.join();
               }
               catch (Exception e) {
                       e.printStackTrace();
                       System.exit(100);
               }
       }
}
于 2010-01-19T14:03:32.900 に答える
0

Jetty がうまく機能しているのであれば、それは素晴らしいことですが、Tomcat をもう少し深く掘り下げたい場合は、リクエストを発行する前にアプリを一通り見て、それらが利用可能かどうかを確認できます。

for (Container cont : host.findChildren()) {
    if (cont instanceof StandardContext) {
        StandardContext ctx = (StandardContext) cont;
        ServletContext servletContext = ctx.getServletContext();
        log.debug("Context initialized: {}", servletContext.getContextPath());
        String prefix = servletContext.getRealPath("/");
        try {
            if (ctx.resourcesStart()) {
                log.debug("Resources started");
            }
            log.debug("Context - available: {} privileged: {}, start time: {}, reloadable: {}", new Object[] { ctx.getAvailable(), ctx.getPrivileged(), ctx.getStartTime(), ctx.getReloadable() });
...
3 番目のオプションは、Tomcat や Jetty よりもはるかに単純なコンテナー (Winstone など) を調べることです: http://winstone.sourceforge.net/

于 2010-09-06T16:52:23.503 に答える