Jar清单版本与javap显示版本差异及编译库选择咨询
老旧Java项目编译版本确认与处理方案
优先参考
javap -v的字节码版本结果
manifest文件里的Created-By只是编译该Jar的JDK版本(这里是1.4.2_09),但实际class文件的主版本号46对应Java 1.2,说明编译时可能通过-target 1.2这类参数指定了生成低版本字节码。JVM是根据字节码版本来加载运行的,所以必须以javap得到的结果为准,保证重新编译后的字节码版本和原文件一致。反编译工具选择
选用支持Java 1.2字节码的反编译器,比如JD-GUI、IntelliJ IDEA内置的FernFlower,它们能正确解析这类老旧字节码,还原出可修改的源码。编译配置要点
- 若用高版本JDK编译,需添加参数
-source 1.2 -target 1.2(注意JDK9及以上版本默认不支持这么老的参数,需要额外配置--release 1.2或者使用javac的兼容性选项);更稳妥的方式是直接使用JDK1.4,它原生支持生成1.2版本的字节码。 - 必须保证编译依赖和原Jar完全一致:通过反编译源码的
import语句定位依赖,或者用jar tf 原Jar包路径列出Jar内所有文件,提取其中的第三方依赖库,编译时引入这些依赖。
- 若用高版本JDK编译,需添加参数
验证步骤
修改少量代码后编译生成class文件,执行javap -v 新生成的.class确认主版本号仍为46;将新class文件替换原Jar内的对应文件,测试项目运行是否正常,确保没有兼容性问题。
内容的提问来源于stack exchange,提问作者Zalthoria
相关产品推荐
相关产品推荐

