java.lang.NoClassDefFoundError в командной строке - PullRequest
1 голос
/ 14 января 2011

Я разрабатываю приложение в Eclipse, и оно прекрасно работает в Eclipse. Проблема у меня заключается в том, что когда я экспортирую его в файл JAR и запускаю его из командной строки, я получаю ошибку NoClassDefFound для javax.mail.internet.

В моем пути сборки проекта и пути к классам я включил библиотеки activ.jar и mail.jar, необходимые для использования javax.mail.internet, и, как я уже сказал, он отлично работает в Eclipse, но не при экспорте это банку. Если мой путь сборки содержит эти файлы, и мой путь к классу почему бы это не сработало?

Вот стек ошибок: Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: javax/mai l/internet/InternetAddress at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.setPressed(Unknown Source) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Sour ce) at java.awt.Component.processMouseEvent(Unknown Source) at javax.swing.JComponent.processMouseEvent(Unknown Source) at java.awt.Component.processEvent(Unknown Source) at java.awt.Container.processEvent(Unknown Source) at java.awt.Component.dispatchEventImpl(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Window.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source) Caused by: java.lang.ClassNotFoundException: javax.mail.internet.InternetAddress at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) ... 27 more

Ответы [ 4 ]

2 голосов
/ 14 января 2011

Ух, я чувствую себя полным идиотом. Все, что вам нужно сделать, это при экспорте в JAR-файл, вместо того, чтобы выбрать «JAR-файл» в Eclipse, выбрать «Runnable JAR-файл», а затем сказать ему, чтобы он упаковал в него необходимые библиотеки, чтобы он был маленьким и ва-ля, все работает хорошо .

Другой вариант - добавить эту строку в файл манифеста при создании jar: Class-Path: lib/mail.jar

А затем просто поместите папку lib с mail.jar в той же папке, в которой будет находиться экспортированный jar. Boom.

Первый вариант, на мой взгляд, лучший.

1 голос
/ 14 января 2011

Это почти наверняка проблема с classpath. Попробуйте открыть JAR, который вы экспортировали (через winzip, или переименуйте в .zip и используйте windows) и либо изучите структуру папок jarred, чтобы определить, существует ли «javax / mail / internet /» и содержится ли в нем файл InternetAddress.class. Или откройте файл MANIFEST.MF, расположенный в JAR-файле, чтобы определить, что он содержит запись пути к классу, а файлы, указанные в манифесте, существуют в местах, указанных в манифесте.

Edit: Проверьте свой путь к классу среды выполнения, распечатав его из системного свойства в JVM.

System.out.println(System.getProperty("java.class.path"));

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

Обычно файлы jar не содержатся внутри jar. Существует два распространенных способа экспорта исполняемого файла:

  1. Jar-файлы ваших классов и включает манифест, который указывает путь к классам, где JVM может найти другие библиотеки, относящиеся к вашей собственной.
  2. Jar файлы вашего класса вместе с содержимым других jar в один jar. Скорее всего, это то, что вам нужно, и это можно сделать с помощью мастера eclipse «export ...> Runnable JAR File». Обязательно используйте «Runnable JAR File» и выберите правильные конфигурации запуска.

Возможно, вы найдете этот ТАК вопрос актуальным: Classpath, включая JAR в JAR

0 голосов
/ 14 января 2011

добавьте mail.jar в ваш classpath и убедитесь, что ваш начальный каталог является родителем lib (последний кажется наиболее вероятной проблемой)Вы можете начать свой основной метод с чего-то вроде:

System.getProperties().store(System.out, "boot props");
0 голосов
/ 14 января 2011

Возможно, что-то, от чего зависит тот класс, от которого зависит пакет javax.mail (транзитивная зависимость). Но я бы сначала перепроверил classpath; Исполняемый файл командной строки Java вообще не указывает отсутствующие каталоги (или несуществующие упомянутые jar-файлы) - я иногда смешивал точку с запятой и двоеточие в качестве разделителя пути, и это приводит к тому, что классы не найдены.

Одна приятная вещь, которую наконец-то получила JDK 1.6, была возможность определять подстановочные знаки, которые вы можете сделать:

  java -cp lib/\*

(обратная косая черта использовалась для обозначения звездочки, поэтому оболочка Unix ее не расширяет)

, который будет включать все jar-файлы из каталога 'lib /'; чтобы вам не приходилось вручную добавлять все отдельные файлы jar в этот каталог.

...