项目开发经验----如何同时应对多个项目 & embedded tomcat 使用

来源:互联网 发布:阿里云 cname 配置 编辑:程序博客网 时间:2024/05/21 13:56

项目开发经验----如何同时应对多个项目 & embedded tomcat 使用

 

如果有几个项目同时开发,将它们都发布在tomcat下运行调试,一种简单容易的方法。用myeclipse自带的"add and remove deployment"菜单进行发布和取消发布。比如现在有a,b,c,d四个项目。

如果需要跑a项目,就单独发布a,需要跑b项目就发布b.同时remove其它的已发布在tomcat下的项目,这样反复地切换,特别是项目比较大,发布一下要半分钟的时候,很烦。

 如果图方便,同时发布a,b,c,d四个项目,这样省去了反复"add and remove"的麻烦,但另一方面,tomcat启动过程就比只发布一个要慢,如果程序改动较大,tomat需要反复启动,启动一次等上一两分钟,浪费时间更影响心情。此外,同时发布多个项目,tomcat跑起来很吃内存。

 

有一种解决问题的方法,修改tomcat根目录下conf/server.xml这个文件。在host元素里添加context元素,配置虚拟路径。如下,要发布名称为a的项目,只需添加下面这段代码:

<Context path="/a" docBase="D:/eclipse/workspace/a/webapp" ></Context>

其中D:/eclipse/workspace/a/webapp是项目的路径。myeclipse创建的web工程根目录文件夹的名字是WebRoot,上面例子中根目录的文件夹名是webapp.注意修改。

 

还有一种方法,使用内嵌tomcat。(myeclipse新建web工程,名字较haha)

步骤一:从apache官网上下载embedded tomcat. 5.0版本的搭配jdk1.4, 5.5版本的搭配jdk1.5. 

步骤二:将haha工程的j2ee类库去掉,换成jdk。

步骤三:下载的embedded tomcat里有lib文件夹和conf文件夹,将lib文件夹里面的jar包加到haha工程的WEB-INF/lib文件夹下,将conf文件夹整个添加到WebRoot下。

步骤四:编写tomcat的启动类。

 

使用embedded tomcat,以下几点要注意:

1) 5.5与5.0的启动代码有区别,请注意。而且jdk要正确搭配。

2) 内嵌tomcat需要tool.jar包进行动态编译jsp,最好把jdk添加到运行路径中,(再次强调步骤二)。

3) 在tomcat启动类中,要设置CatalinaHome的值,如下面例子中的代码行:tomcat.setCatalinaHome(catalinaHome);

个人猜测,tomcat启动时自动去找catalinaHome路径下的conf/web.xml这个文件,作为默认的web.xml(default web.xml),通常这个文件包含处理jsp文件的信息. 使用embedded tomcat时,要确认该文件的存在,这里重复强调步骤三。

4) classpath里不要有其它冲突的包。最好先跑通一个简单的或者空的工程。然后再跑真实的项目。

网上有很多例子,这里发一个自己用的(tomcat 5.0)

//--------------------------------------------------------

// MyEmbeddedTomcat.java

import org.apache.catalina.startup.Embedded;
import org.apache.catalina.Engine;
import org.apache.catalina.Host;
import org.apache.catalina.Context;
import org.apache.catalina.Connector;

import java.io.File;
import java.net.InetAddress;

/**
*/
public class MyEmbeddedTomcat {
    private String webrootPath;    //WEB应用程序路径
    private String contextPath;    //WEB上下文名称
    private String catalinaHome = "D:/myeclipse/workspace/embeddedtomcat/WebRoot";   
    private boolean reloadable=true;   //是否允许热交换class

    private Embedded tomcat;     //嵌入式Tomcat

    public MyEmbeddedTomcat() {

        webrootPath ="D:/myeclipse/workspace/a/WebRoot";

        
        contextPath ="/tomcat";
    }

    /**
     * 启动Tomcat
     */
    public void startup() throws Exception {

        tomcat = new Embedded();
        Engine engine = tomcat.createEngine();
        tomcat.setCatalinaHome(catalinaHome);

        Host host = tomcat.createHost("localhost", webrootPath);
        Context context = tomcat.createContext(contextPath, webrootPath);
//        context.setAltDDName(getWebXmlDirectory());    //设置web.xml的位置
        if(reloadable) context.setReloadable(true);
        host.addChild(context);
        engine.addChild(host);
        engine.setDefaultHost(host.getName());

        engine.setName("EmbeddedServer");
        tomcat.addEngine(engine);
        Connector connector =
            tomcat.createConnector(InetAddress.getByName("0.0.0.0"), 8080, false);
        tomcat.addConnector(connector);
        tomcat.start();
    }

    /**
     * 终止Tomcat
     */
    public void shutdown() throws Exception {
        tomcat.stop();
    }

    public static void main(String[] args) {
        try {

         long begin = System.currentTimeMillis();
         String workdir = "D:/myeclipse/workspace/embeddedtomcat/WebRoot/work";
         delFolder(workdir);
         System.out.println("work directory is deleted, use " + (System.currentTimeMillis() - begin) + " ms");
         begin = System.currentTimeMillis();
         new MyEmbeddedTomcat().startup();
            System.out.println("Tomcat Server started, use " + (System.currentTimeMillis() - begin) + " ms");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
   
//  删除文件夹
//  param folderPath 文件夹完整绝对路径

 public static void delFolder(String folderPath) {
    try {
     delAllFile(folderPath); // 删除完里面所有内容
     String filePath = folderPath;
     filePath = filePath.toString();
     java.io.File myFilePath = new java.io.File(filePath);
     myFilePath.delete(); // 删除空文件夹
    } catch (Exception e) {
     e.printStackTrace();
    }
 }

//  删除指定文件夹下所有文件
//  param path 文件夹完整绝对路径
 public static boolean delAllFile(String path) {
    boolean flag = false;
    File file = new File(path);
    if (!file.exists()) {
     return flag;
    }
    if (!file.isDirectory()) {
     return flag;
    }
    String[] tempList = file.list();
    File temp = null;
    for (int i = 0; i < tempList.length; i++) {
     if (path.endsWith(File.separator)) {
      temp = new File(path + tempList[i]);
     } else {
      temp = new File(path + File.separator + tempList[i]);
     }
     if (temp.isFile()) {
      temp.delete();
     }
     if (temp.isDirectory()) {
      delAllFile(path + "/" + tempList[i]);// 先删除文件夹里面的文件
      delFolder(path + "/" + tempList[i]);// 再删除空文件夹
      flag = true;
     }
    }
    return flag;
 }

}

//-------------------------------------------------------------------------

 

以上是个人这几天调试embedded tomcat 时的收获。如果有不足或者错误之处,欢迎指正。