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

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

java -jar "app.jar"

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

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

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

494
задан 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
ответ дан 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
ответ дан 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
ответ дан 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
ответ дан 29 сент. '13 в 3:26
источник

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

apply plugin: 'java'

jar {
    manifest {
        attributes 'Main-Class': 'com.package.app.Class'
    }
}
16
ответ дан 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
ответ дан 01 марта '13 в 19:06
источник

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

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

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

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

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

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

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

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

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

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

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

5
ответ дан 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
ответ дан 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
ответ дан 26 февр. '16 в 3:02
источник

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

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

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

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

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

jar -cvfm MyJar.jar Manifest.txt *.class
3
ответ дан 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
ответ дан 03 авг. '12 в 17:04
источник

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

2
ответ дан 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
ответ дан 22 апр. '17 в 0:11
источник

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

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

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

 java -cp jarfile-name main-classname
2
ответ дан 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
ответ дан 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
ответ дан 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
ответ дан 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
ответ дан 01 сент. '17 в 13:39
источник

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

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

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

Netbeans project properties

  • перейдите в свойства вашего проекта.
  • нажмите Запустить.
  • укажите основной класс вашего проекта с помощью просмотра.
  • построить и запустить файл Jar.
0
ответ дан 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
ответ дан 04 дек. '16 в 3:52
источник

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

Main-Class: <packagename>.<classname>

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

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

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

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

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

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

jar -cvf foo.war *

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

0
ответ дан 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
ответ дан 18 нояб. '15 в 1:14
источник

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

jar cfve app.jar TheNameOfClassWithMainMethod *.class

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

0
ответ дан 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
ответ дан 27 окт. '17 в 21:37
источник

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