Problème lors de la création d'une archive .jar exécutable

Résolu/Fermé
Keivan - 8 août 2016 à 16:29
 Keivan - 9 août 2016 à 13:18
Bonjour,

C'est la première fois que je pose une question sur un forum, donc je ne suis pas sûr de bien m'y prendre, mais voilà mon soucis :

J'ai fait un programme en java et je l'ai exporté en .jar ("Runnable Jar File").
Mais ce .jar n'est exécutable que sur mon ordinateur, car sur les autres ordinateurs, le message suivant apparaît : "Could not find the main class : Main.Main. Program will exist".
Donc je me suis renseigné et j'ai vu qu'il fallait créer soi-même l'archive .jar avec un fichier Manifest.mf rempli comme il faut.

Le problème c'est que je ne sais pas trop ce que je dois mettre dans ce manifest, ni comment agencer mon dossier que je veux compresser.

Ce que j'ai fait (et qui ne marche pas) :
J'ai un dossier "Projet" avec dedans toutes mes classes *.class, mon fichier MANIFEST.MF que j'ai rempli un peu au hasard...
Je lance la commande "jar cvmf MANIFEST.MF Programme.jar *.class" , ça me crée Programme.jar, mais quand je le lance (je ne peux le faire que via la console, je ne sais pas pourquoi), ça me dit "Impossible de trouver ou charger la classe principale : Main.class".

Quelqu'un sait-il comment on crée une telle archive ou peut-il me donner des conseils ?

Merci d'avance pour votre aide ! :)

Keivan

Pour info, j'ai mis le texte suivant dans mon Manifest :

Main-Class: Main.class
Class-Path: C:\Program Files\Java\jre1.8.0_91\bin


2 réponses

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
8 août 2016 à 18:02
Bonjour,

Enlèves la ligne Class-Path ainsi que l'extension .class dans Main-Class

Ne pas oublier de terminer par une ligne vide :

Main-Class: Main


Remarque : normalement il doit aussi y avoir le Manifest-Version mais cvmf va sûrement le rajouter tout seul (à vérifier dans le contenu du jar créé)
0
Bonjour

Oui, il y avait ça comme problème, mais aussi le fait que j'avais que mis *.class et pas les autres dossiers des autres packages et donc toutes les classes n'étaient pas prises.
Du coup le programme se lance presque parfaitement : il n'arrive pas à récuperer les librairies dont il a besoin (ce sont des librairies particulières qui ne sont pas les librairies de java par défaut).
Sais tu comment je dois indiquer dans le manifeste (ou autre ) le chemin de ces librairies ?

Merci beaucoup pour ton aide KX ! :)
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
8 août 2016 à 19:43
Il faut mettre ces librairies dans un dossier à côté et y faire référence en chemin relatif avec la valeur Class-Path

Exemple :
C:\MonDossier\monJar.jar
C:\MonDossier\lib\maLibrairie1.jar
C:\MonDossier\lib\maLibrairie2.jar
Class-Path: lib/maLibrairie1.jar lib/maLibrairie2.jar

Remarque : avec une configuration Maven de ton projet tu n'aurais pas tout ces problèmes de création de Manifest à la main. Voir : Débuter avec Maven
0
Choundeh > KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024
8 août 2016 à 19:50
D'accord, c'est bien ce que j'avais fait mais ça n'a pas marché...
Peut être parce que je cible un dossier de jars et pas tous les jars un par un ?
En gros je me suis arrêté à
Class-Path: lib/
Je travaille avec tortoise SVN, c'est ça le Maven ?
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
8 août 2016 à 20:01
Class-Path: lib/ cela devrait fonctionner je pense, mais toujours pareil, ne pas oublier la ligne vide à la fin, sinon ça ne prend pas en compte la dernière ligne

Et non, SVN c'est pour sauvegarder les différentes versions de ton code.
Maven c'est un utilitaire qui permet de compiler, générer des packages, gérer les jars de dépendances, etc.
0
Ok j'ai normalement le bon fichier Manifest.mf, mais il n'arrive pas à trouver les librairies...
Le message d'erreur est le suivant :
Exception in thread (...) java.lang.NoClassDefFoundError: org/jfree/data/xy/XYDataset


EDIT : Bon ça marche nickel si je mets pas les librairies dans un sous-dossier lib. C'est un peu moins organisé du coup, mais tant que ça marche... ;) Merci pour l'aide du coup !!
0