tomcat介绍
Tomcat是基于java语言的轻量级应用服务器,是一款完全开源免费的Servlet容器实现。支持HTML,JS等静态的处理。
tomcat8.5之后的新特性
-
自8.0版本开始,Tomcat支持Servlet3.1、JSP3.0、EL3.0、Websocket1.1;并且9.0版本支持Servlet4.0
-
为了让用户提前体验Servlet4.0的新特性,在8.5版本中,Tomcat提供了一套Servlet4.0预览API
-
自8.0版本开始,默认的HTTP、AJP链接器采用NIO,而非Tomcat7以前版本的BIO;并且在8.5开始,Tomcat移除BIO的支持
-
在8.0版本中,Tomcat提供了一套全新的资源实现,采用单独,一致的方法配置web应用的附加资源,以替代原有的Aliases,VirtualLoader,VirtualDirContext,JAR。新的资源方案可以用于实现覆盖。例如可以将一个WAR作为多个Web应用基础,同时这些Web应用各自拥有自己的定制功能
-
自8.0版本开始,链接器新增支持JDK7的NIO2,和HTTP/2协议
-
默认采用异步日志处理方式
除了新增的功能外,Tomcat8.5之后也进行了大量的代码重构。
Tomcat编译
本文编译采用了Tomcat 9.0.41版本
1. Tomcat官网下载源码包
tomcat官网:https://tomcat.apache.org/
2. 新建Catalina-home目录,把conf和webapps文件
3. 解压,在tomcat源码包下新建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>tomcat9</artifactId>
<name>tomcat9</name>
<version>9.0.41</version>
<build>
<finalName>tomcat10</finalName>
<sourceDirectory>java</sourceDirectory>
<!--<testSourceDirectory>test</testSourceDirectory> test 下的有些文件报错,因此将test文件夹去掉了-->
<resources>
<resource>
<directory>java</directory>
</resource>
</resources>
<testResources>
<testResource>
<directory>test</directory>
</testResource>
</testResources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<encoding>UTF-8</encoding>
<source>8</source>
<target>8</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.13</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant</artifactId>
<version>1.10.7</version>
</dependency>
<dependency>
<groupId>org.easymock</groupId>
<artifactId>easymock</artifactId>
<version>4.2</version>
</dependency>
<dependency>
<groupId>wsdl4j</groupId>
<artifactId>wsdl4j</artifactId>
<version>1.6.3</version>
</dependency>
<dependency>
<groupId>javax.xml</groupId>
<artifactId>jaxrpc</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>org.eclipse.jdt</groupId>
<artifactId>org.eclipse.jdt.core</artifactId>
<version>3.13.0</version>
</dependency>
<dependency>
<groupId>org.eclipse.jdt.core.compiler</groupId>
<artifactId>ecj</artifactId>
<version>4.6.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/biz.aQute.bnd/biz.aQute.bnd.annotation -->
<dependency>
<groupId>biz.aQute.bnd</groupId>
<artifactId>biz.aQute.bnd.annotation</artifactId>
<version>3.3.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
以上是Tomcat编译时需要的依赖包,可以根据build.properties.default文件下找到编译时需要的依赖包
注:tomcat9以上需要注释掉aQute.bnd.annotation.spi.ServiceConsumer,找不到这个包,本人没有找到
4. 设置JVM参数,本人用的idea工具
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djava.util.longging.config.file=E:/ideaWrokspace/apache-tomcat-9.0.41-src/apache-tomcat-9.0.41-src/catalina-home/conf/logging.properties
-Dfile.encoding=UTF-8
-Dsun.jun.encoding=UTF-8
启动出现的问题
(1)日志乱码
(2)java.lang.ClassNotFoundException: listeners.ContextListener
(3)java.lang.ClassNotFoundException: listeners.SessionListener
(4)java.lang.ClassNotFoundException: async.AsyncStockContextListener
(5)java.lang.ClassNotFoundException: websocket.drawboard.DrawboardContextListener
(6)org.apache.jasper.JasperException: org.apache.jasper.JasperException
问题一,日志乱码解决:
- jvm参数:
-Dfile.encoding=UTF-8
-Dsun.jun.encoding=UTF-8 - 修改run/debug configurations 添加Environment variables参数:JAVA_TOOL_OPTIONS:-Dfile.encoding=UTF-8和-Dsun.jun.encoding=UTF-8
- 修改idea配置file encoding的第三处为UTF-8
- 修改idea的Custom VM options。添加-Dfile.encoding=UTF-8
- 修改idea安装目录下的idea.exe.vmoptions和idea64.exe.vmoptions文件,添加-Dfile.encoding=UTF-8
- 修改idea文件夹下的encodings.xml文件,不是UFT-8的修改为UTF-8
- 修改Tomcat的配置文件logging.properties,将GBK改为UTF-8
若以上方法没有用,日志显示是如一下:
并不是日志输出的value乱码,而是key乱码,则需要修改代码。日志上显示VersionLoggerListener,TldScanner.scanJars等打印key值乱码。实际上是读取国际化的时候,LocalString_zh_CN.properties文件的key值乱码。因为用的是ISO-8859-1,而中文是UTF-8
所以需要转化,debug下在StringManager.getString(String key),以及Localizer.getMessage(String errCode)加上
try {
str = new String(str.getBytes("ISO-8859-1"),"UTF-8");
}catch (Exception e){
e.printStackTrace();
}
问题2-5可以忽略,主要是一些监听器为空,不影响Tomcat运行
问题六,org.apache.jasper.JasperException解决:
需要添加jsper初始化解析器。在ContextConfig类中986行
context.addServletContainerInitializer(new JasperInitializer(),null);