让Eclipse的TomcatPlugin支持Tomcat 8.x

本文介绍如何使用Tomcat插件进行项目的快速开发与部署,包括免重启开发、多项目并行启动等内容。通过详细步骤指导如何配置Tomcat插件、server.xml文件及hosts文件,实现高效开发流程。

 使用tomcat插件启动项目的优势:

1.TomcatPlugin是一个免重启的开发插件,原始的Servers方式启动tomcat项目,修改xxx.ftl  或者 xxx.jsp 文件后需要重启tomcat后内容才能得到更新,而使用TomcatPlugin可以避免这种重复重启项目操作;

2.多项目同时启动时较方便。在开发环境中,可能要同时启动多个项目,而每一个平台都有一个独立的域名,使用Servers情况下,如果只使用一个8080端口启动多个项目,会有冲突。但是使用TomcatPlugin,只需要配置一下hosts文件就可以很方便的访问各个项目。

 

 

实现步骤:

1.下载eclipse tomcat 插件(略)

2.配置tomcat

tomcat插件下载完成后 Window-->Preperences 中找到tomcat配置项

 ​

 

 

3.配置server.xml

在conf/目录下找到server.xml文件,并在 Engine 标签中添加如下内容:

 

<Host name="www2.domain1.com"  appBase="webapps" unpackWARs="true" autoDeploy="true">
  <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" />
  <Context path="" reloadable="true" docBase="项目目录1\src\main\webapp" workDir="项目目录1\work" >
      <Loader className="org.apache.catalina.loader.DevLoader" reloadable="true" debug="1" useSystemClassLoaderAsParent="false" />
  </Context>
</Host>
<Host name="www2.domain2.com"  appBase="webapps" unpackWARs="true" autoDeploy="true">
  <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" />
  <Context path="" reloadable="true" docBase="项目目录2\src\main\webapp" workDir="项目目录2\work" >
      <Loader className="org.apache.catalina.loader.MyDevLoader" reloadable="true" debug="1" useSystemClassLoaderAsParent="false" />
  </Context>
</Host> 

 

 

4.配置hosts文件

在windows/system32/drivers/etc 目录下找到hosts文件,添加如下内容:

#	127.0.0.1       localhost
#	::1             localhost
127.0.0.1  	www2.domain1.com    www2.domain2.com    www2.domain3.com	

  

 

5.生成jar包

 

1.新建一个项目(或者使用原有的项目),创建一个包 名称为:org.apache.catalina.loader, 再创建一个类,名称为 MyDevLoader,拷贝下面java代码部分

备注:你可以随意创建一个包名和类名,但需要与 <Loader className="org.apache.catalina.loader.MyDevLoader" reloadable="true" debug="1" useSystemClassLoaderAsParent="false" /> 中的className保持一至即可。

2、消除编译报错的地方。主要是tomcat 中的lib目录下相关的jar包没有引入进来。

3、重新打成JAR包,命名DevloaderTomcat8.jar。

4、将这个jar文件放入tomcat 中的lib目录下。

 

package org.apache.catalina.loader;

import java.io.File;
import java.io.FileFilter;
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.StringTokenizer;

import javax.servlet.ServletContext;

import org.apache.catalina.Context;
import org.apache.catalina.Globals;
import org.apache.catalina.LifecycleException;

/**
 * @author caoxiaobo
 * 备注:修改DevLoader源码后的,请生成jar包,然后放置tomcat中的lib目录下;
 */
public class MyDevLoader extends WebappLoader {
    private static final String info =
        "org.apache.catalina.loader.MyDevLoader/1.0"; 

    private String webClassPathFile = ".#webclasspath";
    private String tomcatPluginFile = ".tomcatplugin";
    
    public MyDevLoader() {
        super();        
    }        
    public MyDevLoader(ClassLoader parent) {
        super(parent);
    }
    
