tomcat7原始碼除錯執行環境搭建
阿新 • • 發佈:2018-12-18
1.提前準備
本人使用的工具是:idea,jdk1.8,maven 3.3.9
2.登陸apache官網下載tomcat7原始碼
在這裡本人下載一份原始碼與一份二進位制分發包(就是下載過可以直接使用的包),如下圖
3.解壓兩個包,建立一個目錄叫tomcat7目錄(該目錄可以隨意,本人使用的是這個目錄) 解壓完成之後,將原始碼包改為trunk,二進位制包改為launch,一起拷貝到tomcat7目錄中,如下圖:
這裡使用這種方式主要是使用二進位制包中的一些已經配置好的配置檔案,節省時間
由於tomcat不是標準的maven工程,所以需要新增pom.xml檔案在tomcat7目錄下,與launch和trunk在同級目錄,就是上圖的pom.xml位置
4.開啟IDEA,開啟tomcat7目錄
這裡需要注意的是:
①.ecj的版本不能太低,不然會出現如下異常: Error:(373, 45) java: 找不到符號 符號: 變數 VERSION_1_8 位置: 類 org.eclipse.jdt.internal.compiler.impl.CompilerOptions
②.junit包的版本也不能太低,不然啟動的時候也會出現如下問題: Error:(27, 17) java: 找不到符號 符號: 類 Rule 位置: 程式包 org.junit
③.上面的都設定好之後,啟動可能還會如下錯誤: Error:(29, 36) java: 找不到符號 符號: 變數 CookieFilter 位置: 類 util.TestCookieFilter 這時候只要把如下的CookieFilter類拷貝到trunk/test/util目錄下即可,類如下:
5.這些都搞好之後,找到Bootstrap類的main方法,啟動即可,效果如下: 表示tomcat啟動成功,可以debug進行除錯了。
本文需要的pom檔案與類檔案在這裡貼出來: pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.apache.tomcat</groupId> <artifactId>Tomcat7.0</artifactId> <name>Tomcat7.0</name> <version>7.0</version> <build> <finalName>Tomcat7.0</finalName> <sourceDirectory>trunk/java</sourceDirectory> <testSourceDirectory>trunk/test</testSourceDirectory> <resources> <resource> <directory>trunk/java</directory> </resource> </resources> <testResources> <testResource> <directory>trunk/test</directory> </testResource> </testResources> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.5.1</version> <configuration> <source>1.7</source> <target>1.7</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.6</version> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>org.eclipse.jdt.core.compiler</groupId> <artifactId>ecj</artifactId> <version>4.4.2</version> </dependency> <dependency> <groupId>ant</groupId> <artifactId>ant</artifactId> <version>1.7.0</version> </dependency> <dependency> <groupId>wsdl4j</groupId> <artifactId>wsdl4j</artifactId> <version>1.6.2</version> </dependency> <dependency> <groupId>javax.xml</groupId> <artifactId>jaxrpc</artifactId> <version>1.1</version> </dependency> <dependency> <groupId>org.easymock</groupId> <artifactId>easymock</artifactId> <version>3.4</version> </dependency> </dependencies> </project>
CookieFilter類:
package util;
import java.util.Locale;
import java.util.StringTokenizer;
public class CookieFilter {
private static final String OBFUSCATED = "[obfuscated]";
private CookieFilter() {
// Hide default constructor
}
public static String filter(String cookieHeader, String sessionId) {
StringBuilder sb = new StringBuilder(cookieHeader.length());
// Cookie name value pairs are ';' separated.
// Session IDs don't use ; in the value so don't worry about quoted
// values that contain ;
StringTokenizer st = new StringTokenizer(cookieHeader, ";");
boolean first = true;
while (st.hasMoreTokens()) {
if (first) {
first = false;
} else {
sb.append(';');
}
sb.append(filterNameValuePair(st.nextToken(), sessionId));
}
return sb.toString();
}
private static String filterNameValuePair(String input, String sessionId) {
int i = input.indexOf('=');
if (i == -1) {
return input;
}
String name = input.substring(0, i);
String value = input.substring(i + 1, input.length());
return name + "=" + filter(name, value, sessionId);
}
public static String filter(String cookieName, String cookieValue, String sessionId) {
if (cookieName.toLowerCase(Locale.ENGLISH).contains("jsessionid") &&
(sessionId == null || !cookieValue.contains(sessionId))) {
cookieValue = OBFUSCATED;
}
return cookieValue;
}
}