繁体   English   中英

带有Jaudiotagger,NoClassDefFoundError的Jar文件

[英]Jar file with Jaudiotagger, NoClassDefFoundError

我使用库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。 现在,似乎所有其他jar文件(使用Java™Platform 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文件? (此外,如果有人需要它,而不是仅仅说“ x多”,我如何获得全部错误)?

我不太了解这种答案,所以答案越具体越好。 谢谢。

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

这是在通知您您没有主类,因为您可能已经或可能不知道几乎所有非基于Web的编程语言中的所有程序都必须具有主类。 在java中看起来像这样

public static int main(String [] args){

}

消息通知您该类不再存在,这可能是编译器错误或完全不同的东西。

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

我希望这会有所帮助。

我通过将jaudiotagger的org文件夹(而不是实际的.jar文件)包含在我的.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

放入记事本并另存为whatname.bat(另存为:所有文件)。

我为使.jar文件正常工作创建了一个新问题。 请参阅.jar错误-找不到或加载主类

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM