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.