使用Jaudiotagger的Jar文件,NoClassDefFoundError

时间:2014-02-07 02:12:44

标签: java jar noclassdeffounderror id3

我使用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

然后用Exception替换了Jaudiotagger中使用的所有(两个)错误类,并重新创建了jar。现在,当我运行它们时(使用Java(TM)Platform SE二进制文件,或者通过在命令提示符下写入id3tag.jar),看起来所有其他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文件? (另外,如果有人需要它,我怎么能得到满满的错误,而不是仅仅说“x更多”?)

我对这种狗屎不是很精明所以答案越具体越好。感谢。

我在Windows 8和最新的java(1.7.0_17)。

2 个答案:

答案 0 :(得分:0)

这告诉您没有主类,因为您可能已经或可能不知道几乎所有非基于Web的编程语言中的所有程序都必须有一个主类来开始。在java中它看起来像这个

public static int main(String [] args){

}

该消息通知您此类已不存在,这可能是编译器错误或完全不同的内容。

请再次尝试下载库,并为java ee开发人员下载eclipse ide。 这个ide有一个内置的编译器,有时会比命令行更好。

我希望这会有所帮助。

答案 1 :(得分:0)

我通过在我的.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 org

jar文件使用java -jar id3tag.jar,但只是编写id3tag.jar仍然没有做任何事情。事实证明这是因为jar文件默认由javaw.exe文件运行,所以你必须右键单击jar文件 - >打开 - >选择默认程序并导航到java文件夹中的java.exe文件(只需搜索该文件夹)。运行.jar然后得到“错误:无法找到或加载主类路径\ id3tag.jar”。我通过使用.bat文件解决了这个问题。我进入了

java -jar path\id3tag.jar

进入记事本并保存为whatevername.bat(另存为类型:所有文件)。

我创建了一个新问题,让.jar文件正常工作。请参阅.jar error - could not find or load main class