Нет атрибута основного манифеста в ----. Jar Netbeans

Недавно я только начал играть с Maven в java. Приходит время протестировать мой проект, он отлично работает в окне NetBeans, выполняя основной класс из App.java (com.MyCompany.App), но когда я пытаюсь запустить его из командной строки, я получаю сообщение об ошибке:

java -jar fileName.jar

«Нет основного атрибута манифеста» в fileName.jar

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

Что происходит?


person A_Elric    schedule 04.09.2012    source источник
comment
Проверьте это решение. Для меня это работа. stackoverflow.com/a/9689877/3839405   -  person Michael Horta Fleitas    schedule 13.04.2018


Ответы (6)


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

  • он должен под /META-INF/MANIFEST.MF
  • В контенте должно быть Main-Class:com.MyCompany.App

Если вы используете любую IDE, должна быть возможность экспортировать проект как runnable jar, вы можете использовать это, чтобы IDE позаботилась о правильном манифесте.

Из командной строки jar cfm filename.jar Manifest.txt com/MyCompany/*.class, которая создает файл манифеста со следующим содержимым

Manifest-Version: 1.0
Created-By: 1.6.0 (Sun Microsystems Inc.)
Main-Class: com.MyCompany.App

Затем вы можете запустить команду jar java -jar fileName.jar.

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

person RP-    schedule 04.09.2012
comment
Я сделал это, попробовав java jar cfm testSql-1.0.jar Manifest.txt com / MyCompany / testsql / *. Class, и он вернул ошибку Не удалось найти или загрузить jar основного класса - person A_Elric; 04.09.2012
comment
У вас есть пустая строка в конце файла манифеста? Последняя строка не будет анализироваться в файле манифеста. - person RP-; 04.09.2012
comment
Мой манифест выглядит следующим образом: Версия-манифеста: Версия архиватора 1.0: Архиватор Plexus Создан: Автор: Apache Maven Встроенный: dbell Build-Jdk: 1.7.0_05 Хотя он создается в среде IDE - person A_Elric; 04.09.2012
comment
Кажется, это не runnable jar, поскольку у вас нет атрибута Main-Class. Вы можете попробовать jar cfe filename.jar com.MyComapany.App com/MyCompany/App.class - person RP-; 04.09.2012
comment
В Netbeans, Выполнить- ›Конфигурация проекта-› Настроить- ›Выполнить-› Главный класс- ›Просмотрите и выберите основной класс. Затем перестройте. - person Pete; 08.07.2013
comment
@Pete это не работает с проектами Maven в NetBeans. Работает только для проектов, управляемых npproject. - person KFL; 08.05.2014

Я знаю, что это старый вопрос, но на случай, если он кому-то поможет.

Вам понадобится maven-jar-plugin (см. пример Maven ). Этот плагин создаст необходимые записи в файле манифеста при построении проекта.

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.3.2</version>
        <configuration>
          <archive>
            <manifest>
              <addClasspath>true</addClasspath>
              <mainClass>fully.qualified.MainClass</mainClass>
            </manifest>
          </archive>
        </configuration>
      </plugin>

Вам нужна версия, иначе проект не будет собран. fully.qualified.MainClass начинается с иерархии пакетов.

person yshehab    schedule 19.01.2014
comment
Это был самый полезный ответ здесь, и ИМО должен быть основным ответом на этот пост. - person Socrates; 11.01.2017

Вы можете просто использовать это для командной строки:

java -cp jarFileName.jar full.package.className

В этом случае вам не придется вдаваться в подробности файла манифеста.

person rachel    schedule 06.03.2013
comment
Хотя ваш вариант допустим, он не совсем отвечает на то, что происходит? часть вопроса. - person adamdunson; 06.03.2013
comment
@adamdunson То, что происходит, напрямую связано с тем, какая IDE задействована. В частности, для NetBeans Нейт опубликовал правильное решение выше. - person anon58192932; 02.04.2014

Установка точки входа с помощью JAR Tool:

Флаг «e» (для «точки входа») создает или отменяет атрибут Main-Class манифеста. Его можно использовать при создании или обновлении файла JAR. Используйте его, чтобы указать точку входа в приложение без редактирования или создания файла манифеста. Например, эта команда создает файл app.jar, в котором для атрибута Main-Class в манифесте установлено значение MyApp:

jar cfe app.jar MyApp MyApp.class

Вы можете напрямую вызвать это приложение, выполнив следующую команду:

java -jar app.jar

Если имя класса точки входа находится в пакете, оно может использовать '.' (точка) в качестве разделителя. Например, если Main.class находится в пакете с именем foo, точку входа можно указать следующими способами:

jar cfe Main.jar foo.Main foo/Main.class
person Rozhkov Eugene    schedule 11.08.2015

Если вы посмотрите на диалоговое окно свойств проекта (на вкладке проекта щелкните правой кнопкой мыши проект и выберите свойства), вы увидите, что в окне «Категории» есть пункт «запустить». Щелкните по нему, и вы увидите диалоговое окно, в котором вы можете указать основной класс для банки. Эта информация попадет в ваш манифест.

person Ralph LeVan    schedule 10.12.2015

У меня была эта проблема с Netbeans 8.0 и встроенным проектом Maven для прототипа проекта «Приложение Java». Также у меня есть Maven 3, и я обнаружил, что некоторые из предложений в Интернете не соответствуют коду maven, используемому с Netbeans.

В любом случае, вот простой рецепт наличия JAR-файла для запуска основного класса и встраивания зависимых библиотек. Я выполнил эту работу, сравнив файлы POM других проектов с проектами, которые, как я обнаружил, работали с JAR-файлами подпроектов, поэтому, если кто-то с лучшими знаниями Maven обнаружит gottcha, пожалуйста, говорите. Кроме того, я оставил некоторые нормальные вещи, чтобы предоставить контекст. Пример ниже:

     <properties>
         <packageName>trials.example</packageName>
         <mainClass>${packageName}.CmdApp</mainClass>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

         <slf4jVersion>1.7.7</slf4jVersion>
         <log4jVersion>1.2.17</log4jVersion>

         <maven.compiler.source>1.8</maven.compiler.source>
         <maven.compiler.target>1.8</maven.compiler.target>
     </properties>

В этом разделе Maven рассказывается о проекте.

  • packageName ... Пакет Java для основного класса
  • mainClass ..... Полное имя класса с методом main ().

Вы увидите, что они используются в maven-jar-plugin.

Еще одна вещь, которую не мог сделать встроенный прототип-пример, - это упаковать мои подпроекты в JAR, чтобы я мог запускаться из командной строки. Это делается с помощью плагина maven-dependency-plugin ниже. Интересный момент заключается в том, что нам не нужно упаковывать системные вещи, и мы хотим, чтобы зависимые классы были заключены в наш JAR.

Они используются следующим образом:

     <build>
         <plugins>
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-dependency-plugin</artifactId>
                 <version>2.6</version>
                 <executions>
                     <execution>
                         <id>unpack-dependencies</id>
                         <phase>package</phase>
                         <goals>
                             <goal>unpack-dependencies</goal>
                         </goals>
                         <configuration>
                             <excludeScope>system</excludeScope>
                             <outputDirectory>${project.build.directory}/classes</outputDirectory>
                         </configuration>
                     </execution>
                 </executions>
             </plugin>

             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-jar-plugin</artifactId>
                 <version>2.5</version>
                 <configuration>
                     <useDefaultManifestFile>true</useDefaultManifestFile>
                     <archive>
                         <manifest>
                             <mainClass>${mainClass}</mainClass>
                             <packageName>${packageName}</packageName>
                             <addClasspath>true</addClasspath>
                             <classpathPrefix>classes/</classpathPrefix>
                         </manifest>
                         <manifestEntries>
                            <mode>development</mode>
                            <url>${pom.url}</url>
                         </manifestEntries>
                     </archive>
                 </configuration>
             </plugin>

          </plugins>
    </build>

Надеюсь, это сэкономит вам несколько часов проверки и тестирования, чтобы это произошло. Ура, Уилл.

person will    schedule 01.09.2014
comment
не могли бы вы обновить этот ответ? Плагин maven jar изменился. - person Human; 29.11.2019
comment
@Human ... Спасибо, это хороший момент! Лучше всего для ВАС, читатели, проверьте эти пункты (выше) с последней документацией. Наши проекты сейчас используют Gradle, и я не в курсе. Рад указать на исправление, если кто-то хочет опубликовать здесь ответ. - person will; 05.12.2019