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

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

java -jar fileName.jar

"Нет атрибута основного манифеста" в файлеName.jar

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

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

Ответ 1

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

  • он должен под /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.

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

Ответ 2

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

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

  <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>

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

Ответ 3

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

java -cp jarFileName.jar full.package.className

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

Ответ 4

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

Ответ 5

У меня возникла проблема с Netbeans 8.0 и встроенным проектом Maven для прототипа проекта Java Application. Также у меня есть 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.

  • имя_пакета... Является ли пакет 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>

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

Ответ 6

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

Флаг 'e' (для 'entrypoint') создает или переопределяет атрибут 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