Не могу выполнить jar-файл: "нет основного атрибута манифеста" - PullRequest
798 голосов
/ 13 марта 2012

Я установил приложение, когда я пытаюсь его запустить (это исполняемый файл jar), ничего не происходит. Когда я запускаю его из командной строки с помощью:

java -jar "app.jar"

Я получаю следующее сообщение:

без атрибута основного манифеста, в "app.jar"

Обычно, если бы я создал программу сам, я бы добавил атрибут основного класса в файл манифеста. Но в этом случае, так как файл из приложения, я не могу этого сделать. Я также попытался извлечь банку, чтобы посмотреть, смогу ли я найти основной класс, но есть много классов, и ни один из них не имеет слова «main» в своем названии. Должен быть способ исправить это, потому что программа отлично работает в других системах.

Ответы [ 34 ]

3 голосов
/ 27 ноября 2015

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

2 голосов
/ 20 января 2017

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

  1. Если вы хотите, чтобы ваши .class файлы были в пакетах, добавьте пакет в начало .java.

    Test.java

    package testpackage;
    
    public class Test
    {
        ...
    }
    
  2. Чтобы скомпилировать код с файлами .class, заканчивающимися структурой, заданной именем пакета, используйте:

    javac -d . Test.java
    

    -d . заставляет компилятор создаватьнужная вам структура каталогов.

  3. При упаковке файла .jar вам необходимо указать в подпрограмме jar, как его упаковать.Здесь мы используем набор параметров cvfeP.Это позволяет сохранять структуру пакета (опция P), указывать точку входа , чтобы файл манифеста содержал значимую информацию (опция e).Параметр f позволяет указать имя файла, параметр c создает архив, а параметр v устанавливает вывод для подробного вывода.Здесь следует отметить следующие важные моменты: P и e.

    Затем следует имя банки, которую мы хотим test.jar.

    Затем следует точка входа.

    И затем приходит -C . <packagename>/, чтобы получить файлы классов из этой папки, сохраняя структуру папки.

    jar cvfeP test.jar testpackage.Test -C . testpackage/
    
  4. Проверьте файл .jar в программе zip.Он должен иметь следующую структуру

    test.jar

    META-INF
    | MANIFEST.MF
    testpackage
    | Test.class
    

    Файл MANIFEST.MF должен содержать следующее

    Manifest-Version: 1.0
    Created-By: <JDK Version> (Oracle Corporation)
    Main-Class: testpackage.Test
    

    Если вы редактируетеваш манифест от руки не забудьте сохранить символ новой строки в конце в противном случае java не распознает его.

  5. Запустите файл .jar с помощью

    java -jar test.jar
    
2 голосов
/ 22 марта 2017

Поскольку вы добавили MANIFEST.MF, я думаю, вы должны рассмотреть порядок полей в этом файле. Мой env java version "1.8.0_91"

и мой MANIFEST.MF как здесь

// MANIFEST.MF
Manifest-Version: 1.0
Created-By: 1.8.0_91 (Oracle Corporation)
Main-Class: HelloWorldSwing

// run
~ java -jar HelloWorldSwing.jar
no main manifest attribute, in HelloWorldSwing.jar

Тем не менее, это, как показано ниже, проходит через

Manifest-Version: 1.0
Main-Class: HelloWorldSwing
Created-By: 1.8.0_91 (Oracle Corporation)

//this run swing normally
2 голосов
/ 09 января 2018

Я нашел новое решение для генерации плохих манифестов!

  1. Откройте файл jar с помощью zip-редактора, например WinRAR
  2. Нажмите дляMETA-INF

  3. Добавить или редактировать

    • Добавить:

      • Создать текстовый файл с именем MANIFEST.MF в папке с именем META-INF и добавьте следующую строку:

        • Manifest-Version: 1.0
        • Main-Class: package.ex.com.views.mainClassName
      • Сохраните файл и добавьте его в zip

    • Редактировать:

      • Перетащите файл, измените файл MANIFEST.MF, чтобы добавить предыдущую строку
  4. Откройте cmd и введите: java -jar c: / path / JarName.jar

