"Нет главного атрибута манифеста" в - - - -.банку в NetBeans

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

java -jar fileName.jar

"нет главного атрибута манифеста" в fileName.Джар

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

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

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.

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


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

вам нужен 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>

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


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

java -cp jarFileName.jar full.package.className

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


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


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

в любом случае вот простой рецепт для того, чтобы файл JAR запускал основной класс и вставлял зависимые библиотеки. Я сделал эту работу, сравнивая другие файлы проекта POM для проектов, которые я нашел, которые работали с подпроектом JAR-s, поэтому, если кто-то с лучшими знаниями 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-плагин.

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

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

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

Надежда которая сохраняет вас немногие часы проверки и испытывать к сделай это. Ура, Будет.


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

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

jar cfe app.jar MyApp MyApp.class

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

java -jar app.jar

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

jar cfe Main.jar foo.Main foo/Main.class