Няма главен манифестен атрибут в ----.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 Archiver Създаден от: 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, Run-›Project Configuration-›Customize-›Run-›Main Class-›Преглед и изберете вашия основен клас. След това изградете отново. - person Pete; 08.07.2013
comment
@Pete това не работи с проекти на Maven в NetBeans. Работи само за проекти, управлявани от npproject - person KFL; 08.05.2014

Знам, че това е стар въпрос, но в случай, че помогне на някого.

Имате нужда от добавката maven-jar (вижте пример на 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
Това беше най-полезният отговор тук и трябва ли IMO да бъде основният отговор на тази публикация. - 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, Nate е публикувал правилното решение по-горе. - person anon58192932; 02.04.2014

Задаване на входна точка с инструмента 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
person Rozhkov Eugene    schedule 11.08.2015

Ако погледнете диалоговия прозорец със свойства за проекта (от раздела проект, щракнете с десния бутон върху вашия проект и изберете свойства), ще видите, че има елемент "изпълни" в прозореца "Категории". Кликнете върху него и ще видите диалогов прозорец, в който можете да посочите основния клас за буркана. Тази информация ще завърши във вашия манифест.

person Ralph LeVan    schedule 10.12.2015

Имам този проблем с Netbeans 8.0 и вградения проект Maven за прототипа на проекта „Java Application“. Освен това имам Maven 3 и открих, че някои от предложенията в мрежата не съвпадат с кода на maven, използван и с Netbeans.

Както и да е, ето една проста рецепта за разполагане на JAR файл за стартиране на основния клас и вграждане на зависими библиотеки. Направих тази работа, като сравних POM файлове на други проекти за проекти, които открих, че работят с JAR-ове на подпроекти, така че ако някой с по-добри познания за Maven забележи готча, моля, говорете. Освен това оставих някои нормални неща, за да осигуря контекст. Следва пример:

     <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-долу. Интересното е, че не е необходимо да пакетираме системните неща и искаме зависимите класове да бъдат опаковани в нашия 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