一次各种不顺的解决问题之旅

[本文(一次各种不顺的解决问题之旅)原始地址]http://xcoder.me/2017-09/tuning/一次各种不顺的解决问题之旅/

之前别人遇到来一个应用没有源码,访问报500的问题,初步怀疑是配置的错误,想看看到底报的什么错,好根据错误重新配置。

所以有了我之前那篇文章Java反编译实践

反编译后里面添加来异常处理和各种日志。可是没过一天,告诉我不好使,而且任何我输出的日志信息都找不到。。。

首先我怀疑可能是JDK版本的问题。我本机编译的是JDK8的,这种应用不会新,所以JDK版本应该也达不到8。
所以可能是我本地JDK8编译的结果到那边服务器不兼容了(也许jdk8的编译器优化了编译执行的指令,导致高版本编译的东西低版本不识别也有可能,或者我的是64位的jdk,你们是32位的,指令有差异)。

要保持良好的习惯,比如不要以为解决了问题就把源文件删除。对,我有这个好习惯,之前反编译的源文件我重新整理后形成一个可编译的java工程。

直接在应用运行的环境去编译,无疑是最好的选择。

源码工程拷贝过去后,为了能快速解决战斗,不想折腾环境变量这些东西,直接在JDK目录下执行javac –cp 依赖文件 –sourcepath 源文件目录 java文件

这种直接javac命令编译java文件为class文件的方式,这个方式好处是不用管环境变量配置没有,直接找到jdk目录下去执行,缺点是命令所需参数要一个个敲字符上去。如果只有一个java文件,也没啥依赖这种好使。但是放到这种大项目产品里面缺点太明显了,首先这个jar包相当于U8的一个小模块,啥都有,依赖其他公共模块,模块内文件相互依赖,就算我解决-cp 把所有jar包穷举出来,到后面java文件之间的依赖也搞死人…

放弃了

用IDE替我编译吧,要想干这个先要干两件事

  • 规规矩矩的把java的环境变量配置好,别再凑合了
    windows系统不重启让环境变量的修改立刻生效:以修改环境变量“PATH”为例,修改完成后,进入DOS命令提示符,输入:set PATH=C: ,关闭DOS窗口。再次打开DOS窗口,输入:echo %PATH% ,可以发现“我的电脑”->“属性”->“高级”->“环境变量”中设置的 PATH 值已经生效。
  • 去下载eclipse

查了下官方网站,eclipse目前版本4.7只支持最低版本为java1.8的jdk

应用所在机器上的jdk是老旧的jdk1.6,查了下jdk1.6最晚支持eclipse4.3的版本

像这种老的掉渣的版本只能在eclipse官网上找,终于费心的找到了。。。。

众所周知,www.eclipse.org这个网站在美利坚,那速度。。。我要是坚持用那个下载估计现在才1%

这种知名开源应用国内一定有大学镜像,功夫不负有心人,终于找到镜像了,惊喜过度,也没看清下载了个cpp的版本,打开一看竟然不能创建java工程,才看到下载错了

我看操作系统是64位的,回去重新下载个x86-64的eclipse-java-4.3吧

好容易下载下来了,点开exe.

JDK版本和Eclipse版本不匹配

这是因为那个老旧的jdk是32位,32位,32位的,我必须下载32位的eclipse才行!

终于打开了工程,把日志添上,重新编译class,替换winrar中的class,启动服务。。。一跑还是404

我就见鬼了,虽然我没做过几个spring项目,但是原理我还是懂的,没道理啊

我多次尝试发现只有反编译的服务不行(404),其他的都行(200)

其他的为啥行?其他的日志也能展示,我改的几个文件日志就不显示,而且还是404,没有找到路由。路由配置错了?

我一开始没有怀疑这个,这种产品的东西如果路由配置错了,出厂就错了,这个功能出厂就错了,这种事很少发生在产品身上

我从源代码里面的PathMapping.java和A8SDGateArchive.java里面看解析url为action的过程没有/a8sd/serverTest中的/a8sd这一层路由,所以我怀疑路由可能没有配置好,我先找到了urlrewrite(在org里面),没有看到啥异常

这种用apache或者tomcat启动的工程,最终的配置都逃不过web.xml,打开web.xml,

这个文件里面提到了*.jsp,

反编译GenericFilter并没有啥特殊的写法

再找,终于我发现了玄机

接着看到别的serverlet都有配置

1
2
3
4
5
6
7
8
<servlet>
<servlet-name>SSOLoginServlet</servlet-name>
<servlet-class>com.seeyon.ctp.portal.sso.SSOLoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SSOLoginServlet</servlet-name>
<url-pattern>/login/sso</url-pattern>
</servlet-mapping>

对,就是少了A8SD的配置

1
2
3
4
5
6
7
8
<servlet>
<servlet-name>A8SDgate</servlet-name>
<servlet-class>com.seeyon.apps.eipas.gate.A8SDgate</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>A8SDgate</servlet-name>
<url-pattern>/a8sd/*.jsp</url-pattern>
</servlet-mapping>

加上后程序可以正常运行并正常输出日志了。。。。

小英雄雨来 wechat
扫码二维码或搜索"架构演进之旅"订阅微信公众号
enjoy?donate!