Jar-файл с Jaudiotagger, NoClassDefFoundError

Я сделал класс 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).


person Blrp    schedule 07.02.2014    source источник
comment
Просто для примечания: это не последняя версия Java.   -  person jmj    schedule 07.02.2014
comment
Странный. Я устанавливал его несколько раз, и веб-сайт продолжает говорить, что у меня последняя версия, а установщик называется chromeinstall-7u51.exe, но когда я ввожу java -version, я получаю 1.7.0_17.   -  person Blrp    schedule 07.02.2014
comment
Проблема не в версии Java, а в неправильном пути к классу.   -  person jmj    schedule 07.02.2014
comment
Как правильно тогда настроить?   -  person Blrp    schedule 07.02.2014
comment
Найдите банку с этим классом и добавьте ее в путь к классу.   -  person jmj    schedule 07.02.2014
comment
Разве это не то, что я уже сделал, добавив его в качестве опции для javac и jar? Во всяком случае, я попытался установить переменную среды, установив CLASSPATH=[...]\jaaudiotagger-2.0.3.jar, и это не помогло.   -  person Blrp    schedule 07.02.2014


Ответы (2)


это информирует вас о том, что у вас нет основного класса, поскольку вы можете или не можете уже знать, что все программы почти на всех языках программирования, не связанных с сетью, должны иметь основной класс для начала. В джаве это выглядит так

public static int main(String[] args){

}

Сообщение информирует вас о том, что этого класса больше нет, это может быть ошибка компилятора или что-то совершенно другое.

попробуйте снова загрузить библиотеку и загрузить eclipse ide для разработчиков Java EE. этот ide имеет встроенный компилятор, который иногда работает лучше, чем командная строка.

Я надеюсь, что это помогло.

person daniel    schedule 07.02.2014

Я работал над этим, включив папку org из jaudiotagger в свой .jar вместо фактического файла .jar, а затем я использовал файл .bat для его запуска вместо прямого запуска .jar. Не стесняйтесь добавлять свой собственный ответ, если найдете лучшее решение, и я вернусь.

Я распаковал jaudiotagger-2.0.3.jar с помощью winrar, чтобы папка org оказалась в той же папке, что и мой основной класс. Затем я мог бы скомпилировать и запустить основной класс просто:

javac id3tag.java
java id3tag

Затем я создал файл манифеста так же, как и раньше, и создал банку:

jar cvfm id3tag.jar manifest.txt id3tag.class org

Файл jar работал с java -jar id3tag.jar, но простое написание id3tag.jar ничего не дало. Оказывается, это потому, что файлы jar по умолчанию запускаются файлом javaw.exe, поэтому вам нужно щелкнуть правой кнопкой мыши файл jar -> открыть с помощью -> выбрать программу по умолчанию и перейти к файлу java.exe в папке java (просто выполните поиск Папка). После запуска .jar вы получите сообщение «Ошибка: не удалось найти или загрузить путь к основному классу\id3tag.jar». Я работал над этим, используя файл .bat. Я вошел

java -jar path\id3tag.jar

в Блокнот и сохранить как любое имя.bat (сохранить как тип: все файлы).

Я создал новый вопрос, чтобы файл .jar работал правильно. См. .jar error - не удалось найти или загрузить основной класс.

person Blrp    schedule 08.02.2014