Не удалось запустить файл jar в Windows

У меня есть эти файлы board.class и x4.class (x4.class имеет метод main()).

Чтобы запарить эти файлы, я написал

jar cf x4.jar *.class

и получил файл x4.jar.

Я скопировал этот файл x4.jar на рабочий стол (в Windows Vista) и дважды щелкнул его. Я получаю эту ошибку:

Не удалось загрузить атрибут манифеста основного класса из C:\Users\eSKay\Desktop\x4.jar

Что мне сделать, чтобы этот файл запускался как исполняемый файл jar (без установки какого-либо программного обеспечения)?


ОБНОВЛЕНИЕ: я использовал файл манифеста для устранения проблемы. У меня есть файл jar, который мне нужен, и он работает нормально, если вы это сделаете:

java -jar x4.jar

Но когда я дважды щелкаю x4.jar, ничего не происходит, я проверил диспетчер задач и обнаружил, что javaw.exe запускается в фоновом режиме, но он не показывает вывод, который давала исходная программа.

В чем может быть проблема?


person Lazer    schedule 06.10.2009    source источник
comment
У меня такая же проблема. У меня есть правильный файл манифеста, и я запускал jar-файлы раньше на своем старом компьютере, но по какой-то причине у меня возникли проблемы с моим новым (под управлением 64-разрядной версии Windows 7). Мне удалось запустить файл jar в cmd, но когда я нажимаю на него, ничего не происходит. Я переустановил java с помощью jdk и jre 6 (сначала удалил старую версию) и установил свои пути. javac и java отлично работают в cmd. также в свойствах говорится, что он открывается «Java(tm) platform SE binary»   -  person    schedule 13.06.2011


Ответы (2)


Вам необходимо создать файл манифеста который содержит атрибут Main-Class для указания точки входа. Затем используйте флаг «m» в команде jar, чтобы указать его. Например, у вас может быть файл с именем manifest.txt:

Manifest-Version: 1.0 
Main-Class: x4    

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

Затем запустите:

jar cfm x4.jar manifest.txt *.class

Чтобы проверить это, запустите:

java -jar x4.jar
person Jon Skeet    schedule 06.10.2009
comment
Если вы правильно указали атрибут, вы не получите точно эту ошибку. Пожалуйста, опубликуйте содержимое файла манифеста. Запустите jar tvf x4.jar, чтобы убедиться, что файл jar действительно содержит манифест — он будет там как meta-inf/MANIFEST.MF IIRC. - person Jon Skeet; 06.10.2009
comment
@Jon ранее я не создавал никаких файлов манифеста. После того, как вы сказали мне, я просто скопировал эти две строки в свой файл manifest.txt. jar tvf x4.jar показывает, что файл манифеста присутствует. скриншот - imgur.com/7YHAS.jpg . Это передо мной, почему-то я получаю точно такую ​​​​же ошибку! - person Lazer; 06.10.2009
comment
На самом деле, я думаю, что вы получите файл META-INF/MANIFEST.MF, несмотря ни на что. Но если вы используете параметр m, то вы можете переопределить параметр по умолчанию. Итак, @eSKay, вы можете попробовать извлечь JAR-файл и убедиться, что манифест именно тот, который вам нужен? - person Matt Solnit; 06.10.2009
comment
@ Мэтт, ты прав, я распаковал его, и файл манифеста - это не то, что я предоставил. Что я делаю не так? Мой файл манифеста (нераспакованная версия) гласит: Версия манифеста: 1.0 Создано: 1.6.0 (Sun Microsystems Inc.) - person Lazer; 06.10.2009
comment
@eSKay - убедитесь, что после строки Main-Class: x4 у вас есть символ новой строки или возврата каретки. Я знал, что @Jon был прав, но хотел посмотреть, есть ли какие-то странности. В 1-м я получил ту же ошибку. Но потом я вспомнил, что тебе нужен CR/LF. Я нашел следующее утверждение: Предупреждение: Текстовый файл должен заканчиваться новой строкой или возвратом каретки. Последняя строка не будет проанализирована должным образом, если она не заканчивается новой строкой или возвратом каретки. здесь: java.sun.com/docs/books/tutorial/ развертывание/jar/appman.html - person Billy Bob Bain; 06.10.2009
comment
Уэйн прав - без новой строки в конце бит основного класса будет удален. Я отредактирую ответ, чтобы сделать это более понятным. - person Jon Skeet; 06.10.2009
comment
Только что проверил, возврат каретки тоже есть. каким-то образом файл манифеста, включенный в x4.jar, является файлом по умолчанию, а не тем, который я предоставляю. - person Lazer; 06.10.2009
comment
И вы используете именно ту командную строку, которую я предоставил? Я только что попробовал, и все было в порядке после того, как я добавил туда дополнительный разделитель строки. - person Jon Skeet; 06.10.2009
comment
да, мне не хватало ограничителя строки, он показывался нормально в Notepad ++, но его не было, когда я открывал файл через vi (используя SSH для Linux-машины). Поэтому я добавил его, и теперь ошибка исчезла. Но когда я дважды щелкаю x4.jar, ничего не происходит, я проверил диспетчер задач и обнаружил, что javaw.exe запускается в фоновом режиме, но он не показывает вывод, который давала исходная программа. - person Lazer; 07.10.2009
comment
Что происходит, когда вы запускаете java -jar x4.jar из командной строки? - person Jon Skeet; 07.10.2009
comment
@Jon, так все работает нормально. в чем может быть проблема? - person Lazer; 07.10.2009

Я думаю, что @Jon прав, просто убедитесь, что вы заканчиваете файл CR/LF.

Установка точки входа приложения

Предупреждение: Текстовый файл должен заканчиваться новой строкой или возвратом каретки. Последняя строка не будет проанализирована должным образом, если она не заканчивается новой строкой или возвратом каретки.

Или вы можете позволить программе jar автоматически создать для вас атрибут Main-Class.

Флаг «e» (для «точки входа»), представленный в JDK 6, создает или переопределяет атрибут Main-Class манифеста. Его можно использовать при создании или обновлении файла jar. Используйте его, чтобы указать точку входа приложения без редактирования или создания файла манифеста. Например, эта команда создает app.jar, где значение атрибута Main-Class в манифесте установлено на MyApp:

jar cfe app.jar MyApp MyApp.class

Вы можете напрямую вызвать это приложение, выполнив следующую команду:

java -jar app.jar

Если имя класса точки входа находится в пакете, оно может использовать '.' (точка) в качестве разделителя. Например, если Main.class находится в пакете с именем foo, точка входа может быть указана следующими способами:

jar cfe Main.jar foo.Main foo/Main.class
person Billy Bob Bain    schedule 06.10.2009
comment
(тот же комментарий, что и к сообщению Джона) да, мне не хватало разделителя строки, он показывался нормально в Notepad ++, но его не было, когда я открывал файл через vi (используя SSH для Linux-машины). Поэтому я добавил его, и теперь ошибка исчезла. Но когда я дважды щелкаю x4.jar, ничего не происходит, я проверил диспетчер задач и обнаружил, что javaw.exe запускается в фоновом режиме, но он не показывает вывод, который давала исходная программа. - person Lazer; 07.10.2009