2011-01-13 5 views
1

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

Как в моем пути построения проекта, так и в пути класса я включил библиотеки 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

+0

- это пространство в '... javax/mai l/internet ...' проблема с копированием/вставкой или выходом с чередованием? –

+0

Да, проблема с копией/вставкой. – Graham

ответ

2

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

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

А потом просто иметь Lib папку с mail.jar в ней в той же папке, что экспортируемая банка будет быть в. Бум.

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

0

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

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

java -cp lib/\* 

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

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

+0

Это определенно в моем пути к классу, вот записи прямо здесь: \t ' \t ' – Graham

+0

Нет, это не так, иначе вы бы не получили это исключение. Эти записи библиотеки предназначены для среды компиляции и выполнения eclipse, а не для вашей автономной среды. Вот почему он работает в eclipse, вам нужно установить путь к той папке, где расположены ваши библиотеки. – eglobetrotter

+0

Я добавил их, загрузив их отдельно с веб-сайта Java, разместив их в своей папке lib, а затем добавив их в путь сборки проекта. Они вообще не отображаются в файле манифеста экспортированной банки. Тем не менее, они появляются в папке lib внутри банки. Что мне здесь не хватает? – Graham

1

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

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

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

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

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

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

Вы могли бы найти этот вопрос SO отношение: Classpath including JAR within a JAR

+0

@Graham, см. Мои правки. Я не совсем понимаю, как вы думаете, что задаете путь к классам. Если я правильно понимаю вашу ситуацию, вам нужно будет изменить способ экспорта из eclipse. Ссылка, содержащаяся в конце, объясняет, почему наличие банки внутри банки не работает. –

0

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

System.getProperties().store(System.out, "boot props"); 
Смежные вопросы