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

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

java -jar "app.jar"

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

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

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

781
13 марта '12 в 21:20
источник поделиться
35 ответов
  • 1
  • 2

Во-первых, странно видеть, что вы запускаете 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'
        )
    }
}
768
13 марта '12 в 21:27
источник

Связанные вопросы


Похожие вопросы

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

233
13 марта '12 в 21:27
источник

В качестве альтернативы вы можете использовать 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, которые вы хотите включить.

98
27 дек. '14 в 1:44
источник

Это потому, что 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

55
29 сент. '13 в 3:26
источник

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

apply plugin: 'java'

jar {
    manifest {
        attributes 'Main-Class': 'com.package.app.Class'
    }
}
28
10 мая '16 в 3:15
источник

Для 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>

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

24
01 марта '13 в 19:06
источник

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

java -cp yourJarName.jar your.package..your.MainClass
22
23 авг. '13 в 10:31
источник

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

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

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

20
09 авг. '16 в 19:51
источник

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

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>
19
23 марта '18 в 12:38
источник

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

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

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

12
25 янв. '15 в 12:15
источник

У меня такая же ошибка. Если вы используете 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).

9
01 сент. '17 в 13:39
источник

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

9
23 апр. '17 в 17:46
источник

Если вы используете 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>
9
24 нояб. '16 в 0:29
источник

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

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.

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

5
26 февр. '16 в 3:02
источник

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

5
13 марта '12 в 21:24
источник

Я лично считаю, что все ответы здесь неверно понимают вопрос. Ответ на это заключается в различии того, как 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 в пути к классам?

4
27 окт. '17 в 21:37
источник

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

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

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

 java -cp jarfile-name main-classname
4
28 сент. '13 в 7:59
источник

Любой исполняемый файл 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, проверьте, где вы ее сохраняете!

4
03 авг. '12 в 17:04
источник

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

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

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

jar -cvfm MyJar.jar Manifest.txt *.class
4
28 авг. '13 в 20:59
источник

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

3
27 нояб. '15 в 9:38
источник

Поскольку вы добавили 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
22 марта '17 в 12:47
источник

У меня была та же проблема. Многие решения, упомянутые здесь, не дали мне полной картины, поэтому я попытаюсь дать вам краткое описание того, как упаковать файлы 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
    
2
20 янв. '17 в 9:55
источник

Вышеуказанные ответы были лишь частично полезными для меня. 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
2
22 апр. '17 в 0:11
источник

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

Это мое решение для 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>
2
19 июня '17 в 22:52
источник

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

  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

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

2
09 янв. '18 в 20:29
источник

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

Main-Class: <packagename>.<classname>

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

Main-Class: <classname>
1
23 сент. '17 в 1:37
источник

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

Netbeans project properties

  • перейдите в свойства вашего проекта.
  • нажмите Запустить.
  • укажите основной класс вашего проекта с помощью просмотра.
  • построить и запустить файл Jar.
1
01 февр. '17 в 8:45
источник

Проблема решена добавлением нижеприведенного блока в pom.xml

        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
            <version>3.1.0</version>
            <configuration>
            <archive>
              <manifest>
                <mainClass>com.mycompany.app.App</mainClass>
              </manifest>
            </archive>
          </configuration>
        </plugin>

ПРИМЕЧАНИЕ: проверьте наличие уже существующего maven-jar-plugin, а "App" - это имя класса, т.е. App.java.

0
24 июня '19 в 13:05
источник

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

javac *.java
nano MANIFEST.MF

в типе файла

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

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

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

java -jar new.jar

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

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

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

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

0
18 июня '19 в 21:23
источник

У меня была такая же проблема, как и вы, ниже синтаксиса для успешного создания файла .war: -

jar {cvf} [jar-file] [файл-манифест]

манифеста При создании (c) или обновлении (u) файла JAR операнд манифеста определяет существующие файлы манифеста с именами и значениями атрибутов, которые должны быть включены в файл MANIFEST.MF в файле JAR. Описанный операнд должен быть указан, если параметр f присутствует. [1] '.

Чтобы создать файл манифеста, вам нужно определить значение для некоторых атрибутов, вы можете поместить звездочку после имени файла (.WAR), чтобы избежать создания файла манифеста: -

jar -cvf foo.war *

Честно говоря, я не знаю, является ли это лучшей практикой, но это делает для меня работу:).

0
28 дек. '17 в 16:15
источник
  • 1
  • 2

Посмотрите другие вопросы по меткам или Задайте вопрос