Не удается выполнить jar-файл: «нет основного атрибута манифеста»

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

java -jar "app.jar"

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

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

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

Комментарии к вопросу (6)

Во-первых, это немного странно видеть, как вы запускаете java -jar "app", а не java -jar app.jar

Во-вторых, сделать банку исполняемой... вам нужно нажать файл под названием META-INF / MANIFEST.MF

сам файл должен иметь (по крайней мере) этот лайнер:

Main-Class: com.mypackage.MyClass

Где com.mypackage.MyClass - это класс, содержащий public static void main (String [] args) точку входа.

Обратите внимание, что есть несколько способов сделать это с CLI, Maven, Ant или Gradle:

Для CLI будет выполнять следующую команду: (tks @ [dvvrt][1])

jar cmvf META-INF / MANIFEST.MF < new-jar-filename > .jar < файлы для включения >

Для Мавена что-то вроде следующего фрагмента должно помочь. Обратите внимание, что это только определение плагина, а не полное pom.xml :






      org.apache.maven.plugins
      maven-jar-plugin
      3.1.0
Комментарии (11)

Это должен был быть java -jar app.jar вместо java -jar "app".

Параметр -jar работает только в том случае, если файл JAR является исполняемым файлом JAR, что означает, что в нем должен быть файл манифеста с атрибутом Main-Class. См. Упаковка программ в файлах JAR, чтобы узнать, как создать исполняемый файл JAR

Если это не исполняемый JAR, вам нужно запустить программу с чем-то вроде:

java -cp app.jar com.somepackage.SomeClass

где com.somepackage.SomeClass - это класс, который содержит main метод запуска программы. (Что это за класс, зависит от программы, невозможно сказать по предоставленной вами информации).

Комментарии (10)

Кроме того, вы можете использовать плагин maven-assembly-plugin, как показано в приведенном ниже примере:



    maven-assembly-plugin


        package

          single
Комментарии (7)

Это связано с тем, что Java не может найти основной атрибут в файле MANIFEST.MF. Основной атрибут необходим, чтобы указать Java, какой класс он должен использовать в качестве точки входа приложения. Внутри файла jar файл MANIFEST.MF находится в папке META-INF. Хотите знать, как вы можете посмотреть, что находится внутри файла банки? Откройте файл банок с помощью WinRAR .

Основной атрибут внутри MANIFEST.MF выглядит следующим образом:

Main-Class: .

Вы получаете эту ошибку «без основного атрибута манифеста», когда эта строка отсутствует в файле MANIFEST.MF.

< strike > Это действительно огромный беспорядок, чтобы указать этот атрибут в файле MANIFEST.MF.& Лт; / удар >

Обновление: я только что нашел действительно аккуратный способ указать точку входа Приложения в затмении. Когда вы говорите Экспорт,

Select Jar and next 

[ give it a name in the next window ] and next

and next again

and you'll see " Select the class of the application entry point".

Just pick a class and Eclipse will automatically build a cool MANIFEST.MF for you.

введите описание изображения здесь!

Комментарии (0)

Ответ Gradle состоит в том, чтобы добавить настройку jar / manifest / attributes следующим образом:

apply plugin: 'java'

jar {
    manifest {
        attributes 'Main-Class': 'com.package.app.Class'
    }
}
Комментарии (1)

Для мавена это то, что решило это (для меня, для кодовой базы Veetle на GitHub):




    org.apache.maven.plugins
    maven-shade-plugin
    2.0


        package

          shade




              org.lazydevs.veetle.api.VeetleAPI







Приветствия...

Комментарии (2)

У меня была эта проблема при создании банки с использованием IntelliJ IDEA. Смотрите это обсуждение.

Для меня было решено заново создать артефакт банки, выбрав JAR > Из модулей с зависимостями, но не принимающих каталог по умолчанию для META-INF / MANIFEST.MF. Измените его с - / src / main / java на - / src / main / resources.

В противном случае он включал файл манифеста в банку, но не тот, который должен был быть в - / src / main / java.

Комментарии (3)

Попробуйте эту команду, чтобы включить банку:

java -cp yourJarName.jar your.package..your.MainClass
Комментарии (1)

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




            org.springframework.boot
            spring-boot-maven-plugin


Комментарии (2)

Для меня ни один из ответов не помог - у меня был файл манифеста в правильном месте, содержащий основной класс и все остальное. Что меня сбило с толку, так это:

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

(источник). Добавление новой строки в конце манифеста исправило это.

Комментарии (0)

Я получил ту же ошибку только сейчас. Если вы используете gradle, просто добавьте следующий в ur gradle.build:

apply plugin: 'java'

