Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Could Not find the main class


Автор: ArsNov 21.12.2011, 12:45
Сделал в эклипсе жарник.
Хочу запустить его, ввожу:
Код

java -jar twi.jar


Получаю:
Код

 Exception in thread "main" java.lang.NoClassDefFoundError: ru/arsnov/twitter/mentions/TwiMentions

Если запустить двойным кликом выдает: 
Код

Could Not find the main class


В MANIFEST.MF прописано: 

Код

Manifest-Version: 1.0
Class-Path: C:/ C:/Users/Arseniy/Downloads/twitter4j-2.2.5/lib/twitter4j-async-2.2.5.jar C:/Users/Arseniy/Downloads/twitter4j-2.2.5/lib/twitter4j-core-2.2.5.jar C:/Users/Arseniy/Downloads/twitter4j-2.2.5/lib/twitter4j-examples-2.2.5.jar C:/Users/Arseniy/Downloads/twitter4j-2.2.5/lib/twitter4j-media-support-2.2.5.jar C:/Users/Arseniy/Downloads/twitter4j-2.2.5/lib/twitter4j-stream-2.2.5.jar
Main-Class: ru.arsnov.twitter.mentions.TwiMentions


JRE 1.4.2.

Где допустил ошибку. Погуглил, везде все сводится к тому что не прописан main-class или отсутствуют нужные данные в classpath. Но я все прописал, а ошибка не исчезает. Прикрепил этот жарник к теме.



Автор: mstalker26 21.12.2011, 13:59
jar генерировали из эклипса с помощью export... ? Манифест как-то чудно вглядит, если можете выложите скриншоты того, как делали (каждое окно, когда экспортируете)

Автор: Samotnik 21.12.2011, 14:04
ArsNov, в конце файла должна быть пустая строка. Есть?

Автор: ArsNov 21.12.2011, 15:11
Цитата(mstalker26 @ 21.12.2011,  13:59)
jar генерировали из эклипса с помощью export... ? Манифест как-то чудно вглядит, если можете выложите скриншоты того, как делали (каждое окно, когда экспортируете)

Точно, с помощью экспорта. Манифест правил вручную, после экспорта он получился такой: 
Код

Manifest-Version: 1.0
Main-Class: ru.arsnov.twitter.mentions.TwiMentions

Естественно, он не завелся, так как отсутствуют пути к используемым жаркам.
Пришлось добавить класпас через notepad.
Перенос строки в конце файла присутствует.

Прикрепил прописанные в класспасе жарники, можете проверить запустится ли у Вас?
 Спасибо за интерес к проблеме  smile 

Автор: mstalker26 21.12.2011, 16:08
Цитата(ArsNov @ 21.12.2011,  14:11)
...
Манифест правил вручную...
Естественно, он не завелся, так как отсутствуют пути к используемым жаркам.
Пришлось добавить класпас через notepad
...

Я предполагал, что Вы правили манифест smile (переносы строк забавно в jar выглядят), поэтому и попросил скрины сбросить, как экспорт делали.

Попробуйте так.
1) Убедитесь что Ваши библиотеки прописаны в свойствах проекта

user posted image

2) Export... (теперь важно) -> Runnable JAR file (не забудьте указать Copy required libraries into a sub-folder next to the generated jar). Хотя можете выбрать первый пункт (тогда библиотеки будут запакованы в Ваш jar).

user posted image

И все. Рядом с Вашим jar-ом будет папка {имя-jar}_lib, в ней будут находится нужные библиотеки, а в самом jar-е будет правильный Class-Path. 

P.S. для факультатива http://skipy.ru/technics/likbez.html#hello smile
P.P.S. если что не получается, пишите.

Автор: ArsNov 21.12.2011, 16:50
Спасибо! Видимо придется почитать и вникнуть  smile 
У меня отсутствует пункт  Runnable JAR file (см. скриншот 1.)
Я делал так:

1.
user posted image
2.
user posted image
3.
user posted image
4.
user posted image
5.
user posted image

Сейчас для проверки сделал проект с одним единственным классом и без подключения внешних библиотек. Сделал экспорт - все заработало, как только прописал библиотеки в манифесте, как в моем первом сообщении- получил ошибку. 
По вашей ссылочке вычитал:
Код

приложение, использующее стороннюю библиотеку, собирается в jar-файл и запускается командой java -jar <имя jar-файла>, после чего и появляется данная ошибка. Происходит это по следующей причине: при запуске приложения именно таким образом, с ключом интерпретатора -jar, в classpath включается один единственный файл – тот самый, который указывается в командной строке. Все остальные библиотеки – описаные в переменной CLASSPATH, указаные через ключ -classpath, – все они ИГНОРИРУЮТСЯ. Единственный способ этого избежать (и найден он – вот ведь поразительный факт! – опять-таки в документации) – указать в файле manifest.mf атрибут Class-Path – список относительных путей (обращаю особое внимание – относительных, относительно этой библиотки!) к необходимым библиотекам. Разделяются эти пути пробелами. Естественно, при этом работает и обычный вариант – указывать в явном виде classpath, включая туда все библиотеки, и имя исполняемого класса.

Судя по этим словам ошибка моя в том, что я прописал абсолютный путь или как это понимать? Можете прислать примерчик манифеста который сгенерировал ваш эклипс? Пока попробую запихнуть руками все либы в архив и пропишу относительный путь ))

Добавлено через 8 минут и 50 секунд
Не, не понял.

Запихнул в архив папку с библиотеками, в манифесте поправил:

Код

Manifest-Version: 1.0
Class-Path: lib/twitter4j-async-2.2.5.jar lib/twitter4j-core-2.2.5.jar lib/twitter4j-examples-2.2.5.jar lib/twitter4j-media-support-2.2.5.jar lib/twitter4j-stream-2.2.5.jar
Main-Class: ru.arsnov.twitter.mentions.TwiMentions

Теперь при запуске java -jar twi.jar: Exception in thread "main" java.lang.NoClassDefFoundError: twitter4j/UserStreamListener
По двойному клику - не могу найти мейн класс.

Автор: ArsNov 22.12.2011, 08:37
Разобрался, заработало. Положил библиотеки в папку lib, которая находится на одном уровне с исполняемым jar файлом. Прописал в MANIFEST.MF: Class-Path: lib/twitter4j-async-2.2.5.jar .....

Спасибо за помощь!  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)