2010-01-19 9 views
1

OK, je suis complètement bloqué. Je veux lancer Tomcat en mode embarqué pour pouvoir tester une application sans exécuter le serveur dans un processus séparé. Il me manque quelque chose de simple, de stupide et d'important, et j'ai besoin de votre aide pour le voir.Incorporation de Tomcat et émission de demandes à l'application déployée

Ce test échoue avec une erreur HTTP 400, demande incorrecte. J'ai essayé MemoryProtocolHandler, context.invoke(), ... je ne sais pas quoi faire. Peut-être que vous voyez quelque chose de simple.

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

Le .war décompressé est sans aucun doute à /Users/jbrains/ThirdParty/apache-tomcat-5.5.28-embed/webapps/TddJsfWeb/... et static.xhtml est à la racine du dossier .war décompressé.

S'il vous plaît, s'il vous plaît, montrez-moi à quel point je suis stupide. Merci.

Répondre

0

Je voudrais second jetée sur Tomcat pour ce .. Pour exécuter Jetty tout ce que je besoin est:

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); 
       } 
     } 
} 
+0

@Tim: Merci pour l'échantillon de code - Je n'en ai pas eu un en main – gpampara

+0

Je suis allé sur cette route et suis allé beaucoup plus loin. Maintenant, j'essaie d'utiliser JSFUnit avec Jetty et ça ne fonctionne pas exactement comme prévu. Je vais devoir comprendre plus. –

+0

Utilisez-vous Jasper? (Ma connaissance de JSF s'arrête là ..;)) – Tim

1

J'ai eu une expérience similaire avec Tomcat. J'ai fini par utiliser Jetty à la place - était beaucoup plus simple à gérer du point de vue du code.

+0

J'étais inquiet à ce sujet. Je voulais utiliser Jetty en premier lieu, mais comme je travaille avec quelqu'un qui veut utiliser Tomcat, je suis allé le chercher. –

0

Si la jetée fonctionne bien pour vous, alors c'est génial, mais si vous voulez creuser Un peu plus loin dans Tomcat, vous pouvez parcourir vos applications avant d'émettre votre demande et voir si elles sont disponibles.

 
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() }); 
... 
Une troisième option est de regarder dans un récipient bien que Tomcat ou du Simplon Jetty, comme Winstone: http://winstone.sourceforge.net/

Questions connexes