官网下载
https://tomcat.apache.org/download-80.cgi
这里下载apache-tomcat-8.5.50-src可以选择其它版本
添加 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.apache.tomcat</groupId>
<artifactId>apache-tomcat-8.5.50-src</artifactId>
<name>Tomcat8.5</name>
<version>8.5</version>
<build>
<!--指定源目录-->
<finalName>Tomcat8.5</finalName>
<sourceDirectory>java</sourceDirectory>
<resources>
<resource>
<directory>java</directory>
</resource>
</resources>
<plugins>
<!--引入编译插件,指定编译级别和编码-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<encoding>UTF-8</encoding>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>
<!--Tomcat是java开发的,封装了很多功能,它需要依赖一些基础的jar包-->
<dependencies>
<!--远程过程调用工具包-->
<dependency>
<groupId>javax.xml</groupId>
<artifactId>jaxrpc</artifactId>
<version>1.1</version>
</dependency>
<!--soap协议处理工具包-->
<dependency>
<groupId>javax.xml.soap</groupId>
<artifactId>javax.xml.soap-api</artifactId>
<version>1.4.0</version>
</dependency>
<!--解析webservice的wsdl文件工具-->
<dependency>
<groupId>wsdl4j</groupId>
<artifactId>wsdl4j</artifactId>
<version>1.6.2</version>
</dependency>
<!--Eclipse Java编译器-->
<dependency>
<groupId>org.eclipse.jdt.core.compiler</groupId>
<artifactId>ecj</artifactId>
<version>4.5.1</version>
</dependency>
<!--ant管理工具-->
<dependency>
<groupId>ant</groupId>
<artifactId>ant</artifactId>
<version>1.7.0</version>
</dependency>
<!---easymock辅助单元测试-->
<dependency>
<groupId>org.easymock</groupId>
<artifactId>easymock</artifactId>
<version>3.4</version>
</dependency>
</dependencies>
</project>
创建配置文件 source
omcat 本身就是 Java 开发邮的一款软件。我们在直接使用 Tomcat 的时候,Tomcat 需要读取 server.xml 以及其它配置文件,同时还需要找到它要去部署的工程项目。使用源码方式,依赖是如此的
所以我们在启动源码进行调试时,需要在通过指定虚拟机参数把项目配置文件传递进去。
将 apache-tomcat-8.5.50-src 目录下的 conf 和 webapps 目录移动到刚刚创建的 source 目录当中
导入idea
开始导入的时候,pom.xml 中依赖的有些 Jar 包还没有下载,就会出现依赖问题。就需要执行 mvn clean install 编译下载 pom.xml 中依赖的 Jar 包
启动 Tomcat
Tomcat 的入口类是 org.apache.catalina.startup.Bootstrap ,接着就是启动这个入口类。当然为了正常启动还需要添加以下启动参数。
-Dcatalina.home=E:/sources/apache-tomcat-8.5.50-src/apache-tomcat-8.5.50-src/source
-Dcatalina.base=E:/sources/apache-tomcat-8.5.50-src/apache-tomcat-8.5.50-src/source
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djava.util.logging.config.file=E:/sources/apache-tomcat-8.5.50-src/apache-tomcat-8.5.50-src/source/conf/logging.properties
路径需要自己修改
控制台乱码
Tomcat 里面是实现了 i18n 也就是国际化的,所以在启动的时候会出现乱码问题。虽然 Tomcat 的中文国际化文件的编码格式是 utf-8,但是 Java 国际化 ResourceBundle 在读取的时候默认使用的是 ISO-8859-1而且处理类还不能够传入编码。
- 1,修改 org.apache.tomcat.util.res.StringManager
public String getString(String key) {
if (key == null){
String msg = "key may not have a null value";
throw new IllegalArgumentException(msg);
}
String str = null;
try {
// Avoid NPE if bundle is null and treat it like an MRE
if (bundle != null) {
str = bundle.getString(key);
}
} catch (MissingResourceException mre) {
- 修改为
# @位置:org.apache.tomcat.util.res.StringManager
# @方法 getString()
# @Line:130行左右
str = bundle.getString(key)
替换成下面代码:
str = new String(bundle.getString(key).getBytes("ISO-8859-1"), "UTF8");
- 2.org.apache.jasper.servlet.TldScanner
log.info(Localizer.getMessage("jsp.tldCache.noTldSummary"));
替换成下面代码:
String message = Localizer.getMessage("jsp.tldCache.noTldSummary");
String logger = new String(message.getBytes("ISO-8859-1"), "UTF8");
log.info(logger);
- 再次启动
访问http://localhost:8080/ -500错误
原因是 Tomcat 源码中 JSP 引擎 jasper 没有被初始化,从而无法编译处理 JSP(因为 JSP 是需要被转换成 Servlet 进一步编译处理的)。我们只需要在 Tomcat 的源码 ContextConfig 类中的 configureStart 方法中增加一行代码将 JSP 引擎初始化,如下:
- org.apache.catalina.startup.ContextConfig
org.apache.catalina.startup.ContextConfig#configureStart
protected synchronized void configureStart() {
// Called from StandardContext.start()
if (log.isDebugEnabled()) {
log.debug(sm.getString("contextConfig.start"));
}
if (log.isDebugEnabled()) {
log.debug(sm.getString("contextConfig.xmlSettings",
context.getName(),
Boolean.valueOf(context.getXmlValidation()),
Boolean.valueOf(context.getXmlNamespaceAware())));
}
webConfig();
// 初始化 jsp 引擎 (下面是添加的代码) 增加这一行
context.addServletContainerInitializer(new JasperInitializer(), null);
- 再启动
访问 ${tomcat.project}/source/webapps/examples 提供的 Examples 。
- 解决办法:
${tomcat.project}/source/webapps/examples/WEB-INF/classes 右击 Mark Directory as sources Root。
标记之后图标会从灰色变成蓝色,接着就重启 Tomcat 源码
- 重启