IDEA启动Tomcat9.0.x
为了调试一下tomcat装载servlet的过程,在idea运行tomcat源码的过程中遇到了很多问题,在此记录一下。
下载链接:https://tomcat.apache.org/download-90.cgi
0x00 安装过程
下载完成之后之后解压,在解压后的文件夹里创建一个pom.xml
文件
1 |
|
然后用idea打开,maven导入依赖即可
找到org.apache.catalina.startup.Bootstrap
就能找到主函数入口
0x01 遇到的问题
报错:程序包aQute.bnd.annotation.spi不存在
解决:在 pom.xml
中添加以下依赖
1 | <dependency> |
报错:Error:(320, 45) java: 找不到符号
符号: 变量 VERSION_9
位置: 类 org.eclipse.jdt.internal.compiler.impl.CompilerOptions
解决:统一将错误改为VERSION_1_8即可 (或者改为你项目的JDK版本 )
报错:java: 程序包com.unboundid.ldap.listener不存在
解决:在 pom.xml
中添加以下依赖
1 | <dependency> |
报错:程序包trailers不存在
解决:复制 apache-tomcat-9.0.59-src\webapps\examples\WEB-INF\classes\trailers
整个目录至test
目录下
报错:找不到符号:变量CookieFilter
解决:复制/tomcat/webapps/examples/WEB-INF/classes/util/CookieFilter.java至/test/util目录下。
IDEA可能会有缓存,需要Rebuild Project,或者刷新一下maven。
报错:程序包org.easymock不存在
解决:在pom.xml中添加以下依赖
1 | <dependency> |
解决控制台日志中文乱码问题:
查看乱码打印日志的类后发现,其调用的是org.apache.tomcat.util.res.StringManager#getString(java.lang.String)方法或org.apache.jasper.compiler.Localizer#getMessage(java.lang.String)方法获取的日志内容。根本原因是在调用java.util.ResourceBundle#getString方法时未指定编码字符集为”UTF-8“,进行强制类型转换将java.lang.Object强转成java.lang.String导致。
解决方案:
修改以下两个方法中的代码
org.apache.jasper.compiler.Localizer#getMessage(java.lang.String)
由
1
errMsg = bundle.getString(errCode);
改为:
1
errMsg = new String(bundle.getString(errCode).getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
org.apache.tomcat.util.res.StringManager#getString(java.lang.String)
由
1
str = bundle.getString(key);
改为
1
str = new String(bundle.getString(key).getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
500错误
修改java/org/apache/catalina/startup/ContextConfig.java
在configureStart方法中添加一行代码
再次启动,可以看到熟悉的页面了。
- 本文作者: y0lo
- 本文链接: http://example.com/2022/03/07/IDEA启动tomcat9.0.x/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!