Теперь все должно работать нормально!

2 голосов
/ 19 июня 2017

(первый пост - поэтому он может быть не чистым)

Это мое исправление для OS X 11.6, программы Netbeans 8.2 на основе Maven. До сих пор мое приложение на 100% состоит из Netbeans - никаких настроек (всего лишь несколько оболочек для невозможного!).

Перепробовав почти все ответы здесь и в других местах безрезультатно, я вернулся к искусству «используй то, что работает».

Верхний ответ здесь ( olivier-refalo thanx) выглядел как правильное место для начала, но не помогло.

Глядя на другие проекты, которые работали, я заметил некоторые незначительные различия в строках манифеста:

  1. addClasspath, classpathPrefix отсутствовали (удалили их)
  2. В mainClass отсутствовал "com." (использовал NB -> Проект Свойства-> Выполнить-> Основной класс-> Обзор, чтобы указать)

Не уверен, почему (я только 3 месяца в Java) или как, но могу только сказать, что это сработало.

Вот только используемый модифицированный блок манифеста:

    <manifest>
        <mainClass>mypackage.MyClass</mainClass>
    </manifest>
1 голос
/ 18 ноября 2015

У вас может быть та же проблема, что и у меня. После создания файла .jar напишите jar xf app.jar META-INF/MANIFEST.MF. Это создаст копию файла в вашем текущем каталоге, чтобы вы могли прочитать его. Если это только говорит что-то вроде:

Манифест-версия: 1.0

Создано: 1.8.0_51 (Oracle Corporation)

и не содержит декларации "Main-Class", тогда я думаю, что вы нашли свою проблему.

Хотя я не знаю, как это решить. Я проверял других людей с такими же / похожими проблемами в StackOverflow и не мог найти ответ. Однако с этой информацией вы, возможно, сможете получить более качественную помощь (учитывая тот факт, что у вас та же проблема, что и у меня).

Редактировать: я пытался с манифест-файлом, но не работал, но моя ошибка заключалась в том, чтобы при создании jar-файла назвать только один из классов. Вместо этого я написал * .class, и теперь он работает.

Хотя я не знаю, почему существует необходимость в создании файла манифеста. Но я думаю, это нормально, пока это работает.

1 голос
/ 23 сентября 2017

Просто чтобы прояснить одну точку относительно

Main-Class: <packagename>.<classname>

Если у вас нет пакета, вы должны проигнорировать эту часть, например:

Main-Class: <classname>
1 голос
/ 01 февраля 2017

У меня была эта проблема, и я недавно решил ее, выполнив это в Netbeans 8 (см. Изображение ниже):

Netbeans project properties

  1. перейти к свойствам вашего проекта.
  2. нажмите Выполнить .
  3. укажите основной класс вашего проекта, используя browse .
  4. build и run файл Jar.
1 голос
/ 18 июня 2019

большинство решений не помогло мне, но мой инструктор помог мне я хотел бы поделиться его решением здесь Я использовал терминал Kali Linux, но должно быть хорошо во всех Debian

javac *.java
nano MANIFEST.MF

в типе файла

Main-Class: Main или каково ваше основное имя файла (убедитесь, что добавили имя пакета, если оно существует)

jar -cvmf MANIFEST.MF new.jar *.class

теперь для запуска файла используйте

java -jar new.jar

или вы можете перейти к свойствам файла и проверить

Разрешить выполнение файла как программы

двойной щелчок по нему

это помогло мне, в то время как большинство приведенных выше ответов не

1 голос
/ 20 ноября 2016

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

jar cfve app.jar TheNameOfClassWithMainMethod *.class

(параметр "e" делает это: TheNameOfClassWithMainMethod - это имя класса с методом main () и app.jar - имя исполняемого файла .jar и * .class - только все классы.файлы для сборки)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...