tomcat配置远程调试(一次tomcat源码启动控制台中文乱码的调试过程记录)
tomcat配置远程调试
一次tomcat源码启动控制台中文乱码的调试过程记录发现问题
今天准备学习下tomcat源码,于是从官网下载了tomcat的源码,导入到IDEA中,使用maven工具build完项目之后,启动项目,控制台打印了tomcat日志,但是中文都是乱码。
一开始我怀疑是IDEA的问题,于是在网上找了各种解决办法尝试。大致有这几种:
1、修改run/debug configurations,添加VM options参数:-Dfile.encoding=utf-8;
2、修改run/debug configurations,添加Enviroment variables参数:JAVA_TOOL_OPTIONS:-Dfile.encoding=utf-8和JAVA_OPTS:-Dfile.encoding=utf-8;
3、修改IDEA配置file encodings的3处编码为UTF-8;
4、修改IDEA的Custom VM options,添加-Dfile.encoding=utf-8;
5、修改IDEA的安装目录bin下的idea.exe.vmoptions和idea64.exe.vmoptions文件,添加-Dfile.encoding=utf-8;
6、修改项目下的.idea文件夹下的encodings.xml文件,不是UTF-8的改为UTF-8;
7、修改tomcat的配置文件logging.properties,将里面的UTF-8改为GBK;
8、修改完删除target文件夹重新编译;
9、修改完重启IDEA。
尝试完所有方法后,控制台日志乱码问题并没有解决,如图:
仔细观察后,发现日志左边的日志等级”信息”和”严重”之类的中文乱码解决了,但是日志中还有乱码。
感觉应该是代码的问题,于是决定debugger代码,先从日志的第一行开始。
17-Feb-2020 10:10:08.585 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Server.æœåŠ¡å™¨ç‰ˆæœ¬: Apache Tomcat/@VERSION@
找到org.apache.catalina.startup.VersionLoggerListener类的log()方法,打断点一步一步跟踪
最终发现所有的值存在了PropertyResourceBundle类的lookup的map集合中,集合中的数据已经乱码了。
于是继续debugger查看lookup的加载,通过源码查看lookup集合中的数据是从properties文件中读取出来的。查看该properties文件编码也是UTF-8。于是继续查看源码。
ResourceBundle中的is = classLoader.getResourceAsStream(resourceName);加载的这个properties文件
再通过PropertyResourceBundle构造方法加载的数据。
正准备修改这块代码时,发现这竟是JDK中的类,无法修改。(后来才知道ResourceBundle是用来做国际化的)。
后来查资料知道了:在java中, 读取文件的默认格式是iso8859-1, 而我们中文存储的时候一般是UTF-8. 所以导致读出来的是乱码。
解决方案有两种:
1、使用JDK下的工具native2ascii.exe将properties文件转为Unicode编码。转换后如图:
2、在代码中获取到了值之后手动重新编码解码下
try { value = new String(value.getBytes("ISO-8859-1"), "UTF-8"); }catch(Exception e){ e.printStackTrace(); }
经过测试,两种方法都可以解决问题。
因为tomcat中properties文件过多,我采用了第二种方法,修改了tomcat源码,修改如下:
1)org.apache.tomcat.util.res.StringManager类中的getString(final String key, final Object... args)方法。
2)org.apache.jasper.compiler.Localizer类的getMessage(String errCode)方法
至此,乱码问题解决
总结
到此这篇关于一次tomcat源码启动控制台中文乱码调试过程记录的文章就介绍到这了,更多相关tomcat源码启动控制台中文乱码内容请搜索开心学习网以前的文章或继续浏览下面的相关文章希望大家以后多多支持开心学习网!
- tomcatweb 管理(Tomcat源码解析之Web请求与处理)
- idea项目中tomcat的配置(tomcat部署项目以及与IDEA集成的实现)
- 如何测试idea启动tomcat成功(解决IDEA配置tomcat启动报错问题)
- springboot内置tomcat启动过程(Tomcat启动springboot项目war包报错:启动子级时出错的问题)
- Tomcat和Weblogic部署纯html文件过程解析(Tomcat和Weblogic部署纯html文件过程解析)
- tomcat在windows下内存配置(浅谈Tomcat内存配置的正确姿势)
- linux部署tomcat项目(阿里云服务器linux系统搭建Tomcat部署Web项目)
- tomcat是异步非阻塞吗(浅谈Tomcat如何打破双亲委托机制)
- idea配合tomcat进行web开发(IDEA2021 tomcat10 servlet 较新版本踩坑问题)
- idea的tomcat怎么关闭(解决Idea的tomcat启动报多个listener的错误问题)
- tomcat服务如何在eclipse中配置(HBuilderX配置tomcat外部服务器查看编辑jsp界面的方法详解)
- nginx与tomcat长连接(Windows下使用Nginx+Tomcat做负载均衡的完整步骤)
- nginx tomcat docker 负载均衡(Nginx+Tomcat实现负载均衡、动静分离的原理解析)
- 阿里云centos系统安装tomcat(阿里云服务器Tomcat无法访问的问题)
- tomcat不显示图片怎么办(解决Tomcat重新部署后图片等资源被自动删除的问题)
- tomcat反向代理单(阿里云安全组规则配置及Tomcat外网访问)
- 肌肉小子陈康, 亚洲巨兽 黄哲勋,哪个才是你的菜(肌肉小子陈康亚洲巨兽)
- 新闻周刊 青岛网红 赵厂长 编段子一箩筐输出快乐,陪父亲十二载勇斗病魔(新闻周刊青岛网红)
- 44岁夏雨演谋女郎爸,大其24岁却看不出,互动不怕袁泉吃醋(44岁夏雨演谋女郎爸)
- 全椒人,你还记得吗 那年,那人,那网,那些我们的青春记忆(全椒人你还记得吗)
- 全椒人在苏州10周年联谊会在苏州举办(全椒人在苏州10周年联谊会在苏州举办)
- 这个全椒人被通报表彰,看看你认识吗(这个全椒人被通报表彰)
热门推荐
- C#中的base和this关键字
- dedecms改数据(dedecms修改文章自动增加的起始ID从指定数字增加文章ID的方法)
- jquery无缝滚动代码(jQuery实现表格行数据滚动效果)
- thinkphp实战教程之博客技术学习(python3编写ThinkPHP命令执行Getshell的方法)
- iis应用程序池自动回收
- 织梦网址首页如何布局(去掉织梦建站或者仿站时首页访问地址后的index.html)
- 登录宝塔面板无法显示网站(宝塔bt面板如何设置自定义404错误页面)
- javascript中定义数组的方法(JavaScript中数组sort方法的基本使用与踩坑记录)
- laravel数据库数据代码(在Laravel的Model层做数据缓存的实现)
- cssdisplay详解(详解CSS中的display:flex
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9