Java NoClassDefFoundError

Java NoClassDefFoundError,java,jar,noclassdeffounderror,Java,Jar,Noclassdeffounderror,对于学校的作业,我需要制作一个类Blender,实现一些预定义的东西。我收到了一个JAR文件,imagecompositor.JAR,它执行所有操作并使用Blender类。JAR文件包含两个类(ImageCompositor.class和StDraw.class) 为了运行该程序,老师们说我必须运行以下程序: java -cp ... ass3.ImageCompositor img1 img2 offsetx offsety java -cp whatever.jar;. whate

对于学校的作业,我需要制作一个类
Blender
,实现一些预定义的东西。我收到了一个JAR文件,
imagecompositor.JAR
,它执行所有操作并使用
Blender
类。JAR文件包含两个类(
ImageCompositor.class
StDraw.class

为了运行该程序,老师们说我必须运行以下程序:

java -cp ... ass3.ImageCompositor img1 img2 offsetx offsety
    java -cp whatever.jar;. whatever_other_parameters
我只知道如何编写Java代码。我不知道如何将外部类加载到JAR文件中。所以我试了一下:

java -cp imagecompositor.jar ass3.ImageCompositor img1.png img2.png 0 0
但它抛出了一个
NoClassDefFoundError

线程“main”java.lang.NoClassDefFoundError中出现异常:ass3/Blender 位于ass3.ImageCompositor.main(ImageCompositor.java:113)
Blender
类中有一行
package ass3
。我做错了什么


我想提供更多信息,但我不知道如何获取堆栈跟踪等。

您需要将
混合器
类添加到类路径

命令行

java -cp imagecompositor.jar ...
使用imagecompositor.jar的类路径。这告诉Java虚拟机(JVM)查看jar文件。它没有告诉JVM要做的是查找您的类。如果您已经将它们打包到jar文件中,您应该这样做

java -cp imagecompositor.jar;myclasses.jar ...
如果.class文件位于根目录为
path/to/someRoot
的树中(例如class
ass3.Blender
应该位于
path/to/someRoot/ass3/Blender.class
),那么您应该使用相同的语法,但使用根目录而不是.jar文件(我认为这是正确的,找不到文档):


搅拌机类在哪里?要正确找到,Blender类(在包“ass”中)必须位于相对于当前目录名为“ass”的目录中。如果是(并且您没有从默认类路径中删除当前控制器
),则无需修改类路径

但是,在您的情况下,您需要修改类路径(以便指定提供的jar文件),并且您的帖子中列出的命令将从路径中删除
。因此,您必须执行以下操作:

java -cp ... ass3.ImageCompositor img1 img2 offsetx offsety
    java -cp whatever.jar;. whatever_other_parameters

(注意,“.”附加到-CP参数中。)这会将当前目录放回类路径。

java.lang.NoClassDefFoundError通常是静态构造函数中的失败。如果JVM根本找不到您的类,它会说java.lang.ClassNotFoundException。根据你的问题描述,我认为命令行是:

java -cp imagecompositor.jar ass3.ImageCompositor img1 img2 offsetx offsety

假设imagecompositor.jar文件与执行java命令的目录相同。这告诉java编译器使imagecompositor.jar中的所有内容都可用于类加载器,我们正在加载一个名为imagecompositor的类,该类位于ass3包中。我们还假设ImageCompositor有一个静态main方法,这就是Java如何从命令行运行东西。

您描述的解决方案修复了Java.lang.ClassNotFoundException,但没有修复Java.lang.NoClassDefFoundError。NoClassDefFoundError通常是一些静态构造函数失败。我们需要更多的stacktrace来解决这个问题没错Bob。实际上我已经试过了,但没有成功(给出相同的错误)。另外:jar文件必须用冒号分隔……您描述的解决方案修复了java.lang.ClassNotFoundException,但没有修复java.lang.NoClassDefFoundError(Jason的答案也有同样的问题)。NoClassDefFoundError通常是一些静态构造函数失败。我们需要更多的stacktrace来尝试解决这个问题。是的,NoClassDefFoundError只是因为命名类在少数情况下完全丢失。更常见的情况是由于缺少不同的类、类版本不匹配或静态初始化问题。你至少需要回溯的前十行左右来整理它。谢谢你,鲍勃:),这是真的。以前也试过,但没用。@Korion--Bob说“我们需要更多的stacktrace”。我们还是这样。图像合成器的113行发生了什么?NoClassDefFoundError通常是一些静态构造函数失败。我们需要更多的stacktrace来尝试解决这个问题,或者看一眼ImageCompositor来找出构造函数链中有什么问题。我们没有得到赋值的源代码。我们只得到jar文件,所以我不能告诉你那里发生了什么。但可能是Blender Blender=新的Blender();因为这是它第一次抱怨没有找到Blender类定义的地方。您在哪里看到异常消息?一般情况下,堆栈跟踪会立即显示出来。