Problème de création de fichier .jar sous Eclipse

HenryP Messages postés 21 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 1 juillet 2011 - 20 juil. 2010 à 11:44
HenryP Messages postés 21 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 1 juillet 2011 - 24 juil. 2010 à 12:53
J'ai un problème avec la création d'un fichier Jar sous Eclipse et Windows 7.
Le petit bout de code ci-dessous fonctionne sans problème après compilation sous Eclipse.

package paq_ess_ctr;

import net.java.games.input.ControllerEnvironment;
import net.java.games.input.Controller;
import javax.swing.JDialog;
import javax.swing.JOptionPane;

public class EssCtr
 {
  public static void main(String[] args) 
   { 
ControllerEnvironment ce = ControllerEnvironment.getDefaultEnvironment();
    Controller[] cs = ce.getControllers();
    if (cs.length == 0)
     {
      System.out.println("Aucun controleur n'a été trouvé...");
      System.exit(0);
     }
    // Afficher le nom et le type de chaque controleur
    for (int i = 0; i < cs.length; i++)
     { 	
      System.out.println(i + ". " + cs[i].getName() + ", " + cs[i].getType() );
     }
    JDialog.setDefaultLookAndFeelDecorated(true);
    JOptionPane.showMessageDialog(null ,"Cet affichage est prévu...","Vérification",JOptionPane.ERROR_MESSAGE); 
   } 
 }


Et me fournit le résultat suivant sur la console, résultat correspondant bien à ma configuration du moment...


WARNING: Found unknown Windows version: Windows 7
Attempting to use default windows plug-in.
Loading: net.java.games.input.DirectAndRawInputEnvironmentPlugin
0. Périphérique clavier PIH, Keyboard
1. Souris HID, Mouse
2. T.Flight Stick X, Stick
3. HP USB Multimedia Keyboard, Unknown
4. HP USB Multimedia Keyboard, Unknown
5. HP USB Multimedia Keyboard, Unknown


Par contre dés que je veux "exporter" sous Eclipse vers un fichier EssCtr.jar en C:/FchJar, celui-ci est bien créé mais lors de la commande:

C:\FchJar>java -jar EssCtr.jar

J'obtiens :

Exception in thread "main" java.lang.NoClassDefFoundError: net/java/games/input/ControllerEnvironment
at paq_ess_ctr.EssCtr.main(EssCtr.java:11)
Caused by: java.lang.ClassNotFoundException: net.java.games.input.ControllerEnvironment
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
... 1 more


Ce qui semble vouloir dire que la classe net.java.games.input.ControllerEnvironment n'est pas trouvée, or celle-ci se trouve dans jinput.jar.

Dans Eclipse la structure du projet est la suivante:



Où jinput.jar a bien été mentionné comme bibliothèque référencée de même que les deux dll nécessaires.
Dans Manifest j'ai pratiquement tenté toutes les possibilités de Class-Path pour que le fichier Jar trouve jinput.jar sans succès.

Et maintenant je ne sais vraiment plus quoi faire. Merci d'avance de votre aide éventuelle.

18 réponses

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 131
20 juil. 2010 à 13:37
Salut,

Erreur classique : ton fichier manifest ne doit pas être bon.

Décompresse ton jar, et ouvre le fichier manifest.mf qui se trouve dedans et regarde s'il correspond bien à celui qui est dans eclipse déjà. Si il est identique, montre nous son contenu afin de voir ce qui cloche.
______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
HenryP Messages postés 21 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 1 juillet 2011
20 juil. 2010 à 17:44
Bonjour,

Voici le contenu de MANIFEST.MF d'Eclipse

Manifest-Version: 1.0
Main-Class: paq_ess_ctr.EssCtr
Class-Path: jinput.jar


Par contre dans EssCtr.jar

j'ai un dossier META-INF dans lequel se trouve un fichier MANIFEST.MF dont le contenu est :

Manifest-Version: 1.0
Main-Class: paq_ess_ctr.EssCtr


Et toujours dans EssCtr.jar j'ai aussi un autre fichier MANIFEST.MF dont le contenu est :

