簡體   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