logo instalador for java tomcat tomcat6

instalador - tomcat for java 5



¿Cómo incrustar Tomcat 6? (6)

Creo que con Tomcat 7 o la incrustación en Jetty 9 es más fácil. Aquí encontrarás una buena introducción: http://www.hascode.com/2013/07/embedding-jetty-or-tomcat-in-your-java-application/

Actualmente estoy ejecutando mis webapps en Tomcat 6 en producción, y me gustaría evaluar la ejecución de Tomcat en modo incrustado.

¿Hay un buen tutorial u otro recurso además de lo que está en la documentación de la API ?


Después de leer este hilo hace algunos meses, escribí este proyecto: spring-embedded-tomcat . Se puede usar para insertar tomcat6 en aplicaciones basadas en Spring.


El código habla por sí mismo. Vea el fragmento pom.xml y la clase para ejecutar tomcat.

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


Esto podría ayudar.

Si descarga el paquete fuente para Tomcat6.x, obtiene esta clase:

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

Lo cual es un ejemplo de cómo usar la clase Embedd: es un shell para detener | iniciar una instalación específica de Tomcat. (Me refiero a que puede configurar CATALINA_BASE para que apunte a una instalación existente de Tomcat).

Si compilas esto, puedes ejecutarlo así:

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

¡Sin embargo, todavía no estoy seguro de cómo alterar este código para apagar el servidor!


Hay una serie de razones por las cuales uno podría usar Tomcat sobre Jetty:

  1. Uno ya está familiarizado con Tomcat
  2. Una de ellas es el desarrollo de aplicaciones web que necesitan ser transportadas fácilmente a una instalación de Tomcat
  3. La documentación del desarrollador Jetty es en realidad más espeluznante que la de Tomcat (¡increíble!)
  4. Recibir respuestas a preguntas en la comunidad Jetty a veces puede tomar años, como en 2007. ver Incrustar Embarcadero
  5. Importante: después de Jetty 6.1. *, Cada aplicación web se abre en su propia JVM, por lo que si intenta obtener acceso programático entre su acceso independiente y su aplicación web, su única esperanza es a través de una API web.
  6. Si se trata de un problema para usted, Tomcat es un proyecto de código abierto cuya propiedad intelectual pertenece a la Apache Foundation, Jetty es de código abierto pero es propiedad de una pequeña empresa privada (Mortbay Consulting)

El punto # 5 ha sido importante en mi trabajo. Por ejemplo, puedo obtener acceso directo a una instancia de JSPWiki a través de Tomcat, pero es completamente inaccesible cuando uso Jetty. Pedí una solución para eso en 2007 y todavía no escuché una respuesta. Así que finalmente me di por vencido y comencé a usar Tomcat 6. He investigado Glassfish y Grizzly, pero hasta ahora Tomcat es (asombrosamente) el contenedor web más estable y mejor documentado (que no dice mucho en realidad).


Aunque esta publicación es algo que envejeció, estoy respondiendo mi propia respuesta, ya que podría ahorrarme otro tiempo.

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

También enfrenté el error 404 y tuve problemas. Al ver el registro '' INFO: No default web.xml '', lo sospeché (si eso es una advertencia, hubiera sido fácil detectarlo) . El truco es usar el web.xml ( rootContext.setDefaultWebXml("web.xml") ) provisto con Tomcat ( conf/web.xml ) . El motivo es que incluye DefaultServlet, que sirve a los archivos estáticos como HTML, JS. Utilice el web.xml o registre el servlet manualmente en su código.

Uso :

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

No olvide colocar el web.xml predeterminado en el mismo directorio de este programa o señalar la ubicación correcta.

Cabe señalar que el gancho de cierre está inspirado en la respuesta de Antonio .