我使用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)。
答案 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。