Manifest-Version: 1.0
Main-Class: paq_ess_ctr.EssCtr
Class-Path: jinput.jar


C'est à dire le même que celui d'Eclipse...

Pour info, voici la structure du fichier EssCtr.jar avec les contenus des fichiers MANIFEST.MF en italique

META-INF
MANIFEST.MF
[i] Manifest-Version: 1.0
Main-Class: paq_ess_ctr.EssCtr/i
paq_ess_ctr
EssCtr.class
.classpath
.project
.MANIFEST.MF
[i] Manifest-Version: 1.0
Main-Class: paq_ess_ctr.EssCtr
Class-Path: jinput.jar/i
jinput_dx8_64.dll
jinput_raw_64.dll
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 131
20 juil. 2010 à 17:52
Salut,

Donc le fichier manifest du fichier jar est différent de celui d'eclipse : le fichier MANIFEST contenu à la racine de ton jar n'est pas celui qui est utilisé par java : il est là car c'est un simple export de ton arborescence de fichier de ton projet eclipse. Tu peux l'ignorer lors de la création du jar.

Par contre, le MANIFEST qui est dans le dossier META-INF est celui qui est utilisé par la jvm... et par contre celui-là n'est pas bon : pas de classpath dedans, et du coup, il ne vas pas chercher la moindre bibliothèque, d'où l'erreur que tu obtiens.

Dis à eclipse d'utiliser TON fichier MANIFEST et non de le générer automatiquement.
______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
HenryP Messages postés 21 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 1 juillet 2011
20 juil. 2010 à 18:39
J'ai bien maintenant dans le fichier MANIFEST.MF du répertoire META-INF le contenu ci-dessous:

Manifest-Version: 1.0
Class-Path: jinput.jar
Main-Class: paq_ess_ctr.EssCtr


Qui, à l'inversion prés, correspond bien à Eclipse, par contre à l'exécution, il me fournit le même résultat, il ne fonctionne pas. Le contenu de jinput n'est toujours pas présent donc non-exporté. Est-ce dans le Class-Path qu'il y a un problème?

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 131
20 juil. 2010 à 18:48
Salut,

Le contenu de jinput n'est toujours pas présent donc non-exporté.


C'est-à-dire ? Le but d'une bibliothèque, c'est d'être partagée par toutes les applications. Donc eclipse ne la met pas dans le fichier jar de ton projet. C'est à toi de fournir cette bibliothèque en même temps que le jar de ton projet (le standard veut de faire un dossier "bin" contenant le jar exécutable, et un dossier "lib" contenant les jar des bibliothèques.
______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
HenryP Messages postés 21 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 1 juillet 2011
20 juil. 2010 à 19:07
Maintenant, j'avoue que je suis dépassé. je ne vois pas comment doit se présenter cette structure.
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 131
20 juil. 2010 à 19:13
Salut,

Et bien dans le dossier contenant ton jar, tu crée un dossier "lib" dans lequel tu mets les jars ainsi que les dll des bibliothèques que tu utilises, et dans ton fichier MANIFEST tu références ces bibliothèques :
Manifest-Version: 1.0
Class-Path: lib/jinput.jar
Main-Class: paq_ess_ctr.EssCtr
______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
HenryP Messages postés 21 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 1 juillet 2011
21 juil. 2010 à 15:43
Bonjour,

il y a du progrès...

Voici, maintenant, la structure du projet sous Eclipse:



Dans la bibliothèque "lib" il y a "jinput.jar" qui contient donc toutes les "class" nécessaires.
Ensuite, j'ai la décompression de "jinput" avec, là aussi, toutes les "class" nécessaires.
Et en dernière position les deux "dll" elles aussi nécessaires.

A noter que la décompression de "jinput" n'est pas prise en compte par Eclipse qui fonctionne bien sans.

Après "export" sous forme d'un fichier EssCtr.jar

La structure de celui-ci se présente sous la forme ci-dessous



A noter que l'arborescence "net...." est présente de même que les deux "dll".

Maintenant en ligne de commande j'ai le résultat correcte suivant:

