web-dev-qa-db-fra.com

"Aucun attribut de manifeste principal" dans ----. Jar Netbeans

Je viens de commencer à jouer avec Maven en Java. Il est temps de tester mon projet, cela fonctionne bien dans la fenêtre NetBeans, en exécutant la classe principale trouvée dans App.Java (com.MyCompany.App), mais lorsque j'essaie de l'exécuter à partir d'une ligne de commande, une erreur se produit:

Java -jar fileName.jar

"Pas d'attribut de manifeste principal" dans fileName.jar

J'ai essayé d'ajouter un fichier manifest.mf spécifiant ce qu'est main. J'ai aussi été dans les propriétés du projet et l'a ajouté en tant que fichier principal ...

Que se passe-t-il?

17
A_Elric

J'espère qu'il y a un problème dans votre fichier manifeste. Quelques vérifications de base pourraient résoudre votre problème.

  • il devrait sous /META-INF/MANIFEST.MF
  • Le contenu devrait avoir Main-Class:com.MyCompany.App

Si vous utilisez un IDE, il devrait y avoir une option pour exporter le projet en tant que runnable jar, vous pouvez l'utiliser pour laisser le IDE s'occuper du manifeste correct. 

À partir de la ligne de commande jar cfm filename.jar Manifest.txt com/MyCompany/*.class qui génère le fichier Manifest avec le contenu suivant

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

Et ensuite, vous pouvez exécuter la commande jar Java -jar fileName.jar.

Ce type de problèmes est trivial mais tue beaucoup de temps, assurez-vous simplement que votre contenu et l'emplacement du fichier sont corrects.

10
RP-

Je sais que c'est une vieille question, mais au cas où cela aiderait quelqu'un.

Vous avez besoin du plugin maven-jar (voir Exemple de Maven ). Ce plugin créera les entrées requises que Rp a mentionnées dans le fichier manifeste lors de la construction du projet.

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

Vous avez besoin de la version, sinon le projet ne se construit pas. Fully.qualified.MainClass commence à la hiérarchie du package.

12
yshehab

Vous pouvez simplement utiliser ceci pour la ligne de commande:

Java -cp jarFileName.jar full.package.className

Dans ce cas, il ne serait pas nécessaire d'entrer dans les détails du fichier Manifest.

2
rachel

Si vous consultez la boîte de dialogue des propriétés du projet (à partir de l'onglet Projet, cliquez avec le bouton droit de la souris sur votre projet et sélectionnez Propriétés), vous verrez qu'il existe un élément "Exécuter" dans la fenêtre "Catégories". Cliquez dessus et vous verrez une boîte de dialogue dans laquelle vous pouvez spécifier la classe principale pour le jar. Cette information se retrouvera dans votre manifeste.

1
Ralph LeVan

Définition d'un point d'entrée avec l'outil JAR:

L'indicateur 'e' (pour 'entrypoint') crée ou remplace l'attribut Main-Class du manifeste. Il peut être utilisé lors de la création ou de la mise à jour d'un fichier JAR. Utilisez-le pour spécifier le point d'entrée de l'application sans modifier ni créer le fichier manifeste . Par exemple, cette commande crée app.jar où la valeur de l'attribut Main-Class du manifeste est définie sur MyApp:

jar cfe app.jar MyApp MyApp.class

Vous pouvez directement appeler cette application en exécutant la commande suivante:

Java -jar app.jar

Si le nom de la classe entrypoint est dans un package, il peut utiliser un '.' (point) caractère en tant que délimiteur. Par exemple, si Main.class est dans un package appelé foo, le point d'entrée peut être spécifié de l'une des manières suivantes:

jar cfe Main.jar foo.Main foo/Main.class
0
Rozhkov Eugene

Je rencontre ce problème avec Netbeans 8.0 et le projet Maven intégré pour le prototype de projet "Application Java". De plus, j'ai Maven 3 et certaines des suggestions sur le Web ne correspondent pas au code Maven utilisé avec Netbeans.

Quoi qu'il en soit, voici une recette simple pour que le fichier JAR puisse exécuter les bibliothèques dépendantes de la classe principale et les intégrer. J’ai réalisé ce travail en comparant d’autres fichiers POM de projet à des projets qui fonctionnaient avec le sous-projet JAR-s. Par conséquent, si une personne ayant une meilleure connaissance de Maven détecte un gottcha, veuillez parler. En outre, je suis parti dans certains trucs normaux pour fournir un contexte. Exemple suit:

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

Cette section présente le projet à Maven.

  • packageName ... Le package Java de la classe principale
  • mainClass ..... Nom qualifié complet de la classe avec la méthode main ().

Vous verrez ceux-ci utilisés dans le plugin maven-jar. 

L'autre exemple que le prototype intégré n'a pas fait est de regrouper mes sous-projets dans le fichier JAR afin que je puisse exécuter la commande à partir de la ligne de commande. Ceci est fait avec le plugin maven-dependency ci-dessous. Ce qui est intéressant, c’est que nous n’avons pas besoin de conditionner les éléments système et que nous voulons que les classes dépendantes soient intégrées à notre fichier JAR.

Ceux-ci sont utilisés comme suit:

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

J'espère que cela vous évitera les quelques heures de vérification et de test nécessaires. Salut, Will.

0
will