项目原因,近期要迁移到Eclipse上开发。重新架构,自然打算都用新的版本。发现一个问题:TomcatPlugin已经支持最新的Eclipse 4.4,但Tomcat的版本却只支持到7.x。纠结啊,Tomcat 8.x已经出来许久,用不了岂不是很痛心。于是乎打算深入处理一下。
1,直接用DevloaderTomcat7.jar放到tomcat8.x中运行,提示什么getContainer方法找不到。看来Tomcat8.x的源码改动有点大。貌似只有重新构建DevLoader了。
2,解压DevloaderTomcat7.jar,里面已经包含了工程信息,直接导入Eclipse,修改依赖Jar包目录,可惜没有DevLoader类的源码。没事反编译就行了。
3,修改编译报错的地方。
4,有些地方反编译有些问题,还好Devloader.jar的源码是有的,结合着改了下,OK。
5,重新打JAR包,命名DevloaderTomcat8.jar。
放入Tomcat8.x,一起正常。
何为管理?做人、管人、理事,最重要的是能为兄弟们解决问题。好几个月没写代码了,写两句感觉挺好的。
改后的源码如下:
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;
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 WebappClassLoader)) {
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("/"))))
f = new File(entry + "/");
try {
URL url = f.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;
}
}
最后,附DevloaderTomcat8.jar的下载地址:http://download.csdn.net/download/matrix_designer/8244253