当前位置:  开发笔记 > 编程语言 > 正文

如何嵌入Tomcat 6?

如何解决《如何嵌入Tomcat6?》经验,为你挑选了3个好方法。

我目前正在生产Tomcat 6上运行我的webapps,并且想评估在嵌入模式下运行Tomcat.

除了api文档中的内容之外,还有一个很好的教程或其他资源吗?



1> Antonio..:

代码说明了一切.请参阅pom.xml代码段和运行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 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;
    }

}



2> manikanta..:

虽然这篇文章有些陈旧,但我回答了自己的答案,因为它可以节省其他时间

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

我也遇到了这个404错误并且挣扎了一段时间.通过查看日志' INFO: No default web.xml',我怀疑它(如果这是一个警告,很容易发现).正使用招web.xml (rootContext.setDefaultWebXml("web.xml"))使用Tomcat提供(conf/web.xml).原因是,它包含DefaultServlet,它提供像HTML,JS这样的静态文件.web.xml在代码中手动使用或注册servlet.

用法:

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

不要忘记将默认值web.xml放在此程序的同一目录中或指向正确的位置.

值得注意的是,关闭钩子的灵感来自安东尼奥的答案.



3> 小智..:

为什么人们可以在Jetty上使用Tomcat有很多原因:

    一个人已经熟悉Tomcat了

    一个是开发需要轻松传输到Tomcat安装的Web应用程序

    Jetty开发人员文档实际上比Tomcat更糟糕(太棒了!)

    在Jetty社区中回答问题有时可能需要数年时间,如2007年.请参阅嵌入Jetty

    重要:在Jetty 6.1.*之后,每个Web应用程序都会打开自己的JVM,因此如果您尝试在独立访问和Web应用程序之间获得编程访问权限,那么您唯一的希望就是通过Web API.

    如果这对您来说是一个问题,Tomcat是一个开源项目,其知识产权归Apache Foundation所有,Jetty是开源的,但由一家小型私人公司拥有(Mortbay Consulting)

第5点在我的工作中非常重要.例如,我可以通过Tomcat直接访问JSPWiki实例,但是在使用Jetty时它是完全无法访问的.我在2007年要求解决这个问题,但还没有听到答案.所以我终于放弃并开始使用Tomcat 6.我已经研究过Glassfish和Grizzly,但到目前为止,Tomcat(令人惊讶地)是最稳定且记录良好的Web容器(实际上并没有多说).


"每个Web应用程序都打开了自己的JVM":您从哪里获得这些信息?我怀疑这是准确的.
我很确定webapps在他们自己的JVM中没有打开.默认情况下,它们使用单​​独的类加载器.要获得类加载器行为,只需使用`webapp.setParentLoaderPriority(true);` - 我认为这是在Jetty文档中.
推荐阅读
coco2冰冰
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有