Как встроить Tomcat 6? - PullRequest
       19

Как встроить Tomcat 6?

57 голосов
/ 12 марта 2009

В настоящее время я запускаю свои веб-приложения на Tomcat 6 в работе и хотел бы оценить работу Tomcat во встроенном режиме.

Есть ли хороший учебник или другой ресурс, помимо того, что находится в документации API ?

Ответы [ 6 ]

40 голосов
/ 13 марта 2009

Код говорит сам за себя. Смотрите фрагмент pom.xml и класс для запуска 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;
    }

}
16 голосов
/ 26 сентября 2011

Несмотря на то, что этот пост несколько устарел, я отвечаю на свой собственный ответ, так как он может сэкономить другое время

<code>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>
* & будет создан автоматически. Нам нужно подключить остальное к экземпляру {@link Embedded} * @param contextPath Контекстный путь для приложения * @param port Номер порта, который будет использоваться для встроенного сервера Tomcat * @param appBase Путь к файлам приложения (для веб-приложений на основе Maven, в общем: /src/main/) * @param shutdownHook Если true, регистрирует хук отключения сервера с помощью JVM. Это полезно для выключения сервера * в ошибочных случаях. * Исключения @throws * / public TomcatServer (String contextPath, int port, String appBase, логический shutdownHook) { if (contextPath == null || appBase == null || appBase.length () == 0) { бросить новое IllegalArgumentException («Путь к контексту или база приложения не должны быть нулевыми»); } if (! contextPath.startsWith ("/")) { contextPath = "/" + contextPath; } this.port = port; сервер = новый Embedded (); server.setName ( "TomcatEmbeddedServer"); Host localHost = server.createHost ("localhost", appBase); localHost.setAutoDeploy (ложь); 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 (двигатель); Соединитель соединитель = server.createConnector (localHost.getName (), порт, ложь); server.addConnector (разъем); // зарегистрируем отключение if (shutdownHook) { Runtime.getRuntime (). AddShutdownHook (new Thread () { public void run () { if (isRunning) { if (isInfo) LOG.info («Остановка сервера Tomcat через хук отключения»); пытаться { if (server! = null) { server.stop (); } } catch (LifecycleException e) { LOG.error («Ошибка при остановке сервера Tomcat через хук отключения», e); } } } }); } } / ** * Запустите встроенный сервер Tomcat * / public void start () создает исключение LifecycleException { if (isRunning) { LOG.warn («Сервер Tomcat уже работает @ port = {}; игнорирование запуска», порт); вернуть; } if (isInfo) LOG.info («Запуск сервера Tomcat @ port = {}», порт); server.setAwait (истина); server.start (); isRunning = true; } / ** * Остановите встроенный сервер Tomcat * / public void stop () выбрасывает LifecycleException { if (! isRunning) { LOG.warn («Сервер Tomcat не работает @ port = {}», порт); вернуть; } if (isInfo) LOG.info («Остановка сервера Tomcat»); server.stop (); isRunning = false; } public boolean isRunning () { возврат isRunning; } }

Я также столкнулся с ошибкой 404 и некоторое время боролся. Увидев журнал 'INFO: No default web.xml', я заподозрил его (если бы это было предупреждением, его было бы легко заметить) . Хитрость заключается в использовании web.xml (rootContext.setDefaultWebXml("web.xml")) , поставляемом с Tomcat (conf/web.xml) . Причина в том, что он включает DefaultServlet, который обслуживает статические файлы, такие как HTML, JS. Либо используйте web.xml, либо зарегистрируйте сервлет вручную в своем коде.

Использование

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

Не забудьте поместить web.xml по умолчанию в тот же каталог этой программы или указать правильное местоположение.

Следует отметить, что отключающий крюк основан на ответе Антонио .

11 голосов
/ 14 декабря 2009

Существует несколько причин, по которым можно использовать Tomcat вместо Jetty:

  1. Уже знаком с Tomcat
  2. Один разрабатывает веб-приложения, которые необходимо легко перенести в установку Tomcat
  3. Документация разработчика Jetty на самом деле более точная, чем у Tomcat (удивительно!)
  4. Получение ответов на вопросы в сообществе Jetty может иногда занимать годы, как в 2007 году. См. Embedded Jetty
  5. Важное замечание: После Jetty 6.1. * Каждое веб-приложение открывается в свою собственную JVM, поэтому, если вы пытаетесь получить программный доступ между автономным доступом и веб-приложением, ваша единственная надежда - через веб-API.
  6. Если это проблема для вас, Tomcat - это проект с открытым исходным кодом, интеллектуальная собственность которого принадлежит Apache Foundation, Jetty - с открытым исходным кодом, но принадлежит небольшой частной компании (Mortbay Consulting)

Пункт № 5 сыграл важную роль в моей работе. Например, я могу получить прямой доступ к экземпляру JSPWiki через Tomcat, но он совершенно недоступен при использовании Jetty. Я попросил решение этой проблемы в 2007 году и пока не услышал ответ. Поэтому я, наконец, сдался и начал использовать Tomcat 6. Я изучил Glassfish и Grizzly, но пока что Tomcat является (удивительно) самым стабильным и хорошо документированным веб-контейнером (который на самом деле мало что говорит).

2 голосов
/ 03 июля 2009

Это может помочь.

Если вы скачаете исходный пакет для Tomcat6.x, вы получите этот класс:

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

Пример использования класса Embedd: оболочка для остановки | запуска определенной установки Tomcat. (Я имею в виду, что вы можете настроить CATALINA_BASE для указания на существующую установку Tomcat).

Если вы скомпилируете это, вы можете запустить так:

java -D "catalina.base =% CATALINA_BASE%" -D "catalina.home =% CATALINA_HOME%" org.apache.catalina.startup. Начало каталины

Я пока не уверен, как изменить этот код для отключения сервера!

0 голосов
/ 11 июля 2013

Я думаю, что с Tomcat 7 или Jetty 9 встраивание проще. Здесь вы найдете хорошее введение: http://www.hascode.com/2013/07/embedding-jetty-or-tomcat-in-your-java-application/

0 голосов
/ 16 марта 2012

Прочитав эту ветку несколько месяцев назад, я написал этот проект: spring-embedded-tomcat . Его можно использовать для встраивания tomcat6 в приложения на основе Spring.

...