tomcat源码运行配置
- 运行环境
Jdk版本:1.8.0_211;
tomcat版本:9.0.30
idea:2019.3
系统:IOS - 首先下载tomcat源码
- iea新建一个空项目
- 把tomcat源码拷贝到空项目的目录中
- 修改tomcat源码的配置文件
- 在tomcat目录下新建文件夹home,把conf和webapps移动到home目录下
- 在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>apache-tomcat-9.0.30-src</artifactId>
<name>tomcat9.0</name>
<version>9.0</version>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.apache.ant/ant -->
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant</artifactId>
<version>1.10.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.xml/jaxrpc-api -->
<dependency>
<groupId>javax.xml</groupId>
<artifactId>jaxrpc-api</artifactId>
<version>1.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/wsdl4j/wsdl4j -->
<dependency>
<groupId>wsdl4j</groupId>
<artifactId>wsdl4j</artifactId>
<version>1.6.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.easymock</groupId>
<artifactId>easymock</artifactId>
<version>3.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.eclipse.jdt.core.compiler/ecj -->
<dependency>
<groupId>org.eclipse.jdt.core.compiler</groupId>
<artifactId>ecj</artifactId>
<version>4.6.1</version>
</dependency>
</dependencies>
<build>
<finalName>Tomcat9.0</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.6.1</version>
<configuration>
<encoding>UTF-8</encoding>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
-
使用maven导入tomcat源码
-
修改Java文件:JDTCompiler,大于1.8的部分全部删掉(报错的部分),具体因为jdk没有那么高的版本。
-
修改运行时参数:
Main class:org.apache.catalina.startup.Bootstrap
VM options:-Dcatalina.base=/Users/partner/IdeaProjects/project_tomcat/apache-tomcat-9.0.30-src/home
-Dcatalina.home=/Users/partner/IdeaProjects/project_tomcat/apache-tomcat-9.0.30-src/home
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djava.util.logging.config.file=/Users/partner/IdeaProjects/project_tomcat/apache-tomcat-9.0.30-src/home/conf/logging.properties -
运行Bootstrap下的main方法,正常启动
-
在浏览器上登陆localhost:8080,会报错如下:
HTTP Status 500 – Internal Server Error
Type 异常报告
æ¶ˆæ¯ java.lang.NullPointerException
æè¿° æœåŠ¡å™¨é‡åˆ°ä¸€ä¸ªæ„外的æƒ
况,阻æ¢å®ƒå®Œæˆè¯·æ±‚。
Exception
org.apache.jasper.JasperException: java.lang.NullPointerException
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:639)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:515)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:385)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:329)
javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
Root Cause
java.lang.NullPointerException
org.apache.jsp.index_jsp._jspService(index_jsp.java:431)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:477)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:385)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:329)
javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
):æ³¨æ„ ä¸»è¦é—®é¢˜çš„å
¨éƒ¨ stack ä¿¡æ¯å¯ä»¥åœ¨ server logs 里查看
Apache Tomcat/9.0.x-dev
这是因为没初始化Jsp的问题
11.在ContextConfig.java中的方法configureStart的代码webConfig();下加入context.addServletContainerInitializer(new JasperInitializer(),null);这段代码,再次启动就可以正常访问tomcat的欢迎页面了。代码实现如下:
webConfig();
context.addServletContainerInitializer(new JasperInitializer(),null);
if (!context.getIgnoreAnnotations()) {
applicationAnnotationsConfig();
}