jar {
    manifest {
        attributes 'Main-Class': 'com.company.project.MainClass'
    }
}

Где com.company.project.MainClass путь к классу ur с методом public static void main (String [] args).

Комментарии (2)

При использовании Maven включите следующее в пом


    org.springframework.boot
    spring-boot-starter-parent
    1.4.2.RELEASE



    1.8





            org.springframework.boot
            spring-boot-maven-plugin


Комментарии (9)

У меня был тот же вопрос сегодня. Моя проблема была решена при перемещении META-INF в папку ресурсов.

Комментарии (2)

Если банка не следует правилам, это не исполняемая банка.

Комментарии (2)

Я столкнулся с той же проблемой, и она исправлена сейчас :) Просто выполните следующие действия, и ошибка может быть для чего угодно, но приведенные ниже шаги делают процесс более плавным. Я провожу много времени, чтобы найти исправление.

  1. Попробуйте перезапустить Eclipse (если вы используете Eclipse для встроенного файла JAR) -- > На самом деле это помогло моей проблеме в правильном экспорте файла JAR.

2.После перезапуска затмения, попробуйте узнать, может ли ваше затмение распознать основной класс / метод вашим проектом Java - > щелкните правой кнопкой мыши - > Запустите как --> Запустите конфигурации - > Главный - > нажмите кнопку «Поиск», чтобы увидеть, сможет ли ваше затмение найти ваш основной класс в файле JAR. -- > Это для проверки того, что файл JAR будет иметь точку входа в основной класс.

  1. После этого экспортируйте ваш динамический проект Java в виде файла «Runnable JAR», а не файла JAR.

  2. В конфигурации запуска Java выберите свой основной класс.

  3. После экспорта файла jar используйте команду ниже для выполнения. java -cp [Ваш JAR] .jar [полный пакет] .MainClass например: java -cp AppleTCRuleAudit.jar com.apple.tcruleaudit.classes.TCRuleAudit

  4. Вы можете столкнуться с неподдерживаемой ошибкой версии Java. исправление состоит в том, чтобы изменить java_home в вашем профиле bash оболочки, чтобы он соответствовал версии java, используемой для компиляции проекта в затмении.

Надеюсь, это поможет! Пожалуйста, дайте мне знать, если у вас все еще есть какие-либо проблемы.

Комментарии (0)

Я лично думаю, что все ответы здесь неправильно понимают вопрос. Ответ на этот вопрос заключается в разнице в том, как весенний ботинок строит .jar. Всем известно, что Spring Boot создает такой манифест, который отличается от всех предположений , что это стандартный запуск .jar, которым он может или не может быть:

Start-Class: com.myco.eventlogging.MyService
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Spring-Boot-Version: 1.4.0.RELEASE
Created-By: Apache Maven 3.3.9
Build-Jdk: 1.8.0_131
Main-Class: org.springframework.boot.loader.JarLauncher

Возможно, его нужно выполнить с помощью org.springframework.boot.loader.JarLauncher на классовой тропе?

Комментарии (1)

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

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

    Test.java

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

     javac -d . Test.java

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

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

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

    Затем наступает точка входа < packagename >.& Лт; название класса >

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

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

    test.jar

     META-INF
     | MANIFEST.MF
     тестовый пакет
     Test Test.class

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

     Манифест-версия: 1.0
     Создано: < JDK Version > (Oracle Corporation)
     Основной класс: testpackage.Test

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

  5. Выполните файл .jar с помощью

     java -jar test.jar
Комментарии (2)

Возможно, вы не создали файл jar должным образом:

ex: отсутствует опция m в создании банок

Следующие работы:

jar -cvfm MyJar.jar Manifest.txt *.class
Комментарии (0)

Любой исполняемый файл jar. Следует запустить, щелкнув или выполнив с помощью командной строки, такой как java -jar app.jar (используйте «если путь к банке содержит пространство» - т.е. java -jar "C: \ имя папки \ app.jar"). Если ваш исполняемый файл не работает, это означает, что он не создан должным образом.

Для лучшего понимания извлеките файл jar (или просмотрите с помощью любого инструмента, для Windows 7-Zip - хороший) и проверьте файл в /META-INF/MANIFEST.MF. Если вы найдете какую-либо запись, как

Основной класс: your.package.name.ClaaswithMain - тогда все в порядке, иначе вы должны предоставить его.

Помните о добавлении записи Main-Class в файл MANIFEST.MF, проверьте, где вы ее сохраняете!

Комментарии (0)

Вы можете просто следовать этому шагу Создайте файл банок, используя

 jar -cfm jarfile-name manifest-filename Class-file name

При запуске файла банок просто запустите вот так

 java -cp jarfile-name main-classname
Комментарии (0)