Ошибка Java при использовании JAR, java.lang.NoClassDefFoundError: javax/mail/Store

Я делаю Java-приложение, использующее Javamail, и оно отлично работает, когда я его компилирую. Я хочу превратить его в файл jar, чтобы его можно было легко перемещать и выполнять. Проблема в том, что я получаю эту ошибку, когда пытаюсь запустить банку из строки cmd

java -jar ActriveTray2.jar

Exception in thread "main" java.lang.NoClassDefFoundError: javax/mail/Store
        at stockApp.init(stockApp.java:11)
        at ActiveTray.main(ActiveTray.java:31)
        Caused by: java.lang.ClassNotFoundException: javax.mail.Store
        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)

Вот что в моем файле jar

  • изображения/лоток.gif
  • META-INF/MANIFEST.MF
  • ActiveTray.класс
  • ActiveTray.java
  • класс конфигурации
  • config.java
  • GmailFetch.class
  • GmailFetch.java
  • stockApp$1.класс
  • stockApp.класс
  • stockApp.java

Я думаю, что проблема в classpath, где jar не знает, где живет jar javamail. Мой путь к классам установлен правильно, когда я выполняю код (java ActiveTray2), он отлично работает... помогите :(


person Rob    schedule 24.06.2011    source источник


Ответы (4)


вам нужно добавить банки, от которых вы зависите, в файл манифеста, а также добавить их в создаваемую банку. java -jar будет игнорировать путь к классам вашей среды по дизайну. Из документации по Java:

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

поэтому вы можете добавить строку в свой файл манифеста, например:

Class-Path: mail.jar

в ваш файл манифеста.

person Paul Sanwald    schedule 24.06.2011
comment
Спасибо, но я думаю, что не знаю, как обновить файл манифеста, чтобы сделать это. Я добавил Class-Path: mail.jar в свой манифест, но он все еще не работает... - person Rob; 24.06.2011
comment
Конечно, банка также должна быть в нужном месте, когда вы запускаете приложение. - person Jesper; 24.06.2011
comment
Итак, я добавляю mail.jar в свою собственную банку? Я просто не знаю, как ссылаться на него, чтобы путь к классам был правильным? И я гуглил это в течение часа... - person Rob; 24.06.2011
comment
Роб, в моем примере выше, mail.jar должен быть в корне вашей банки. вы также можете поместить его в каталог, но тогда вам нужно будет указать этот каталог в директиве Class-Path манифеста. - person Paul Sanwald; 24.06.2011
comment
Роб, когда вы используете jar -tvf myjar.jar, вы видите lib/mail.jar? - person Paul Sanwald; 24.06.2011
comment
Итак, у вас есть lib/mail.jar в вашем манифесте, и вы видите lib/mail.jar в создаваемой вами банке, и вы уверены, что lib/mail.jar содержит javax.mail.Store? - person Paul Sanwald; 24.06.2011
comment
не положительный на последнюю часть... посмотрю. Код отлично компилируется, когда я запускаю его из строки cmd, просто когда я его запускаю, путь к классам становится напуганным - person Rob; 24.06.2011
comment
Добавьте к своему вопросу структуру каталогов вашего проекта и путь к mail.jar. Возможно, вы устали и просто что-то перепутали. - person MockerTim; 24.06.2011
comment
images/tray.gif lib/activation.jar lib/mail.jar META-INF/MANIFEST.MF ActiveTray.class ActiveTray.java config.class config.java GmailFetch.class GmailFetch.java stockApp$1.class stockApp.class stockApp.java - person Rob; 27.06.2011
comment
и это мой манифест Версия манифеста: 1.0 Путь к классу: lib/mail.jar Создано: 1.6.0_22 (Sun Microsystems Inc.) Основной класс: ActiveTray - person Rob; 27.06.2011
comment
Роб, это действительно должно работать. можете ли вы проверить, что mail.jar содержит класс, на который он жалуется? вы можете найти это. в качестве последнего усилия вы можете попробовать переместить его из библиотеки в корень. в вашем основном классе вы можете system.out.println указать путь к классам, который он использует, и посмотреть, присутствует ли mail.jar - person Paul Sanwald; 27.06.2011
comment
Привет, Пол, я открыл mail.jar и вижу класс Store, значит, он существует. Все еще не работает... строка Class-Path в манифесте может быть lib/mail.jar, верно? или lib.mail.jar? - person Rob; 27.06.2011
comment
Привет, Пол, могу я отправить тебе свой код, чтобы посмотреть, сможешь ли ты заставить его работать? Я все еще получаю ошибку.... - person Rob; 28.06.2011
comment
у меня заработало! - как бы. Я поместил mail.jar и активацию.jar в ту же папку, что и мой test.jar, и это сработало? Я обновил свой манифест, чтобы вместо lib/mail.jar использовать активацию mail.jar.jar. Думаю, я понял это сейчас. сообщу, когда он работает отлично - person Rob; 28.06.2011
comment
как и в зависимых ресурсах jar (mail.jar и т. д.), они не живут в моей собственной банке, они отправляются вместе с ней и могут жить в папке lib, чтобы все было в порядке... моя ошибка заключалась в том, чтобы поместить их в мою банку , в папке с именем lib.... - person Rob; 28.06.2011
comment
да! это сработало. вау, я сделал гору из мухи слона на этом ... так что теперь я знаю, что любые дополнительные файлы jar живут за пределами моего собственного jar (не включены в него) ... спасибо Пол за всю вашу помощь - person Rob; 28.06.2011

Когда вы запускаете исполняемый jar-файл в java, путь к классам игнорируется, как переменная среды, так и путь к классам командной строки. Вы должны указать его в файле манифеста вашего исполняемого файла jar.

Вот некоторая информация из википедии:

Ваш манифест должен включать:

Main-Class: org.mypackage.HelloWorld
Class-Path: lib/supportLib.jar
<additional line feed and carriage return>

В class-path будет указано расположение используемых вами библиотек относительно расположения вашего основного исполняемого jar-файла.

С уважением, Стефан

person Snicolas    schedule 24.06.2011

Необходимые jar-файлы реализации почты должны присутствовать в вашем пути к классам.

person rahulmohan    schedule 24.06.2011

Та же проблема, с которой я столкнулся в своем проекте. Причина в том, что файл jar отсутствует или не находится в пути к классу. Два шага для решения этой проблемы.

  1. Сначала добавьте JavaMail API 1.4.7 jar к пути к классу.

  2. Затем добавьте ту же банку в серверную библиотеку. В моем приложении я использовал Apache tomcat 7. Я поместил банку в папку lib

person RED.Skull    schedule 12.06.2013