Comment intégrer Tomcat 6?

J’exécute actuellement mes applications Web sur Tomcat 6 en production et souhaite évaluer l’exécution de Tomcat en mode intégré.

Existe-t-il un bon tutoriel ou une autre ressource en plus de la documentation de l’ API ?

Le code parle de lui-même. Voir l’extrait de code pom.xml et la classe pour exécuter tomcat.

 org.apache.tomcat catalina 6.0.18 test   org.apache.tomcat coyote 6.0.18 test   org.apache.tomcat jasper 6.0.18 test  public class RunWebApplicationTomcat { private Ssortingng path = null; private Embedded container = null; private Log logger = LogFactory.getLog(getClass()); /** * The directory to create the Tomcat server configuration under. */ private Ssortingng catalinaHome = "tomcat"; /** * The port to run the Tomcat server on. */ private int port = 8089; /** * The classes directory for the web application being run. */ private Ssortingng classesDir = "target/classes"; /** * The web resources directory for the web application being run. */ private Ssortingng 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(Ssortingng 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().toSsortingng()); } // create context // TODO: Context rootContext = container.createContext(path, webappDir); Context rootContext = container.createContext(path, webappDir); rootContext.setLoader(loader); rootContext.setReloadable(true); // create host // Ssortingng 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 Ssortingng getPath() { return path; } public void setPath(Ssortingng path) { this.path = path; } public static void main(Ssortingng[] args) throws Exception { RunWebApplicationTomcat inst = new RunWebApplicationTomcat("mywebapp"); inst.run(8089); } public int getPort() { return port; } } 

Bien que ce post soit quelque peu vieilli, je réponds à ma propre réponse car cela pourrait faire gagner du temps

 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: * 
 *  *  *  *  *  *  *  *

* & 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: /src/main/) * @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(Ssortingng contextPath, int port, Ssortingng 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; } }

J’ai aussi fait face à l’erreur 404 et j’ai eu du mal pendant un certain temps. En voyant le journal ‘ INFO: No default web.xml ‘, je le soupçonnais (si c’est un avertissement, il aurait été facile à repérer) . L’astuce rootContext.setDefaultWebXml("web.xml") utiliser le rootContext.setDefaultWebXml("web.xml") web.xml ( rootContext.setDefaultWebXml("web.xml") ) fourni avec Tomcat ( conf/web.xml ) . La raison en est que cela inclut le DefaultServlet, qui sert les fichiers statiques comme HTML, JS. Utilisez le fichier web.xml ou enregistrez le servlet manuellement dans votre code.

Utilisation :

 // start the server at http://localhost:8080/myapp TomcatServer server = new TomcatServer("myapp", 8080, "/src/main/", true); server.start(); // ..... server.stop(); 

N’oubliez pas de placer le web.xml par défaut dans le même répertoire de ce programme ou d’indiquer l’emplacement correct.

Il convient de noter que le crochet d’arrêt est inspiré de la réponse d’ Antonio .

Il y a un certain nombre de raisons pour lesquelles on pourrait utiliser Tomcat sur Jetty:

  1. On est déjà familier avec Tomcat
  2. L’une consiste à développer des applications Web qui doivent être facilement transscopes vers une installation Tomcat.
  3. La documentation du développeur Jetty est en fait plus épineuse que celle de Tomcat (incroyable!)
  4. Obtenir des réponses aux questions dans la communauté Jetty peut parfois prendre des années, comme en 2007. Voir Embedded Jetty
  5. Important: Après Jetty 6.1. *, Chaque application Web s’ouvre dans sa propre JVM. Par conséquent, si vous essayez d’accéder par programmation à votre access autonome et à votre application Web, votre seul espoir réside dans une API Web.
  6. Si c’est un problème pour vous, Tomcat est un projet open source dont la propriété intellectuelle appartient à Apache Foundation, Jetty est open source mais appartient à une petite société privée (Mortbay Consulting)

Le point 5 a été important dans mon travail. Par exemple, je peux accéder directement à une instance JSPWiki via Tomcat, mais celle-ci est totalement inaccessible lors de l’utilisation de Jetty. J’ai demandé une solution à cela en 2007 et je n’ai pas encore reçu de réponse. J’ai finalement abandonné et commencé à utiliser Tomcat 6. J’ai étudié Glassfish et Grizzly, mais jusqu’à présent, Tomcat est (étonnamment) le conteneur Web le plus stable et le mieux documenté (ce qui n’est pas vraiment le cas).

Cela pourrait aider.

Si vous téléchargez le paquet source pour Tomcat6.x, vous obtenez cette classe:

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

Ce qui est un exemple d’utilisation de la classe Embedd: c’est un shell pour arrêter | démarrer une installation Tomcat spécifique. (Je veux dire que vous pouvez configurer CATALINA_BASE pour pointer sur une installation Tomcat existante).

Si vous comstackz cela, vous pouvez exécuter comme ceci:

java -D “catalina.base =% CATALINA_BASE%” -D “catalina.home =% CATALINA_HOME%” org.apache.catalina.startup.Catalina start

Je ne suis pas sûr de savoir comment modifier ce code pour arrêter le serveur encore!

Après avoir lu ce sujet il y a quelques mois, j’ai écrit ce projet: spring-embedded-tomcat . Il peut être utilisé pour intégrer tomcat6 dans des applications basées sur Spring.

Je pense qu’avec Tomcat 7 ou Jetty 9, l’intégration est plus facile. Vous trouverez ici une belle introduction: http://www.hascode.com/2013/07/embedding-jetty-or-tomcat-in-your-java-application/