Встраивание Tomcat и выдача запросов на развернутое приложение - PullRequest
1 голос
/ 19 января 2010

ОК, я полностью застрял. Я хочу запустить Tomcat во встроенном режиме, чтобы можно было протестировать приложение, не запуская сервер в отдельном процессе. Мне не хватает чего-то простого, глупого и важного, и мне нужна твоя помощь, чтобы увидеть это.

Этот тест не пройден с ошибкой HTTP 400, Bad Request. Я пробовал MemoryProtocolHandler, context.invoke (), ... Я не знаю, что делать. Может быть, вы видите что-то простое.

package ca.jbrains.jsfunit.learning.test;

import org.apache.catalina.Container;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.connector.Request;
import org.apache.catalina.realm.MemoryRealm;
import org.apache.catalina.startup.Embedded;
import org.junit.After;
import org.junit.Test;

import com.gargoylesoftware.htmlunit.WebClient;

public class LearnEmbeddedTomcatTest {
    private Embedded embedded;
    private Container host;
    private Engine engine;

    @Test
    public void deploySampleApplicationFromFileSystem() throws Exception {
        String tomcatPath = "/Users/jbrains/ThirdParty/apache-tomcat-5.5.28-embed";

        // Create an embedded server
        embedded = new Embedded();
        embedded.setCatalinaHome(tomcatPath);
        embedded.setRealm(new MemoryRealm());

        // Create an engine
        engine = embedded.createEngine();
        engine.setDefaultHost("localhost");

        // Create a default virtual host
        host = embedded.createHost("localhost", tomcatPath + "/webapps");
        engine.addChild(host);

        // Create an application context
        Context context = embedded.createContext("TddJsfWeb", tomcatPath
                + "/webapps/TddJsfWeb");
        host.addChild(context);

        // Install the assembled container hierarchy
        embedded.addEngine(engine);

        // Assemble and install a default HTTP connector
        Connector connector = embedded.createConnector("localhost", 8080,
                "http");
        embedded.addConnector(connector);

        // Start the embedded server
        embedded.setAwait(true);
        embedded.start();

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

Распакованный .war определенно находится на /Users/jbrains/ThirdParty/apache-tomcat-5.5.28-embed/webapps/TddJsfWeb/..., а static.xhtml находится в корне распакованной папки .war.

Пожалуйста, пожалуйста, покажи мне, какой я глупый. Благодаря.

Ответы [ 3 ]

1 голос
/ 19 января 2010

У меня был похожий опыт с Tomcat. Вместо этого я использовал Jetty - управлять им было гораздо проще с точки зрения кода.

0 голосов
/ 06 сентября 2010

Если 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() }); ... Третий вариант - изучить гораздо более простой контейнер, чем Tomcat или Jetty, например, Winstone: http://winstone.sourceforge.net/

0 голосов
/ 19 января 2010

Я бы хотел секунду Причал через Tomcat для этого .. Для запуска Пристани все что мне нужно:

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);
               }
       }
}
...