C:\FchJar>java -jar EssCtr.jar
WARNING: Found unknown Windows version: Windows 7
Attempting to use default windows plug-in.
Loading: net.java.games.input.DirectAndRawInputEnvironmentPlugin
0. PÚriphÚrique clavier PIH, Keyboard
1. Souris HID, Mouse
2. T.Flight Stick X, Stick
3. HP USB Multimedia Keyboard, Unknown
4. HP USB Multimedia Keyboard, Unknown
5. HP USB Multimedia Keyboard, Unknown


De même que j'ai bien l'affichage du popup ci-dessous que j'avais prévu.



Donc, tout semble bon, mais il y a encore un hic, c'est que deux clics sur le nom du fichier "EssCtr.jar" ne produisent aucun effet (aucun affichage de popup). Ce qui semble vouloir dire que Windows, quant à lui, n'est pas tout a fait d'accord.

Merci pour l'efficacité de ton aide et excuse-moi d'en abuser...
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 131
21 juil. 2010 à 15:52
Salut,

Tu n'as pas besoin de décompresser le jar : copier le jar dans le dossier lib suffit.

Pour le double-clic sur le jar, ca ne te fait rien du tout ? pas de message, pas de fenêtre, rien ?

Tu as installé la jvm de sun ou une autre ?
______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
HenryP Messages postés 21 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 1 juillet 2011
21 juil. 2010 à 17:27
Pour le double-clic, je n'ai effectivement aucun message, aucune fenêtre, en fait rien , absolument rien. Ce double-clic fonctionne pour d'autres essais ne comportant ni bibliothèque externe ni fichiers dll.

Sous Windows, j'ai vérifié le choix des programmes par défaut en fonction des extensions

Extension........Description.............Paramètre par défaut actuel

.jar.............Executable jar file.....Java(TM) platform SE Binary

Pour le fichier jar, il est déjà dans lib...
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 131
21 juil. 2010 à 17:34
Salut,

Exécute le par la console windows pour voir l'exception qui se déclenche (sûrement un problème avec le classpath).
______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
HenryP Messages postés 21 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 1 juillet 2011
21 juil. 2010 à 18:15
Avec la console Windows pas de problème comme te le montre la copie d'écran ci-dessous.



Dans la console, j'ai bien le résultat escompté et en milieu d'écran le popup que doit afficher Windows

Par contre, sous Windows, aux niveau des programmes j'ai:

java(TM) 6 update 18(64bits) du 28/03/2010
java(TM) 6 update 20.........du 13/06/2010

Pourquoi les deux dont le dernier non-spécifié en 64 bits
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 131
21 juil. 2010 à 18:25
Salut,

Pour les multiples installations, c'est sûrement dû à une double installation (une version 64 bits et une version 32 bits, ou alors une mise à jour automatique de java).

Là je n'ai pas trop d'idées, si ca se lance correctement dans la console et pas en double cliquant dessus. essaye en faisant un raccourci, et en précisant bien la cible du lien pour qu'il s'exécute dans le répertoire contenant le jar pour voir.
______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
HenryP Messages postés 21 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 1 juillet 2011
21 juil. 2010 à 19:49
Je m'excuse, j'ai tout faux. En fait cela ne fonctionne pas non plus. Bien que les deux dll apparaissent dans EssCtr.jar, elles ne participent pas au fonctionnement. En effet, J'avais oublié que ces deux dll étaient déjà dans mon répertoire FchJar. En mettant EssCtr.jar, tout seul, dans un répertoire, il ne fonctionne pas tant que je n'ai pas mis les deux dll dans ce nouveau répertoire.
Décidément, cela m'a l'air d'être un sacré problème...
Bonsoir
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 131
21 juil. 2010 à 20:32
Salut,

Attends, quel est le contenu de ton jar exactement et le contenu du dossier dans lequel est ton jar ?

Ton jar ne dois contenir que les classes compilées de ton projet : les jars et dll utilisées par ton projet ne doivent pas être contenues dans ton jar mais mises "à côté" dans un dossier "lib" par exemple, et paramétrer ton fichier manifest afin qu'il fasse référence aux jars utilisés dans le classpath.
______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
HenryP Messages postés 21 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 1 juillet 2011
22 juil. 2010 à 20:28
Bonsoir,

