IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

problème réalisation fichier jar


Sujet :

Java

  1. #1
    Membre chevronné

    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 974
    Points : 1 825
    Points
    1 825
    Par défaut problème réalisation fichier jar
    Bonjour,

    je finalise une application domotique destinée à tourner sur un Raspberry Pi avec la librairie pi4J.

    http://pi4j.com/

    Le soft tourne bien. La réalisation d'un fichier jar à partir du projet fonctionne aussi. Par contre, à l’exécution de ce fichier jar, j'ai systématiquement le fameux NoClassDefFoundError qui survient. Ne trouvant pas l'erreur, j'ai réussi à reproduire l'erreur avec un code de quelques lignes:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
      1 import com.pi4j.io.gpio.GpioController;
      2 import com.pi4j.io.gpio.GpioFactory;
      3 import com.pi4j.io.gpio.GpioPinDigitalInput;
      4 import com.pi4j.io.gpio.PinPullResistance;
      5 import com.pi4j.io.gpio.RaspiPin;
      6 import com.pi4j.io.gpio.event.GpioPinDigitalStateChangeEvent;
      7 import com.pi4j.io.gpio.event.GpioPinListenerDigital;
      8 
      9 
     10 
     11 public class DetectMouv {
     12 
     13     public static void main(String args[]) throws InterruptedException {
     14 
     15         System.out.println("<--Pi4J Début--> ");
     16 
     17         final GpioController gpio = GpioFactory.getInstance();
     18 
     19         final GpioPinDigitalInput myButton = gpio.provisionDigitalInputPin(RaspiPin.GPIO_01, PinPullResistance.PULL_DOWN);
     20 
     21         myButton.addListener(new GpioPinListenerDigital() {
     22             @Override
     23             public void handleGpioPinDigitalStateChangeEvent(GpioPinDigitalStateChangeEvent event) {
     24                 System.out.println(" --> GPIO PIN ETAT CHANGE: " );
     25             }
     26 
     27         });
     28 
     29 
     30 
     31         System.out.println("visualisation des détections ci-dessous ");
     32 
     33         for (;;) {
     34             Thread.sleep(500);
     35         }
     36 }
     37 
     38 }
    ce code compile avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        javac -cp .:./'*' DetectMouv.java
    et fonctionne avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    java -cp .:./'*'  DetectMouv
    Cela donne le résultat suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <--Pi4J Début--> 
    visualisation des détections ci-dessous 
     --> GPIO PIN ETAT CHANGE: 
     --> GPIO PIN ETAT CHANGE:
    Le fichier jar est créé comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    jar cvmf MANIFEST.MF DetectMouv.jar DetectMouv.class pi4j*.jar
     
    manifeste ajouté
    ajout : DetectMouv.class(entrée = 1364) (sortie = 766)(compression : 43 %)
    ajout : pi4j-core.jar(entrée = 170200) (sortie = 152466)(compression : 10 %)
    ajout : pi4j-device.jar(entrée = 96553) (sortie = 77595)(compression : 19 %)
    ajout : pi4j-gpio-extension.jar(entrée = 53402) (sortie = 48963)(compression : 8 %)
    ajout : pi4j-service.jar(entrée = 17356) (sortie = 13754)(compression : 20 %)
    avec le MANIFEST.MF suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Manifest-Version: 1.0
    Class-Path: pi4j-core.jar  pi4j-device.jar pi4j-gpio-extension.jar pi4j-service.jar
    Main-Class: DetectMouv
    Par contre, la commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    java -jar DetectMouv.jar
    donne le message d'erreur suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <--Pi4J Début--> 
    Exception in thread "main" java.lang.NoClassDefFoundError: DetectMouv$1
    	at DetectMouv.main(DetectMouv.java:21)
    Caused by: java.lang.ClassNotFoundException: DetectMouv$1
    	at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    	at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    	... 1 more
    A titre d'info, voici le contenu du répertoire de travail

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    -rw-r--r-- 1 pi pi    679 juil.  8 05:25 DetectMouv$1.class
    -rw-r--r-- 1 pi pi   1364 juil.  8 05:25 DetectMouv.class
    -rw-r--r-- 1 pi pi 294584 juil.  8 05:28 DetectMouv.jar
    -rw-r--r-- 1 pi pi   1061 juil.  8 05:11 DetectMouv.java
    -rw-r--r-- 1 pi pi    130 juil.  8 05:06 MANIFEST.MF
    -rw-r--r-- 1 pi pi 170200 juil.  8 02:27 pi4j-core.jar
    -rw-r--r-- 1 pi pi  96553 juil.  8 02:27 pi4j-device.jar
    -rw-r--r-- 1 pi pi  53402 juil.  8 02:27 pi4j-gpio-extension.jar
    -rw-r--r-- 1 pi pi  17356 juil.  8 02:27 pi4j-service.jar
    Je ne vois pas ce que le fichier jar n'apprécie pas ligne 21 du code. Quelqu'un a-t-il une solution ?

    merci d'avance.

    PS:

    problème sur un RPI (ARMv6-compatible processeurr rev 7 avec jdk 1.7.0_40 avec comme OS une RaspBian)
    même comportement sur un pc core i7 avec jdk 1.8 et une Debian stable 64 bits à jour.

  2. #2
    Nouveau membre du Club
    Inscrit en
    Mars 2006
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 27
    Points : 37
    Points
    37
    Par défaut
    Bonjour,

    A la ligne 21 de ton code tu crées ton listener. Or ce listener est une classe anonyme (nommée DetectMouv$1).

    Vu la commande que tu donnes il semblerait que tu n'inclue pas cette classe anonyme dans ton jar. Et c'est ce qui lui manque.

    Il te suffit donc de l'inclure dans ton jar et tout sera résolu.

  3. #3
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Deux remarques sur le code que tu utilises pour créer le jar :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    jar cvmf MANIFEST.MF DetectMouv.jar DetectMouv.class pi4j*.jar
    • Les fichiers pi4j*.jar n'ont pas à être ajouté dans ton jar principal.
      Le Class-Path du MANIFEST fait référence à des fichiers jar dans le même répertoire que ton jar principal, et non pas à l'intérieur de celui-ci.
    • Le fichier DetectMouv$1.class n'est pas ajouté dans le jar.
      Il s'agit du code de la classe anonyme (ligne 21 justement). Du coup à l'exécution il ne peut pas charger le code de cette classe dans le jar...



    Bref ton jar devrait être généré comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    jar cvmf MANIFEST.MF DetectMouv.jar *.class

    a++

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 974
    Points : 1 825
    Points
    1 825
    Par défaut
    c'était bien l'oubli de la classe anonyme qui posait problème.

    merci à vous deux

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de fichier Jar
    Par asbelhamidi dans le forum Général Java
    Réponses: 1
    Dernier message: 05/07/2012, 08h12
  2. Problème création fichier Jar
    Par Henri dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 08/07/2010, 11h30
  3. problème de fichier jar
    Par visiteur2 dans le forum Glassfish et Payara
    Réponses: 1
    Dernier message: 17/11/2009, 00h12
  4. Problème de fichier jar avec eclipse<débutant>
    Par melodie53 dans le forum Eclipse Java
    Réponses: 7
    Dernier message: 28/07/2006, 15h41
  5. Problème exportation fichier jar + mysql
    Par oliwan dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 07/05/2006, 20h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo