Я сделал класс java, используя библиотеку Jaudiotagger, и он работает без проблем. Затем я сделал из него банку и получил 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
Затем я заменил все (оба) классы ошибок, используемые в Jaudiotagger, на Exception и воссоздал банку. Теперь происходит то же самое, что и для всех других файлов jar, когда я запускаю их (с двоичным файлом Java (TM) 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
Мне кажется, что вся библиотека ни хрена мне не нужна. Как это исправить и как заставить файлы jar работать без java -jar? (Кроме того, как мне получить полную кучу ошибок на случай, если она кому-то понадобится, а не просто сказать «x more»?)
Я не очень разбираюсь в этом дерьме, поэтому чем конкретнее ответ, тем лучше. Спасибо.
У меня Windows 8 и последняя версия Java (1.7.0_17).