Je viens de passer une partie de la journée sur mon problème sans résultat positif. Finalement, je commence à me demander si ce petit programme (une vingtaine lignes de code) qui fonctionne bien sous Eclipse, peut être "exporté" sous forme de fichier.jar.
Je pense, par ailleurs, que si cela était si simple, j'aurais bien trouvé sur le web un exemple s'y rapprochant.
Sur les trois forums où j'ai posé le problème, tu as bien été le seul à faire avancer les choses.
Une question cependant, as-tu essayé de faire tourner ce programme?
Merci encore de ton aide.
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 131
23 juil. 2010 à 09:44
Salut,

Bien sûr que c'est possible à exporter vers un jar : tout ce qui marche sous eclipse doit marcher au format jar, là n'est pas le problème.

Je n'ai pas essayé de faire tourné ton programme : j'ai un emploi du temps assez chargé ces derniers temps, ca devrait un peu se calmer la semaine prochaine j'espère.

Le problème principal dans ton cas c'est l'utilisation de dll (vraiment pas pratique d'utiliser des bibliothèques avec des dépendances natives en java !).

Pour résumer, il faut que tu génères un jar contenant les classes compilées de ton projet (et uniquement les classes compilées : pas de fichier jar ou de dll dedans, ca ne sert à rien vu que la jvm ne les exploitera pas).
Il faut que tu crées un dossier "lib" dans le dossier contenant ton jar (c'est pas obligatoire, mais plus pratique).
Tu copie dans ce dossier lib les jars et dll dont dépend ton projet.
Tu références dans ton fichier MANIFEST les jars dont dépend ton projet (en lui disant d'aller les chercher dans le dossier lib, ca doit ressembler à un truc du genre : "Class-Path: lib/jinput.jar")
Si après tout cà ca ne marche toujours pas, essaye en ajoutant le répertoire "lib" dans la variable d'environnement PATH de ton OS (étant donné qu'il s'agit de dll native, peut-être que la jvm a du mal à trouver l'emplacement de ces dll et passe par le système pour qu'il les lui délivre).

Là en théorie après tout çà, ça devrait marcher.
______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
HenryP Messages postés 21 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 1 juillet 2011
24 juil. 2010 à 12:53
Bonjour,

J'ai suivi tes conseils et j'ai crée un nouveau répertoire c:/Fj. Du coté du fichier EssCtr.jar, je l'ai particulièrement élagué.

J'ai essayé de relancé le tout, à partir de la console, sans succès...

J'ai ensuite suivi ton dernier conseil et j'ai mentionné dans le Path des variables d'environnement le nouveau répertoire.

Et maintenant, ça fonctionne sans problème au niveau de la console mais toujours rien au niveau d'un double-clic.

Ainsi, ton dernier conseil a pas mal fait avancer les choses. Par contre, je me pose la question, cette modification du Path est une obligation au bon fonctionnement et cette mini-application n'est donc pas exécutable sur une autre machine tant que son Path n'a pas été modifié.

Voici la nouvelle structure du répertoire "Fj"

Fj

.lib
..jinput.jar
..jinput-dx8_64.dll
..jinput-rax_64.dll
.EssCtr.jar
..META-INF
...MANIFEST.MF
....Manifest-Version: 1.0
....Class-Path: lib/jinput lib/jinput-dx_64.dll lib/jinput-raw_64.dll
....Main-Class: paq_ess_ctr.EssCtr
..paq_ess_ctr
...EssCtr.class


Pour info voici le contenu des variables d'environnement Path:

C:\Program Files\Java\jdk1.6.0_18\bin;
%SystemRoot%\System32;
%SystemRoot%;
%SystemRoot%\System32\Wben;
%SYTEMROOT%\System32\WindowsPowerShell\v1.0\;
C:\Fj\lib


Pourquoi un SYSTEMROOT entiérement en majuscule ? Mystère ?

Voilà où j'en suis...
Rejoignez-nous