J'ai installé une application, mais lorsque j'essaie de l'exécuter (c'est un jar exécutable), rien ne se passe. Lorsque je l'exécute depuis la ligne de commande avec :
java -jar "app.jar" ;
j'obtiens le message suivant :
no main manifest attribute, in "app.jar" ;
Normalement, si j'avais créé le programme moi-même, j'aurais ajouté un attribut de classe main au fichier manifeste. Mais dans ce cas, puisque le fichier provient d'une application, je ne peux pas le faire. J'ai également essayé d'extraire le jar pour voir si je pouvais trouver la classe principale, mais il y a trop de classes et aucune d'entre elles n'a le mot "main" dans son nom. Il doit y avoir un moyen de résoudre ce problème car le programme fonctionne bien sur d'autres systèmes.
D'abord, c'est un peu bizarre, de voir que vous exécutez java -jar "app"
et pas java -jar app.jar
.
Deuxièmement, pour rendre un jar exécutable... vous devez mettre en jar un fichier appelé META-INF/MANIFEST.MF
le fichier lui-même doit avoir (au moins) cette ligne :
Main-Class: com.mypackage.MyClass
Où com.mypackage.MyClass
est la classe contenant le point d'entrée public static void main(String[] args).
Notez qu'il existe plusieurs façons d'effectuer cette opération, que ce soit avec la CLI, Maven, Ant ou Gradle :
Pour CLI, la commande suivante fera l'affaire : (tks @ [dvvrt][1])
jar cmvf META-INF/MANIFEST.MF <new-jar-filename>.jar <files à inclure>
Pour Maven, quelque chose comme le bout de phrase suivant devrait faire l'affaire. Notez qu'il s'agit uniquement de la définition du plugin, et non du pom.xml complet :
<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 une <version>
appropriée à votre projet.)
Pour Ant, le snippet ci-dessous devrait vous 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'
)
}
}
Cela aurait dû être java -jar app.jar
au lieu de java -jar "app"
.
L'option -jar
ne fonctionne que si le fichier JAR est un fichier JAR exécutable, ce qui signifie qu'il doit avoir un fichier manifest avec un attribut Main-Class
. Voir Packaging Programs in JAR Files pour savoir comment créer un JAR exécutable.
S'il ne s'agit pas d'un JAR exécutable, vous devrez exécuter le programme avec quelque chose comme :
java -cp app.jar com.somepackage.SomeClass
où com.somepackage.SomeClass
est la classe qui contient la méthode main
pour exécuter le programme. (La nature de cette classe dépend du programme, il est impossible de le dire à partir des informations que vous avez fournies).
Si le jar ne respecte pas [les règles][1], il ne s'agit pas d'un jar exécutable.
[1] : https://docs.oracle.com/javase/10/docs/specs/jar/jar.html#main-attributes