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

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

java -jar "app.jar"

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

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

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

494
задан Ewoud 13 марта '12 в 21:20
источник поделиться
30 ответов

Во-первых, это странно, если вы запустите 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:

Для 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.0.2</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>

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

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

161
ответ дан Jesper 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, которые вы хотите включить.

55
ответ дан CodePlumber 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

44
ответ дан Sasanka Panguluri 29 сент. '13 в 3:26
источник поделиться

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

apply plugin: 'java'

jar {
    manifest {
        attributes 'Main-Class': 'com.package.app.Class'
    }
}
16
ответ дан QED 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>

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

15
ответ дан Dave 01 марта '13 в 19:06
источник поделиться

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

java -cp yourJarName.jar your.package..your.MainClass
14
ответ дан Burhan ARAS 23 авг. '13 в 10:31
источник поделиться

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

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

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

9
ответ дан eis 25 янв. '15 в 12:15
источник поделиться

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

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

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

7
ответ дан morningstar 09 авг. '16 в 19:51
источник поделиться

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

5
ответ дан John M 13 марта '12 в 21:24
источник поделиться

Если вы используете 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>
4
ответ дан shuang 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.

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

4
ответ дан Karthik Pon 26 февр. '16 в 3:02
источник поделиться

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

3
ответ дан Neeraj Bhatnagar 27 нояб. '15 в 9:38
источник поделиться

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

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

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

jar -cvfm MyJar.jar Manifest.txt *.class
3
ответ дан satheesh.v 28 авг. '13 в 20: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, проверьте, где вы ее сохраняете!

3
ответ дан Shekh Akther 03 авг. '12 в 17:04
источник поделиться

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

2
ответ дан RegUser 23 апр. '17 в 17:46
источник поделиться

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

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

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

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

 java -cp jarfile-name main-classname
2
ответ дан Koneri 28 сент. '13 в 7:59
источник поделиться

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

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

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

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

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

1
ответ дан Binakot 01 сент. '17 в 13:39
источник поделиться

Проверьте локальную директорию .m2 для подкаталога этого артефакта. Если exixts - удалить его и снова выполнить обновление Maven

0
ответ дан dushkin 05 июля '16 в 17:02
источник поделиться

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

Netbeans project properties

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

проверьте свой файл jar внутри MANIFEST.MF Main-Class доступен или нет

first.java

class first
{
        public static void main (String arg[ ])
        {
           System.out.println("Welcome to the world of Java");
        }
}

До

Manifest-Version: 1.0
Created-By: 1.7.0_80 (Oracle Corporation)

sony@sony-VPCEH25EN:~/Documents$ java -jar first.jar
no main manifest attribute, in first.jar

После:

Manifest-Version: 1.0
Created-By: 1.7.0_80 (Oracle Corporation)
Main-Class: first

sony@sony-VPCEH25EN:~/Documents$ java -jar first.jar 
Welcome to the world of Java
0
ответ дан KARTHIKEYAN.A 04 дек. '16 в 3:52
источник поделиться

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

Main-Class: <packagename>.<classname>

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

Main-Class: <classname>
0
ответ дан Reihan_amn 23 сент. '17 в 1:37
источник поделиться

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

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

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

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

jar -cvf foo.war *

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

0
ответ дан M.87 28 дек. '17 в 16:15
источник поделиться

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

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

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

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

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

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

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

0
ответ дан Gendarme 18 нояб. '15 в 1:14
источник поделиться

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

jar cfve app.jar TheNameOfClassWithMainMethod *.class

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

0
ответ дан Andrey 20 нояб. '16 в 4:00
источник поделиться

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

0
ответ дан djangofan 27 окт. '17 в 21:37
источник поделиться

Другие вопросы по меткам