WebSocket in Tomcat 7 (part 1)
又是一部折腾史
之前提到了最近在基于 WebSocket 协议实现 WebTerminal 特性,无奈生产环境遇到了一个 weired bug,百思不得其解,只好看看 WebSocket 在 Tomcat 7 中是如何实现的
环境/版本信息
1 | OS: macOS Sierra 10.12.6 |
jenv 管理 java 版本
1 | > jenv versions |
当前 java 版本
1 | > jenv global |
ant 版本
1 | > ant -version |
Set up Tomcat src code in Intellij
参考如下官方构建指南即可
第一步当然是下载源码 http://tomcat.apache.org/download-70.cgi#7.0.88
,当前源码地址 http://mirrors.hust.edu.cn/apache/tomcat/tomcat-7/v7.0.88/src/apache-tomcat-7.0.88-src.tar.gz
解压后目录结论如下
1 | apache-tomcat-7.0.88-src |
Tomcat 诞生的年代比较久远,还是用的比较古老的构建工具 ant,复制 build.properties.default 至 build.properties
1 | cp build.properties.default build.properties |
Tomcat7 WebSocket 依赖 java7,因此需要设置 build.properties 中的 java7 path。取消该文件中的下述定义注释(54行),并填写相应 jdk 路径
1 | java.7.home=/Library/Java/JavaVirtualMachines/zulu-7.jdk/Contents/Home |
如果使用 jenv 管理 java 版本,可使用如下命令查看当前 java 的 java_home path
/usr/libexec/java_home -v $(jenv version-name)
确认当前 java 版本为 1.6
1 | > java -version |
设置 JAVA_HOME(make sure it is a 1.6 java’s home)
1 | > export JAVA_HOME=$(/usr/libexec/java_home -v $(jenv version-name)) |
当然国内的小伙伴还要多做一件事儿,那就是配置 proxy
1 | proxy.use=on |
这个 proxy 方案也是非常常见的了,shadowsocks (socks5) + privoxy (http)
最后进入 Tomcat 源码目录执行 ant 命令构建
1 | cd /Users/zrss/Documents/Code/Java/apache-tomcat-7.0.88-src |
jar 包下载顺利的话,无问题
1 | BUILD SUCCESSFUL |
Import Tomcat src to Intellij
在 Tomcat 源码目录执行,如若遇到因为 SSL 无法下载的依赖,手动下载之,并放入 testexist 路径(讲真,是个体力活儿,得有六七个包吧)
1 | ant ide-eclipse |
最后终于成功了
1 | BUILD SUCCESSFUL |
构建 websocket eclipse
1 | ant ide-eclipse-websocket |
顺利成功
1 | BUILD SUCCESSFUL |
到此可以开始导入 IntelliJ 了
IntelliJ 欢迎页面选择 Import Project,在弹出框中选择 Tomcat 源码根路径,一路 Next 至 Select Eclipse projects to import,勾选上 tomcat-7.0.x 继续 Next,最后 Project SDK 选择 1.6 即可
WebSocket 代码在如下路径
1 | /Users/zrss/Documents/Code/Java/apache-tomcat-7.0.88-src/java/org/apache/tomcat/websocket |
最后查看 Tomcat version 信息
1 | > cd output/build/bin |
至此 Tomcat 7 导入 IntelliJ 中 okay,可以愉快的查看代码了。当然查看 WebSocket 相关的实现时,在 IntelliJ Project Structure 中切换 SDK 至 1.7 即可