/tomcat

Apache Tomcat

Primary LanguageJavaApache License 2.0Apache-2.0

Tomcat8.5源码编译

1.转换为maven工程,添加pom文件

<?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>Tomcat8.5</artifactId>
    <name>Tomcat 8.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>2.3</version>
                <configuration>
                    <encoding>UTF-8</encoding>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <dependencies>
        <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>
        <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.eclipse.jdt.core.compiler</groupId>
            <artifactId>ecj</artifactId>
            <version>4.5.1</version>
        </dependency>
    </dependencies>
</project>

2.目录创建与拷贝

在当前项目目录下创建home目录,并将webapps目录和conf目录拷贝到home目录下

3.指定启动类,并配置环境变量

指定org.apache.catalina.startup.Bootstrap为启动类。配置启动参数,注意是在IDEA的VM OPTIONS中添加启动参数,不要选错。

  • -Dcatalina.home=E:/project/github/tomcat/home
  • -Dcatalina.base=E:/project/github/tomcat/home
  • -Djava.endorsed.dirs=E:/project/github/tomcat/home/endorsed
  • -Djava.io.tmpdir=E:/project/github/tomcat/home/temp
  • -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
  • -Djava.util.logging.config.file=E:/project/github/tomcat/home/conf/logging.properties

4.解决启动报错的问题,手动初始化JSP解析器

修改org.apache.catalina.startup.ContextConfig类的configureStart()方法,在该方法体中的webConfig();代码下方位置处增加一行代码 context.addServletContainerInitializer(new JasperInitializer(), null);

5.到当前步骤为止,已经可以启动,但是会发现控制台乱码,因此该步骤主要解决乱码问题。

(1)修改工程目录下所有的StringManager类,修改其String getString(final String key, final Object... args) 方法,将tomcat默认的iso8859-1添加一层UTF-8的转码。 添加如下代码:

    // 解决日志打印乱码问题,默认编码(ISO-8859-1)修改为UTF-8
    try {
        value = new String(value.getBytes("ISO-8859-1"), "UTF-8");
    }catch(Exception e){
        e.printStackTrace();
    }

修改后的代码:

    public String getString(final String key, final Object... args) {
        String value = getString(key);
        if (value == null) {
            value = key;
        }

        // 解决日志打印乱码问题,默认编码(ISO-8859-1)修改为UTF-8
        try {
            value = new String(value.getBytes("ISO-8859-1"), "UTF-8");
        }catch(Exception e){
            e.printStackTrace();
        }

        MessageFormat mf = new MessageFormat(value);
        mf.setLocale(locale);
        return mf.format(args, new StringBuffer(), null).toString();
    }

(2)修改工程目录下org.apache.jasper.compiler.LocalizergetMessage(String errCode)方法 添加如下代码:

    try {
        errMsg = new String(errMsg.getBytes("ISO-8859-1"), "UTF-8");
    }catch(Exception e){
        e.printStackTrace();
    }

修改后的代码:

    public static String getMessage(String errCode) {
        String errMsg = errCode;
        try {
            if (bundle != null) {
                errMsg = bundle.getString(errCode);
            }
        } catch (MissingResourceException e) {
        }
        try {
            errMsg = new String(errMsg.getBytes("ISO-8859-1"), "UTF-8");
        }catch(Exception e){
            e.printStackTrace();
        }
        return errMsg;
    }

此步骤完成以后,再次启动发现控制台已能正常打印日志。