2009-12-28 65 views
0

我正在修改一个java程序,它是在2004年使用J2re1.4.2_03中的javaw.exe编写的。如何找出原来的jdk版本

问题: 有没有办法找出一个程序员用来编译java文件的JDK编译器?

backstory: 我用jdk5的javac重新编译了java文件。 我用j2re1.4.2_03中的javaw.exe运行它,它给了我一个弹出错误“找不到主类,程序将退出。”

从一些谷歌搜索,错误消息意味着用更老的javac.exe编译的类 如果我用jdk5的javaw.exe运行它,没有错误。

我想避免重新编译所有的类文件,因为我没有完全重新编译原始java文件。

有没有办法解决这个问题或找出原始程序员用来做这件事的编译器?或者其中一个提前

+0

有没有源代码必须与签名的方法:' public static void main(String [] args)'??你在调用这个类吗? – OscarRyz 2009-12-29 00:09:22

回答

1

感谢工作得更好,我不太清楚您的具体问题是什么。

如果您想知道如何找出某个类文件的Java版本,可以读取类文件的头文件。你可以看到信息here,并且有工具可以检查你的文件。

您通常应该避免将由不同编译器编译的类文件放在一起。有一些方法可以解决它,但是你会进入classpath。新的Java文件是否与旧版本兼容(例如,没有泛型?)。您始终可以从Sun获得较旧的编译器,并使用该编译器编译新的文件。

1

从一些google搜索,错误消息意味着有更老的javac.exe

编译的类我敢肯定这不是它。使用较旧的编译器编译的类文件在新的JVM下运行得很好,而且我从来没有遇到过来自不同编译器的混合类文件的问题;类文件格式被指定得非常紧密。

我怀疑你唯一需要做的就是用-target 1.4选项编译你的新代码(或者使用1.4编译器),以便生成1.4 JVM能够理解的类文件。

或者,只需使用1.5 JVM运行该程序 - 最有可能的是它将毫无问题地运行。

0

关于你的元信息问题:有时你会得到一些环境信息,当你解压缩jar和看看/META-INF/MANIFEST.MF文件。

0

为什么不下载jdk 1.4并使用它编译文件?多个jdk版本可以在任何pc或服务器上共存,只需确保运行正确的javac。

0

简单的答案是“否”。根据JVM specification,类文件中唯一的版本信息是类格式主版本号和次版本号。这些告诉你目标JVM版本,而不是Java编译器版本。(理论上讲,在类文件中有一些未公开的“属性”中存在Java编译器版本信息,但如果javap命令没有显示它,我不知道如何找到它。)

@manuel指出,如果你的类在JAR文件中,JAR文件清单可能包含版本信息。但是,这将是用于创建JAR文件的jar命令的版本信息,并且不能保证用于编译的Java编译器具有相同的版本。 (或者甚至是使用了Sun编译!)

然而,我与其他人谁说,这可能不是你的问题的根源达成一致,