在部署jar并对某个类文件进行更改之后,我得到了noclassdeffounderror。当我通过7zip解压jar文件时,我能够看到jar中的类文件。我还反编译了.class文件以查找任何错误,但没有得到任何结果。在部署时,我只是将.class文件从eclipse工作空间拖到一个预先存在的jar文件中。这有关系吗?编译jar文件的jdk版本是否重要,因为我运行的是eclipse中的jre1.7,但我的部署环境是jre1.6?
knpiaxh11#
当我在jdk1.6中编译代码时,这非常有效。两个版本中的java.security.secureclassloader都发生了更改。所以我想我会出错。
1u4esq0p2#
在我看来,问题是添加到jar的类是在不同版本的java下编译的。我猜您已经在1.7下编译了,12c运行的是1.7,而11g运行的是1.6。在1.6中编译类并将其添加到jar中,或者在1.7中重新编译jar,并确保您运行的环境具有1.7或更高版本。
brgchamk3#
noclassdeffounderror表示该类在运行时不可用。确保在类路径中有它,或者静态初始值设定项(如果存在)没有中断。对于后者,您将在stacktrace下面的某个地方看到ExceptionInInitializeError。不太确定jdk版本是否重要。
bd1hkmkf4#
在部署jar并对某个类文件进行更改之后,我得到了noclassdeffounderror。这是由于存在代码所依赖的类文件,并且该类文件在编译时存在,但在运行时找不到(请参阅此答案)。在部署时,我只是将.class文件从eclipse工作空间拖到一个预先存在的jar文件中。这有关系吗?是的,这很重要。确保将类文件放回正确的包文件夹中。例如,包中的类 com.foo 必须在文件夹中 com/foo 在jar文件中。当您将更改后的版本拖到jar文件中时,它可能会落在其他地方。编译jar文件的jdk版本是否重要,因为我运行的是eclipse中的jre1.7,但我的部署环境是jre1.6?jar文件本身只是一个zip文件,所以不管您使用哪个版本的java压缩jar文件的内容。但是,如果您从现有jar文件编译了一个类,那么使用哪个版本的java来编译jar文件中的其他类是很重要的,因为您可能会导致该类与其伴随类不兼容。
com.foo
com/foo
4条答案
按热度按时间knpiaxh11#
当我在jdk1.6中编译代码时,这非常有效。两个版本中的java.security.secureclassloader都发生了更改。所以我想我会出错。
1u4esq0p2#
在我看来,问题是添加到jar的类是在不同版本的java下编译的。我猜您已经在1.7下编译了,12c运行的是1.7,而11g运行的是1.6。在1.6中编译类并将其添加到jar中,或者在1.7中重新编译jar,并确保您运行的环境具有1.7或更高版本。
brgchamk3#
noclassdeffounderror表示该类在运行时不可用。确保在类路径中有它,或者静态初始值设定项(如果存在)没有中断。对于后者,您将在stacktrace下面的某个地方看到ExceptionInInitializeError。
不太确定jdk版本是否重要。
bd1hkmkf4#
在部署jar并对某个类文件进行更改之后,我得到了noclassdeffounderror。
这是由于存在代码所依赖的类文件,并且该类文件在编译时存在,但在运行时找不到(请参阅此答案)。
在部署时,我只是将.class文件从eclipse工作空间拖到一个预先存在的jar文件中。这有关系吗?
是的,这很重要。确保将类文件放回正确的包文件夹中。例如,包中的类
com.foo
必须在文件夹中com/foo
在jar文件中。当您将更改后的版本拖到jar文件中时,它可能会落在其他地方。编译jar文件的jdk版本是否重要,因为我运行的是eclipse中的jre1.7,但我的部署环境是jre1.6?
jar文件本身只是一个zip文件,所以不管您使用哪个版本的java压缩jar文件的内容。
但是,如果您从现有jar文件编译了一个类,那么使用哪个版本的java来编译jar文件中的其他类是很重要的,因为您可能会导致该类与其伴随类不兼容。