Montag, Januar 20, 2020

Wie zum einbetten von Tomcat 6?

Ich bin derzeit mit meinem webapps des Tomcat-6 in der Produktion, und die möchte bewerten ausführen von Tomcat im embedded-Modus.

Gibt es ein gutes tutorial oder eine andere Ressource außer dem, was in der api-Dokumentation?

  • Jeder Grund für die Verwendung von Tomcat eher als Anlegestelle, die ist gut dokumentiert, die für diesen Anwendungsfall und Häufig verwendeten embedded? Wenn Sie einfach nur auf der Suche für ein Servlet-container, die Sie einbetten können, Jetty tut dies bereitwillig.
  • Einbetten von Steg statt. Es ist jedoch tomcat-einbetten.
  • Danke für den Zeiger. Dies bedeutet jedoch nicht so Aussehen, wie es abgeschlossen ist, aktiv weiterentwickelt oder gepflegt. Alle commits sind vom Mai 11, 2008, und einer der log-Meldungen nennt es „längst nicht abgeschlossen“.
  • Lohnt einen Blick in dieses blog post: Einbetten Tomcat 7
  • wie kann ein geschlossenes als nicht Konstruktive Frage haben 43 upvotes!

6 Kommentare

  1. 40

    Code spricht für sich selbst. Sehen pom.xml snippet und die Klasse zum ausführen von 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;
        }
    
    }
    • Ich bin nicht in der Lage, diese Ausführung zu erhalten, nur immer 404.. Bin ich etwas fehlt?
    • Hast du die Attribute verändern catalinaHome, port, classesDir, den Ordner “ webappdir entsprechend?
  2. 16

    Aber dieser Beitrag ist, was einige im Alter, ich m, die Beantwortung meiner eigenen Antwort, wie Sie sparen könnten einige andere “ Zeit

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

    Ich auch angesichts der 404 Fehler und kämpfte einige Zeit. Sehen die log ‚INFO: No default web.xml‚, ich vermutete es (wenn das eine Warnung wäre schon leicht zu erkennen). Der trick wird mit der web.xml ( rootContext.setDefaultWebXml("web.xml") ) geliefert mit Tomcat (conf/web.xml). Der Grund dafür ist, enthält es das DefaultServlet, die dazu dient die statische Dateien, die gerne HTML, JS. Entweder verwenden Sie die web.xml oder Registrierung der servlet manuell in Ihrem code.

    Nutzung:

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

    Nicht vergessen, die Standard – web.xml im selben Verzeichnis wie das Programm oder den richtigen Speicherort.

    Es sollte angemerkt werden, dass der shutdown-hook ist inspiriert von Antonio ‚ s Antwort.

    • Ich habe versucht, Ihr Beispiel, meine Bewerbung geht nach oben, ich sehe Frühjahr zuerst entsprechend formatiert, aber wenn ich versuche, auf meine Bewerbung, ich bekomme Frühjahr Fehlermeldungen, die sagen, dass keine Zuordnungen gefunden wurden, für meine jsps.
    • Ein kleines update: Die org.apache.catalina.startup.Embedded ist veraltet und wird empfohlen, um org.apache.catalina.startup.Tomcat statt. Diese änderung viele Kette änderungen Folgen werden, um den code lauffähig.
  3. 11

    Gibt es eine Reihe von Gründen, warum man Tomcat über Steg:

    1. Ist man schon vertraut mit Tomcat
    2. Ist die Entwicklung von web-Anwendungen problemlos transportiert werden, um eine Tomcat-installation
    3. Die Jetty-Entwickler-Dokumentation ist eigentlich spottier als Tomcat (erstaunlich!)
    4. Erste Fragen beantwortet … in der Jetty-community kann manchmal Jahre dauern, wie im Jahr 2007. sehen Embedding Jetty
    5. Wichtig: Nach Jetty 6.1.*, jede web-Anwendung öffnet sich in seiner eigenen JVM, so, wenn Sie versuchen, um den programmgesteuerten Zugriff zwischen Ihrem eigenständigen Zugang und Ihre web-app, Ihre einzige Hoffnung ist über eine web-API.
    6. Wenn es ein Problem für Sie, Tomcat ist eine open-source-Projekt, die geistiges Eigentum ist Eigentum der Apache Foundation, Jetty ist open-source, aber im Besitz von einer kleinen privaten Firma (Mortbay Consulting)

    Punkt #5 ist schon wichtig in meiner Arbeit. Ich kann zum Beispiel den direkten Zugang zu einer JSPWiki-Instanz über die Tomcat, aber es ist völlig unzugänglich, wenn mit Steg. Ich fragte nach einer Lösung, die im Jahr 2007 und haben noch nicht gehört, eine Antwort. Also ich gab schließlich auf und begann mit Tomcat 6. Ich habe mir in Glassfish und Grizzly, aber so weit Tomcat ist (erstaunlicherweise) die stabile und gut dokumentierte web-container (was nicht viel aussagt wirklich).

    • „jeder web-Anwendung öffnet sich in seiner eigenen JVM“: wo hast du diese Informationen? Ich bezweifle, dass diese richtig ist.
    • Klingt mehr wie ein classloader Sache. Schwer zu sagen.
    • Ich bin ziemlich sicher, dass webapps tun nicht öffnen Sie in Ihrer eigenen JVM. Sie verwenden separaten classloadern standardmäßig. Um die classloader Verhalten, die Sie möchten, verwenden Sie einfach webapp.setParentLoaderPriority(true); – ich denke, das ist in der Jetty-Dokumentation.
    • Ich habe verwendet, Tomcat, Jetty, und Grizzly all in production und so ziemlich einverstanden mit allem, was gesagt wurde, in dieser Antwort
  4. 2

    Dies könnte helfen.

    Wenn Sie die Quelle download-Paket für Tomcat6.x, erhalten Sie diese Klasse:

    http://tomcat.apache.org/tomcat-6.0-doc/api/org/apache/catalina/startup/Catalina.html#main(java.lang.String%5B%5D)

    Ist ein Beispiel, wie die Embedd-Klasse: eine shell zu stoppen|starten, einen bestimmten Tomcat-installation. (Ich meine, Sie können bis CATALINA_BASE auf einem vorhandenen Tomcat-installation).

    Wenn Sie kompilieren diese können Sie ausführen, wie diese:

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

    Ich bin mir nicht sicher, wie Sie zu ändern Sie diesen code, um den server Herunterfahren noch obwohl!

Kostenlose Online-Tests