升级Java开发工具遇到java.lang.ClassNotFoundException: org.apache.catalina.loader.DevLoader的解决

老环境:

eclipse  Version : Helios Service Release 2

jdk        Version:1.6

Tomcat Version:6.0

新环境:

eclipse  Version:Oxygen Release (4.7.0)

jdk        Version:1.8

Tomcat Version:8.5.23

在新环境启动程序的时候报错如图:


        第一步就是想着把Tomcat6下lib目录下的devloader相关class文件拷贝过来:


拷贝到Tomcat8的lib下


启动报错:


然后查看devloader源码发现改动挺大的,包括过期函数等,造成好几个问题:


然后根据父类进行修改,中间遇到的问题就不再写了:


修改好后的正常加载资源启动:


源码如下:

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.LifecycleException;
/**
 * 
* <p>Title: DevLoader</p>  
* <p>Description: JDK1.8,TOMCAT8,ECLIPSE(oxygen64)升级后,修改了兼容性</p>  
* @author huyou  
* @date 2018年1月30日
 */
public class DevLoader extends WebappLoader {  
    private static final String info = "org.apache.catalina.loader.DevLoader/1.0";  
    private String webClassPathFile = ".#webclasspath";  
    private String tomcatPluginFile = ".tomcatplugin";  
  
    public DevLoader() {  
    }  
  
    public DevLoader(ClassLoader parent) {  
        super(parent);  
    }  
  
    public void startInternal() throws LifecycleException {  
        log("Starting DevLoader");  
  
        super.startInternal();  
  
        ClassLoader cl = super.getClassLoader();
		if (cl instanceof ParallelWebappClassLoader == false) {
			logError("Unable to install WebappClassLoader !");
			return;
		}        
       
		ParallelWebappClassLoader devCl = (ParallelWebappClassLoader) 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("/"))))  
                    f = new File(entry + "/");  
                try {  
                	
                    URL url = f.toURI().toURL();
  
//                     devCl.addRepository(url.toString());  
                    devCl.addURL(url);  
                    classpath.append(f.toString() + File.pathSeparatorChar);  
                    log("added " + url.toString());  
                } catch (MalformedURLException e) {  
                    logError(entry + " invalid (MalformedURL)");  
                }  
            } else {  
                logError(entry + " does not exist !");  
            }  
        }  
  
        String cp = (String) getServletContext().getAttribute("org.apache.catalina.jsp_classpath");  
        StringTokenizer tokenizer = new StringTokenizer(cp, File.pathSeparatorChar + "");  
        while (tokenizer.hasMoreTokens()) {  
            String token = tokenizer.nextToken();  
  
            if ((token.charAt(0) == '/') && (token.charAt(2) == ':')) {  
                token = token.substring(1);  
            }  
            classpath.append(token + File.pathSeparatorChar);  
        }  
  
        getServletContext().setAttribute("org.apache.catalina.jsp_classpath", classpath.toString());  
        log("JSPCompiler Classpath = " + classpath);  
    }  
  
    protected void log(String msg) {  
        System.out.println("[DevLoader] " + msg);  
    }  
  
    protected void logError(String msg) {  
        System.err.println("[DevLoader] Error: " + msg);  
    }  
  
    protected List readWebClassPathEntries() {  
        List rc = null;  
  
        File prjDir = getProjectRootDir();  
        if (prjDir == null)  
            return new ArrayList();  
  
        log("projectdir=" + prjDir.getAbsolutePath());  
  
        rc = loadWebClassPathFile(prjDir);  
  
        if (rc == null)  
            rc = new ArrayList();  
        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, this.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) {  
                    line = line.replace('\\', '/');  
                    rc.add(line);  
                }  
                return rc;  
            } catch (IOException ioEx) {  
                if (reader != null)  
                    ;  
                return null;  
            }  
        }  
        return null;  
    }  
  
    protected ServletContext getServletContext() {  
        // return ((Context) getContainer()).getServletContext();  
        return this.getContext().getServletContext();  
    }  
  
    protected File getWebappDir() {  
        File webAppDir = new File(getServletContext().getRealPath("/"));  
        return webAppDir;  
    }  
}  



解决方案,在普通工程中新建包:org.apache.catalina.loader   新建类DevLoader并继承WebappLoader 如图:

然后将上面的代码全部复制到DevLoader类中,将此工程清理下,打开此工程文件夹:

将org文件夹整个拷贝纸Tomcat下的lib目录下,启动就成!


想直接下载用的话,请在这下载:

http://download.csdn.net/download/weixin_38374577/10232353

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值