Невозможно выполнить jar файл: "нет основного атрибута манифеста"

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

java -jar "app.jar"

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

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

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

Ответ 1

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

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

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

Main-Class: com.mypackage.MyClass

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

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

Для CLI подойдет следующая команда: (tks @dvvrt) jar cmvf META-INF/MANIFEST.MF <new-jar-filename>.jar <files to include>

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

<build>
  <plugins>
    <plugin>
      <!-- Build an executable JAR -->
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-jar-plugin</artifactId>
      <version>3.1.0</version>
      <configuration>
        <archive>
          <manifest>
            <addClasspath>true</addClasspath>
            <classpathPrefix>lib/</classpathPrefix>
            <mainClass>com.mypackage.MyClass</mainClass>
          </manifest>
        </archive>
      </configuration>
    </plugin>
  </plugins>
</build>

(Выберите <version> соответствующую вашему проекту.)

Для Ant приведенный ниже фрагмент кода должен помочь:

<jar destfile="build/main/checksites.jar">
  <fileset dir="build/main/classes"/>
  <zipfileset includes="**/*.class" src="lib/main/some.jar"/>
  <manifest>
    <attribute name="Main-Class" value="com.acme.checksites.Main"/>
  </manifest>
</jar>

Кредиты Майкла Ниманда -

Для Gradle:

plugins {
    id 'java'
}

jar {
    manifest {
        attributes(
                'Main-Class': 'com.mypackage.MyClass'
        )
    }
}

Ответ 2

Это должно быть 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 для запуска программы. (То, что этот класс зависит от программы, невозможно сообщить из предоставленной вами информации).

Ответ 3

В качестве альтернативы вы можете использовать maven-assembly-plugin, как показано в следующем примере:

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <executions>
      <execution>
        <phase>package</phase>
        <goals>
          <goal>single</goal>
        </goals>
      </execution>
    </executions>
    <configuration>
      <archive>
        <manifest>
          <addClasspath>true</addClasspath>
          <mainClass>com.package.MainClass</mainClass>
        </manifest>
      </archive>
      <descriptorRefs>
        <descriptorRef>jar-with-dependencies</descriptorRef>
      </descriptorRefs>
    </configuration>
  </plugin> 

В этом примере все баны с зависимостями, как указано в разделе, будут автоматически включены в вашу единственную банку. Обратите внимание, что jar-with-dependencies должны быть буквально помечены как, а не заменены именами файлов jar, которые вы хотите включить.

Ответ 4

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

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

Main-Class: <packagename>.<classname>

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

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

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

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.

enter image description here

Ответ 5

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

apply plugin: 'java'

jar {
    manifest {
        attributes 'Main-Class': 'com.package.app.Class'
    }
}

Ответ 6

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

<build>
<plugins>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>2.0</version>
    <executions>
      <execution>
        <phase>package</phase>
        <goals>
          <goal>shade</goal>
        </goals>
        <configuration>
          <transformers>
            <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
              <mainClass>org.lazydevs.veetle.api.VeetleAPI</mainClass>
            </transformer>
          </transformers>
        </configuration>
      </execution>
    </executions>
  </plugin>
 </plugins>
</build>

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

Ответ 7

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

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

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

Ответ 8

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

java -cp yourJarName.jar your.package..your.MainClass

Ответ 9

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

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

Ответ 10

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

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

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

Ответ 11

Если вы используете Maven, включите следующее в pom

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.4.2.RELEASE</version>
</parent>

<properties>
    <java.version>1.8</java.version>
</properties>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

Ответ 12

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

apply plugin: 'java'

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

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

Ответ 13

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

Ответ 14

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

Ответ 15

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

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

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

  1. После этого экспортируйте свой Java Dynamic проект как "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, используемой для компиляции проекта в eclipse.

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

Ответ 16

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

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

Main-Class: your.package.name.ClaaswithMain - тогда это хорошо, иначе вы должны его предоставить.

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

Ответ 17

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

ex: отсутствующий параметр m в создании jar

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

jar -cvfm MyJar.jar Manifest.txt *.class

Ответ 18

Вы можете просто следовать этому шагу  Создайте файл jar с помощью

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

При запуске jar файла пропустите прогон, как этот

 java -cp jarfile-name main-classname

Ответ 19

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

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

    Test.java

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

    javac -d . Test.java
    

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

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

    Затем появляется имя флага, в котором мы хотим test.jar.

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

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

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

    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 не узнает его.

  • Выполните .jar файл

    java -jar test.jar
    

Ответ 20

Я лично считаю, что все ответы здесь неверно понимают вопрос. Ответ на это заключается в различии того, как spring -boot создает .jar. Всем известно, что Spring Boot устанавливает такой манифест, который отличается от allones asssumption тем, что это стандартный запуск .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 в пути к классам?

Ответ 21

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

Ответ 22

Вышеуказанные ответы были лишь частично полезными для меня. java -cp был частью ответа, но мне нужна была более подробная информация о том, как идентифицировать класс для запуска. Вот что сработало для меня:

Шаг 1: найдите класс, который нужно запустить

jar tf /path/to/myjar.jar | more

Верхними строками результата были:

META-INF/
META-INF/MANIFEST.MF
somepath/
somepath/App.class
META-INF/maven/
...

В App.class содержался основной класс для запуска. Я не уверен на 100%, если вы всегда можете предположить, что класс, в котором вы нуждаетесь, является первым, но это было для меня. Если это не так, я бы предположил, что использовать grep не так уж сложно, чтобы исключить результаты, связанные с библиотекой, для того, чтобы перечислить список классов до управляемого размера.

Оттуда было легко: я просто использую этот путь (минус суффикс ".class" ):

java -cp /path/to/myjar.jar somepath/App

Ответ 23

Поскольку вы добавили 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

Ответ 24

(первый пост - значит, он не может быть чистым)

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

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

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

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

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

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

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

    <manifest>
        <mainClass>mypackage.MyClass</mainClass>
    </manifest>

Ответ 25

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

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

  3. Добавить или изменить

    • Добавлять:

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

        • Манифест-Версия: 1.0
        • Основной класс: package.ex.com.views.mainClassName
      • Сохраните файл и добавьте его в zip

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

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

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

Ответ 26

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

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

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

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

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

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

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

Ответ 27

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

jar cfve app.jar TheNameOfClassWithMainMethod *.class

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

Ответ 28

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

Netbeans project properties

  • перейдите в свойства вашего проекта.
  • нажмите Запустить.
  • укажите основной класс вашего проекта с помощью просмотра.
  • построить и запустить файл Jar.

Ответ 29

Просто, чтобы ясно указать на

Main-Class: <packagename>.<classname>

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

Main-Class: <classname>

Ответ 30

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

javac *.java
nano MANIFEST.MF

в типе файла

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

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

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

java -jar new.jar

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

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

дважды щелкните по нему

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