背景
这两天java反编译了一个java web老项目,只需要修改里边一小段代码,并重新编译,但过程中出现了简单但又令人费解的问题。
1.使用jd-gui.exe打开jar包(.war包直接改后缀名为.jar)
图中显示,将RdqueryAction.class反编译出下结果,注意这是编译最终结果RdqueryAction.java的预览,不能在这里修改RdqueryAction.class文件,不然要反编译干嘛。
2.关于内部类
图中classA$classB格式的反编译java文件其实是指:classB是classA的内部类,如果一个个把内部类填到主类去会特别麻烦。
解决办法:
直接用360压缩软件解压ROOT.jar,然后用jd-gui.exe,快捷键CTRL+O,打开刚才这个classA主类,于是看到那些内部类都已经集成在主类了,而不会classA$classB形式分开。
3.导出编译结果
4.在eclipse新建java web项目,把反编译出的目录(com下)拷到src里,并且把lib里库文件拷到WEB-INF下,然后项目右键-Buid Path - configure Buid Path..-Add Library..-选择Web App Libraries..
正题
如图,Libraries处没有显示红叉,不缺任何jar报,不存在任何引用jar包错误问题,但是就是会显示感叹号
如图,运行一个简单的helloworld测试类都报错,
提示:errors exist in required project(s),
提示:错误: 找不到或无法加载主类 Test
同样的测试类我在其他项目运行时没有问题的。
分析
出现感叹号说明在jar包引用上一定有问题,但找不到问题所在。简单的测试类出错原因是所在项目运行出错,但是有src下的包都没有红叉,说明还是感叹号的问题。
解决
经过漫长无意义的反反复复检查后,无意中发现myeclipse新建web项目中自带的javaEE6.0库里有javax.xx.jar,而lib包下面也有javax.jar
于是我把lib下的javax.jar删除,刷新项目,就没有感叹号了!
总结
myeclipse自带的包和用户引用的包冲突时也会出错,显示感叹号!不只是缺少jar包才会出现感叹号。
后续
继续反编译,我需要更改RdqueryDaoJdbc类里某一段代码,更改好之后,就在main函数运行实例化,就能编译RdqueryDaoJdbc.java,并在文件夹WEB-INF/class下相对应目录下找到RdqueryDaoJdbc.class文件。
将该文件RdqueryDaoJdbc.class替换原ROOT.jar的解压包相对应目录下的原RdqueryDaoJdbc.class,完成了编译文件的修改,最后用360压缩把ROOT文件夹重新压缩成.zip格式的压缩包,把后缀名改成.war或.jar即可。
这样整个反编译-修改代码-重新编译-打包的过程就完成了!