Вопрос

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

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

Вот стек ошибок: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

Это было полезно?

Решение

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

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

А затем просто возьмите папку LIB с Mail.jar в ней в той же папке, в которой будет экспортированная банка. Бум.

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

Другие советы

Это почти наверняка проблема с тропинкой. Попробуйте открыть экспорт, которую вы экспортировали (через Winzip, или переименовать в .zip и использовать Windows), и либо осмотрите структуру папки Jarred, чтобы определить, что «Javax/Mail/Internet/» существует и файл InternetAddress.class содержится с ним. Или откройте manifest.mf, расположенный в банке, чтобы определить, что он содержит запись в классе, а банки, указанные в манифесте, существуют в местах, указанных в манифесте.

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

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

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

Обычно файлы JAR не содержатся в банке. Есть два общих способа экспорта исполняемой банки:

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

Вы можете найти это так актуально:Путь, включая JAR в банке

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

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

  java -cp lib/\*

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

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

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

System.getProperties().store(System.out, "boot props");
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top