我使用Jaudiotagger库创建了一个java类,它运行时没有问题。然后我用它做了一个罐子,我得到了NoClassDefFoundError。事情是这样进行的:
我将主类id3tag.java和库jaudiotagger 2.0.3.jar放在一个文件夹中,并使用命令行进行编译。节目顺利进行,没有问题。
javac -cp .;jaudiotagger-2.0.3.jar id3tag.java
java -cp .;jaudiotagger-2.0.3.jar id3tag然后我创建了清单和jar文件。
echo Main-Class: id3tag >manifest.txt
jar cvfm id3tag.jar manifest.txt id3tag.class jaudiotagger-2.0.3.jar我得到了以下输出:
added manifest
adding: id3tag.class(in = 5952) (out= 2997)(deflated 49%)
adding: jaudiotagger-2.0.3.jar(in = 811441) (out= 740599)(deflated 8%)然后运行jar文件,得到“发生了Java异常”。我也试过:
java -jar id3tag.jar我得到了输出:
Exception in thread "main" java.lang.NoClassDefFoundError: org/jaudiotagger/tag/
FieldDataInvalidException
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2451)
at java.lang.Class.getMethod0(Class.java:2694)
at java.lang.Class.getMethod(Class.java:1622)
at sun.launcher.LauncherHelper.getMainMethod(LauncherHelper.java:494)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:486)
Caused by: java.lang.ClassNotFoundException: org.jaudiotagger.tag.FieldDataInval
idException
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
... 6 more然后,我用异常替换了所有(这两个)错误类,并重新创建了jar。现在,当我运行其他所有jar文件(使用Java(TM)平台SE二进制文件,或者通过在命令提示符中编写id3tag.jar )时,也会发生同样的事情--什么都没有。然而,java -jar起作用,给了我一个运行时错误。
Exception in thread "main" java.lang.NoClassDefFoundError: org/jaudiotagger/audi
o/AudioFileIO
at id3tag.tagSong(id3tag.java:112)
at id3tag.tagAlbum(id3tag.java:82)
at id3tag.tagArtist(id3tag.java:40)
at id3tag.main(id3tag.java:170)
Caused by: java.lang.ClassNotFoundException: org.jaudiotagger.audio.AudioFileIO
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
... 4 more好像整个图书馆都对我没什么好处。如何解决这个问题,以及如何在没有java -jar的情况下运行jar文件?(此外,如果有人需要,我如何得到完整的“o”错误,而不是仅仅让它说"x更多“?)
我对这类东西不太了解,所以答案越具体越好。谢谢。
我使用的是windows 8和最新的java (1.7.0_17)。
发布于 2014-02-08 22:40:13
为此,我在我的.jar中包含了jaudiotagger中的org文件夹,而不是实际的.jar文件,然后我使用了一个.bat文件来运行它,而不是直接运行.jar。如果您找到了更好的解决方案,可以随意添加您自己的答案,我会检查的。
我使用winrar解压jaudiotagger 2.0.3.jar,以便org文件夹与我的主类位于同一个文件夹中。然后,我可以编译并运行主类,只需:
javac id3tag.java
java id3tag然后,我以与前面相同的方式创建了清单文件,并创建了jar:
jar cvfm id3tag.jar manifest.txt id3tag.class orgjar文件与java -jar id3tag.jar一起工作,但是简单地编写id3tag.jar仍然什么也做不了。原来这是因为jar文件默认由javaw.exe文件运行,所以您必须右键单击->打开的jar文件,选择默认程序,然后导航到java文件夹中的java.exe文件(只需搜索文件夹)。然后运行.jar将获得"Error:未能找到或加载主类path\id3tag.jar“。我使用了一个.bat文件来解决这个问题。我进去了
java -jar path\id3tag.jar放入记事本并保存为whatevername.bat (另存为类型:所有文件)。
为了使.jar文件正常工作,我创建了一个新的问题。见.jar error - could not find or load main class。
发布于 2014-02-07 02:25:20
这是告诉您,您没有主类,因为您可能已经或者可能不知道几乎所有非基于web的编程语言中的所有程序都必须有一个主类来开始。在java中,它看起来如下所示
公共静态int main(String[] args){
}
消息是通知您这个类不再存在,这可能是编译器错误或完全不同的东西。
请再次下载库,并为java ee开发人员下载eclipse。这个ide有一个内置编译器,有时比命令行工作得更好。
希望这能帮上忙。
https://stackoverflow.com/questions/21618009
复制相似问题