最近在编译我们的中间件产品的时候,碰到了一些问题
原来编译环境:jdk1.5,OS:linux为64位,windows为32位。现在转移到jdk1.6上
在jdk1.6上编译,OS:linux为64位,windows为32位。在编译某个模块的时候,会提示bad class file: xxx.class,
unable to access file: corrupted zip file
提示损坏的xxx.class,位于jar包AA.jar中。用jar命令jar -tvf AA.jar | grep xxx,可以得到xxx.class,说明xxx.class在AA.jar中,没有损坏。
编写一个测试类,该类import了xxx.class,没有其他语句。单独编译该类,用-cp AA.jar指定用到的jar,编译通过。
上面两步测试,说明所谓损坏的xxx.class其实完好的存在于AA.jar中,那为什么编译模块总是失败呢?
分析编译的log,发现在发生错误之前,ant执行了一个jar命令,该命令update了AA.jar,接着是javac命令,编译时候用到了AA.jar中的类,看来是在执行javac的时候jar命令还没有完成对AA.jar的更新操作,导致了问题。跟踪这个分析,我在javac命令加入了-verbose参数,这样相当于降低了javac的执行速度,果然编译通过了。看来jdk1.6的编译速度太快,暴露了这个问题。这个问题揭示了一个并发的问题,就是在ant中顺序执行jar命令和javac命令,javac可能在jar命令没有完全结束前执行,要从根本解决这个问题,需要重构代码,不在刚update一个jar后马上引用它。
阅读(1981) | 评论(0) | 转发(0) |