背景

这两天java反编译了一个java web老项目,只需要修改里边一小段代码,并重新编译,但过程中出现了简单但又令人费解的问题。

1.使用jd-gui.exe打开jar包(.war包直接改后缀名为.jar)

java main 方法 如何 gc后自动重新启动 java main运行_反编译


图中显示,将RdqueryAction.class反编译出下结果,注意这是编译最终结果RdqueryAction.java的预览,不能在这里修改RdqueryAction.class文件,不然要反编译干嘛。2.关于内部类

java main 方法 如何 gc后自动重新启动 java main运行_java web_02


图中classA$classB格式的反编译java文件其实是指:classB是classA的内部类,如果一个个把内部类填到主类去会特别麻烦。

解决办法:

java main 方法 如何 gc后自动重新启动 java main运行_反编译_03


直接用360压缩软件解压ROOT.jar,然后用jd-gui.exe,快捷键CTRL+O,打开刚才这个classA主类,于是看到那些内部类都已经集成在主类了,而不会classA$classB形式分开。3.导出编译结果

java main 方法 如何 gc后自动重新启动 java main运行_myeclipse_04


4.在eclipse新建java web项目,把反编译出的目录(com下)拷到src里,并且把lib里库文件拷到WEB-INF下,然后项目右键-Buid Path - configure Buid Path..-Add Library..-选择Web App Libraries..

java main 方法 如何 gc后自动重新启动 java main运行_感叹号_05

正题

java main 方法 如何 gc后自动重新启动 java main运行_myeclipse_06


如图,Libraries处没有显示红叉,不缺任何jar报,不存在任何引用jar包错误问题,但是就是会显示感叹号

java main 方法 如何 gc后自动重新启动 java main运行_myeclipse_07


如图,运行一个简单的helloworld测试类都报错,

提示:errors exist in required project(s),

提示:错误: 找不到或无法加载主类 Test

同样的测试类我在其他项目运行时没有问题的。

分析

出现感叹号说明在jar包引用上一定有问题,但找不到问题所在。简单的测试类出错原因是所在项目运行出错,但是有src下的包都没有红叉,说明还是感叹号的问题。

解决

经过漫长无意义的反反复复检查后,无意中发现myeclipse新建web项目中自带的javaEE6.0库里有javax.xx.jar,而lib包下面也有javax.jar

java main 方法 如何 gc后自动重新启动 java main运行_myeclipse_08

java main 方法 如何 gc后自动重新启动 java main运行_java web_09


于是我把lib下的javax.jar删除,刷新项目,就没有感叹号了!

总结

myeclipse自带的包和用户引用的包冲突时也会出错,显示感叹号!不只是缺少jar包才会出现感叹号。

后续

继续反编译,我需要更改RdqueryDaoJdbc类里某一段代码,更改好之后,就在main函数运行实例化,就能编译RdqueryDaoJdbc.java,并在文件夹WEB-INF/class下相对应目录下找到RdqueryDaoJdbc.class文件。

java main 方法 如何 gc后自动重新启动 java main运行_感叹号_10


java main 方法 如何 gc后自动重新启动 java main运行_java web_11


将该文件RdqueryDaoJdbc.class替换原ROOT.jar的解压包相对应目录下的原RdqueryDaoJdbc.class,完成了编译文件的修改,最后用360压缩把ROOT文件夹重新压缩成.zip格式的压缩包,把后缀名改成.war或.jar即可。


这样整个反编译-修改代码-重新编译-打包的过程就完成了!