    /**
     * @see org.apache.catalina.Lifecycle#start()
     * 如果您使用的是tomcat7,此处的方法名称为start(),如果是tomcat8,此处的方法名称为startInternal()
     */
    public void startInternal() throws LifecycleException {
        log("Starting MyDevLoader");
        //setLoaderClass(DevWebappClassLoader.class.getName());
        
        // 如果是tomcat7,此处调用 start()方法,如果是tomcat8,此处调用startInternal()方法
        // super.start();    // tomcat7 
        super.startInternal(); // tomcat8
        
        ClassLoader cl = super.getClassLoader();
        if (cl instanceof WebappClassLoader == false) {
            logError("Unable to install WebappClassLoader !");
            return;
        }
        WebappClassLoader devCl = (WebappClassLoader) cl;
        
        List webClassPathEntries = readWebClassPathEntries();
        StringBuffer classpath   = new StringBuffer();
        for (Iterator it = webClassPathEntries.iterator(); it.hasNext();) {
            String entry = (String) it.next();
            File f = new File(entry);
            if (f.exists()) {
                if (f.isDirectory() && entry.endsWith("/")==false) f = new File(entry + "/");
                try {
                    URL url = f.toURL();
                    devCl.addURL(url);    // tomcat8
//                    devCl.addRepository(url.toString()); // tomcat7
                    classpath.append(f.toString() + File.pathSeparatorChar);
                    log("added " + url.toString());
                } catch (MalformedURLException e) {
                    logError(entry + " invalid (MalformedURL)");
                }
            } else {
                logError(entry + " does not exist !");
            }
        }
        /*
        try {
            devCl.loadClass("at.kase.webfaces.WebApplication");
            devCl.loadClass("at.kase.taglib.BaseTag");
            devCl.loadClass("at.kase.taglib.xhtml.XHTMLTag");
            devCl.loadClass("at.kase.common.reflect.ClassHelper");
            devCl.loadClass("javax.servlet.jsp.jstl.core.Config");
            log("ALL OKAY !");
        } catch(Exception e) {
            logError(e.toString());
        }*/
        String cp = (String)getServletContext().getAttribute(Globals.CLASS_PATH_ATTR);
        StringTokenizer tokenizer = new StringTokenizer(cp, File.pathSeparatorChar+"");
        while(tokenizer.hasMoreTokens()) {
            String token = tokenizer.nextToken();
            // only on windows 
            if (token.charAt(0)=='/' && token.charAt(2)==':') token = token.substring(1);
            classpath.append(token + File.pathSeparatorChar);
        }
        //cp = classpath + cp;
        getServletContext().setAttribute(Globals.CLASS_PATH_ATTR, classpath.toString());
        log("JSPCompiler Classpath = " + classpath);
    }
    
    protected void log(String msg) {
        System.out.println("[MyDevLoader] " + msg);
    }
    protected void logError(String msg) {
        System.err.println("[MyDevLoader] Error: " + msg);
    }
    
    protected List readWebClassPathEntries() {
        List rc = null;
                
        File prjDir = getProjectRootDir();
        if (prjDir == null) {
            return new ArrayList();
        }
        log("projectdir=" + prjDir.getAbsolutePath());
        
        // try loading tomcat plugin file
        // DON"T LOAD TOMCAT PLUGIN FILE (DOESN't HAVE FULL PATHS ANYMORE)
        //rc = loadTomcatPluginFile(prjDir);
        
        if (rc ==null) {
            rc = loadWebClassPathFile(prjDir);
        }
        
        if (rc == null) rc = new ArrayList(); // should not happen !
        return rc;
    }
    
    protected File getProjectRootDir() {
        File rootDir = getWebappDir();
        FileFilter filter = new FileFilter() {
            public boolean accept(File file) {
                return (file.getName().equalsIgnoreCase(webClassPathFile) ||
                        file.getName().equalsIgnoreCase(tomcatPluginFile));
            }
        };
        while(rootDir != null) {
            File[] files = rootDir.listFiles(filter);
            if (files != null && files.length >= 1) {
                return files[0].getParentFile();
            }
            rootDir = rootDir.getParentFile();
        }
        return null;
    }
    
    protected List loadWebClassPathFile(File prjDir) {
        File cpFile = new File(prjDir, webClassPathFile);
        if (cpFile.exists()) {            
            FileReader reader = null;
            try {
                List rc = new ArrayList();
                reader = new FileReader(cpFile);
                LineNumberReader lr = new LineNumberReader(reader);
                String line = null;
                while((line = lr.readLine()) != null) {
                    // convert '\' to '/'
                    line = line.replace('\\', '/');
                    rc.add(line);
                }
                return rc;
            } catch(IOException ioEx) {
                if (reader != null) try { reader.close(); } catch(Exception ignored) {}
                return null;
            }            
        } else {
            return null;
        }
    }
    
/*
    protected List loadTomcatPluginFile(File prjDir) {
        File cpFile = new File(prjDir, tomcatPluginFile);
        if (cpFile.exists()) {            
            FileReader reader = null;
            try {
                StringBuffer buf = new StringBuffer();
                
                BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(cpFile)));
                String inputLine;
                while ((inputLine = in.readLine()) != null) {
                    buf.append(inputLine);
                    buf.append('\n');
                }
                WebClassPathEntries entries = WebClassPathEntries.xmlUnmarshal(buf.toString());
                if (entries == null) {
                    log("no entries found in tomcatplugin file !");
                    return null;
                }
                return entries.getList();
            } catch(IOException ioEx) {
                if (reader != null) try { reader.close(); } catch(Exception ignored) {}
                return null;                
            }
        } else {
            return null;            
        }
    }
*/    
    protected ServletContext getServletContext() {
//        return ((Context) getContainer()).getServletContext(); // tomcat7
        return super.getContext().getServletContext();            // tomcat8
    }
    
    protected File getWebappDir() {        
        File webAppDir = new File(getServletContext().getRealPath("/"));
        return webAppDir;
    }
}

 

 

  

 

右键项目--> Properties --> Tomcat

 

至此我们已经配置完结了!

点击如下图标开始启动项目

 

 出现如下信息表示配置成功.

 

 

转载于:https://www.cnblogs.com/caoxb/p/9326773.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值