对于学校的一项作业,我需要创建一个实现一些预定义内容的类Blender。我收到了一个JAR文件imagecompositor.jar,它执行所有操作并使用Blender类。JAR文件包含两个类(ImageCompositor.class和StDraw.class)。
为了运行这个程序,老师们说我必须运行以下命令:
java -cp ... ass3.ImageCompositor img1 img2 offsetx offsety我只知道如何编写Java代码。我不知道如何将外部类加载到JAR文件中。所以我试了一下:
java -cp imagecompositor.jar ass3.ImageCompositor img1.png img2.png 0 0但是它抛出了一个NoClassDefFoundError
Exception in thread "main" java.lang.NoClassDefFoundError: ass3/Blender
at ass3.ImageCompositor.main(ImageCompositor.java:113)Blender类中有一行package ass3。我做错了什么?
我想提供更多信息,但我不知道如何获取堆栈跟踪等。
发布于 2011-12-08 05:14:36
您需要将Blender类添加到类路径中。
命令行
java -cp imagecompositor.jar ...使用imagecompositor.jar的类路径。这将告诉Java虚拟机(JVM)查看jar文件。它没有告诉JVM要做的是查找您的类。如果您已经将它们打包到一个jar文件中,您应该这样做
java -cp imagecompositor.jar;myclasses.jar ...如果.class文件在根目录为path/to/someRoot的树中(例如,类ass3.Blender应该在path/to/someRoot/ass3/Blender.class中),那么您应该对根目录使用相同的语法,而不是.jar文件(我认为这是正确的,找不到文档):
java -cp imagecompositor.jar;path/to/someRoot ...发布于 2011-12-08 05:30:27
Blender类位于何处?为了被正确地找到,你的搅拌器类(在包"ass“中)必须位于相对于你当前目录的名为”ass“的目录中。如果是这样(并且您没有从默认类路径中删除当前控制器. ),则不需要修改类路径。
然而,在你的例子中,你需要修改类路径(为了指定提供的jar文件),并且在你的post 中列出的命令 .从路径中删除。因此,您必须执行以下操作:
java -cp whatever.jar;. whatever_other_parameters(请注意“;”。附加到-CP参数。)这会将当前目录放回类路径中。
发布于 2011-12-08 07:47:11
在静态构造函数中,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从命令行运行东西的方式。
https://stackoverflow.com/questions/8422633
复制相似问题