Question Impossible d'exécuter le fichier jar: "aucun attribut de manifeste principal"


J'ai installé une application, quand j'essaye de l'exécuter (c'est un pot exécutable) rien ne se passe. Quand je l'exécute depuis la ligne de commande avec:

java -jar "app.jar"

Je reçois le message suivant:

aucun attribut de manifeste principal dans "app.jar"

Normalement, si j'avais créé le programme moi-même, j'aurais ajouté un attribut de classe principale au fichier manifeste. Mais dans ce cas, puisque le fichier provient d'une application, je ne peux pas le faire. J'ai aussi essayé d'extraire le pot pour voir si je pouvais trouver la classe principale, mais il y a beaucoup de classes et aucune n'a le mot "main" dans son nom. Il doit y avoir un moyen de résoudre ce problème car le programme fonctionne correctement sur d'autres systèmes.


613
2018-03-13 18:20


origine


Réponses:


D'abord, c'est un peu bizarre, de te voir courir java -jar "app" et pas java -jar app.jar

Deuxièmement, pour rendre un fichier jar exécutable ... vous devez jar un fichier appelé META-INF / MANIFEST.MF

le fichier lui-même devrait avoir (au moins) ce seul doublure:

Main-Class: com.mypackage.MyClass

com.mypackage.MyClass est la classe qui détient le public void main (String [] args) point d'accès.

Notez qu'il y a plusieurs façons de faire ceci avec CLI, Maven, Ant ou Gradle:

Pour CLI, la commande suivante fera: (tks @dvvrt) jar cmvf META-INF/MANIFEST.MF <new-jar-filename>.jar <files to include>

Pour Maven, quelque chose comme l'extrait suivant devrait faire l'affaire. Notez que ceci est seulement la définition du plugin, pas la pleine pom.xml:

<build>
  <plugins>
    <plugin>
      <!-- Build an executable JAR -->
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-jar-plugin</artifactId>
      <version>3.1.0</version>
      <configuration>
        <archive>
          <manifest>
            <addClasspath>true</addClasspath>
            <classpathPrefix>lib/</classpathPrefix>
            <mainClass>com.mypackage.MyClass</mainClass>
          </manifest>
        </archive>
      </configuration>
    </plugin>
  </plugins>
</build>

(Choisissez un <version> approprié à votre projet.)

Pour Fourmi, l'extrait ci-dessous devrait aider:

<jar destfile="build/main/checksites.jar">
  <fileset dir="build/main/classes"/>
  <zipfileset includes="**/*.class" src="lib/main/some.jar"/>
  <manifest>
    <attribute name="Main-Class" value="com.acme.checksites.Main"/>
  </manifest>
</jar>

Crédits Michael Niemand -

Pour Gradle:

plugins {
    id 'java'
}

jar {
    manifest {
        attributes(
                'Main-Class': 'com.mypackage.MyClass'
        )
    }
}

591
2018-03-13 18:27



Cela aurait dû être java -jar app.jar au lieu de java -jar "app".

le -jar option ne fonctionne que si le fichier JAR est un fichier JAR exécutable, ce qui signifie qu'il doit avoir un fichier manifeste avec un Main-Class attribuer dedans. Voir Programmes d'empaquetage dans les fichiers JAR apprendre à créer un JAR exécutable.

Si ce n'est pas un fichier JAR exécutable, vous devez exécuter le programme avec quelque chose comme:

java -cp app.jar com.somepackage.SomeClass

com.somepackage.SomeClass est la classe qui contient le main méthode pour exécuter le programme. (Ce que cette classe est dépend du programme, il est impossible de dire à partir des informations que vous avez fournies).


196
2018-03-13 18:27



Alternativement, vous pouvez utiliser maven-assembly-plugin, comme indiqué dans l'exemple ci-dessous:

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <executions>
      <execution>
        <phase>package</phase>
        <goals>
          <goal>single</goal>
        </goals>
      </execution>
    </executions>
    <configuration>
      <archive>
        <manifest>
          <addClasspath>true</addClasspath>
          <mainClass>com.package.MainClass</mainClass>
        </manifest>
      </archive>
      <descriptorRefs>
        <descriptorRef>jar-with-dependencies</descriptorRef>
      </descriptorRefs>
    </configuration>
  </plugin> 

Dans cet exemple, tous les fichiers jar dépendants spécifiés dans la section seront automatiquement inclus dans votre fichier jar. Notez que jar-with-dependencies doit être mis littéralement comme, ne pas être remplacé par les noms de fichiers jar que vous souhaitez inclure.


76
2017-12-26 22:44



C'est parce que Java ne peut pas trouver l'attribut principal dans le fichier MANIFEST.MF. L'attribut Main est nécessaire pour indiquer à java quelle classe il doit utiliser comme point d'entrée de l'application. Dans le fichier jar, le fichier MANIFEST.MF se trouve dans le dossier META-INF. Vous vous demandez comment vous pouvez regarder ce qu'il y a dans un fichier jar? Ouvrez le fichier jar avec WinRAR.

L'attribut principal à l'intérieur du MANIFEST.MF ressemble à ceci:

Main-Class: <packagename>.<classname>

Vous obtenez cette erreur "pas d'attribut manifeste principal" lorsque cette ligne est manquante dans le fichier MANIFEST.MF.

C'est vraiment un gros gâchis de spécifier cet attribut dans le fichier MANIFEST.MF.

Mise à jour: Je viens de trouver un moyen vraiment pratique de spécifier le point d'entrée de l'application dans eclipse. Quand vous dites Export,

Select Jar and next 

[ give it a name in the next window ] and next

and next again

and you'll see " Select the class of the application entry point".

Just pick a class and Eclipse will automatically build a cool MANIFEST.MF for you.

enter image description here


47
2017-09-29 00:26



La réponse de Gradle est d'ajouter un paramètre jar / manifest / attributes comme ceci:

apply plugin: 'java'

jar {
    manifest {
        attributes 'Main-Class': 'com.package.app.Class'
    }
}

25
2018-05-10 00:15



Essayez cette commande pour inclure le fichier jar:

java -cp yourJarName.jar your.package..your.MainClass

18
2017-08-23 07:31



Pour maven, c'est ce qui l'a résolu (pour moi, pour un code de Veetle sur GitHub):

<build>
<plugins>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>2.0</version>
    <executions>
      <execution>
        <phase>package</phase>
        <goals>
          <goal>shade</goal>
        </goals>
        <configuration>
          <transformers>
            <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
              <mainClass>org.lazydevs.veetle.api.VeetleAPI</mainClass>
            </transformer>
          </transformers>
        </configuration>
      </execution>
    </executions>
  </plugin>
 </plugins>
</build>

À votre santé...


17
2018-03-01 16:06



J'ai eu ce problème lors de la création d'un pot en utilisant IntelliJ IDEA. Voir cette discussion.

Ce qui a résolu pour moi était de recréer l'artefact jar, en choisissant JAR> De modules avec dépendances, mais n'acceptant pas le répertoire par défaut pour META-INF / MANIFEST.MF. Changez le - / src / main / java en - / src / main / resources.

Sinon, il incluait un fichier manifeste dans le fichier jar, mais pas celui dans - / src / main / java qu'il devrait contenir.


12
2017-08-09 16:51