# JAR Dateien einbinden - funkt nicht wie es sollte...



## KIllrogg (7. Aug 2014)

Hallo! 
.. 
Ich bin ja nicht unbedingt ein totaler noob, aber ich bringe es scheinbar nicht zustande, die Jar Dateien von pi4j (wird zum Ansteuern der GPIOs vom Raspberry benötigt) richtig zum laufen zu bringen... 

Die Jar Dateien habe ich zum Bildpath hinzugefügt (dieses Vorgehen kenne ich schon von den SQL Treibern), doch wenn ich dann mein kleines Testprogramm laufen lassen will kommen (zig) Fehlermeldungen dich ich als "du hast den Buildpath nicht richtig eingebunden" interpretiere. 
Ich habe nun schon einiges versucht bin aber ziemlich ratlos wie ich das beheben kann, weiss hier vlt. jmd bitte Rat?



Hier die Console von Eclipse (kepler): 

```
GPIO Tests... started. 
 erstelle GPIO Controller... 
java.io.IOException: Cannot run program "bash": CreateProcess error=2, Das System kann die angegebene Datei nicht finden
	at java.lang.ProcessBuilder.start(Unknown Source)
	at java.lang.Runtime.exec(Unknown Source)
	at java.lang.Runtime.exec(Unknown Source)
	at java.lang.Runtime.exec(Unknown Source)
	at com.pi4j.util.ExecUtil.execute(ExecUtil.java:45)
	at com.pi4j.util.ExecUtil.execute(ExecUtil.java:40)
	at com.pi4j.system.SystemInfo.getBashVersionInfo(SystemInfo.java:441)
	at com.pi4j.system.SystemInfo.access$000(SystemInfo.java:43)
	at com.pi4j.system.SystemInfo$2.run(SystemInfo.java:193)
	at com.pi4j.system.SystemInfo$2.run(SystemInfo.java:190)
	at java.security.AccessController.doPrivileged(Native Method)
	at com.pi4j.system.SystemInfo.isHardFloatAbi(SystemInfo.java:190)
	at com.pi4j.util.NativeLibraryLoader.load(NativeLibraryLoader.java:153)
	at com.pi4j.wiringpi.Gpio.<clinit>(Gpio.java:138)
	at com.pi4j.io.gpio.RaspiGpioProvider.<init>(RaspiGpioProvider.java:47)
	at com.pi4j.io.gpio.GpioFactory.getDefaultProvider(GpioFactory.java:102)
	at com.pi4j.io.gpio.impl.GpioControllerImpl.<init>(GpioControllerImpl.java:67)
	at com.pi4j.io.gpio.GpioFactory.getInstance(GpioFactory.java:85)
	at consoleProg.GPIOtests.main(GPIOtests.java:24)
Caused by: java.io.IOException: CreateProcess error=2, Das System kann die angegebene Datei nicht finden
	at java.lang.ProcessImpl.create(Native Method)
	at java.lang.ProcessImpl.<init>(Unknown Source)
	at java.lang.ProcessImpl.start(Unknown Source)
	... 19 more
java.io.IOException: Cannot run program "/usr/bin/readelf": CreateProcess error=2, Das System kann die angegebene Datei nicht finden
	at java.lang.ProcessBuilder.start(Unknown Source)
	at java.lang.Runtime.exec(Unknown Source)
	at java.lang.Runtime.exec(Unknown Source)
	at java.lang.Runtime.exec(Unknown Source)
	at com.pi4j.util.ExecUtil.execute(ExecUtil.java:45)
	at com.pi4j.util.ExecUtil.execute(ExecUtil.java:40)
	at com.pi4j.system.SystemInfo.getReadElfTag(SystemInfo.java:472)
	at com.pi4j.system.SystemInfo.hasReadElfTag(SystemInfo.java:459)
	at com.pi4j.system.SystemInfo.access$100(SystemInfo.java:43)
	at com.pi4j.system.SystemInfo$2.run(SystemInfo.java:193)
	at com.pi4j.system.SystemInfo$2.run(SystemInfo.java:190)
	at java.security.AccessController.doPrivileged(Native Method)
	at com.pi4j.system.SystemInfo.isHardFloatAbi(SystemInfo.java:190)
	at com.pi4j.util.NativeLibraryLoader.load(NativeLibraryLoader.java:153)
	at com.pi4j.wiringpi.Gpio.<clinit>(Gpio.java:138)
	at com.pi4j.io.gpio.RaspiGpioProvider.<init>(RaspiGpioProvider.java:47)
	at com.pi4j.io.gpio.GpioFactory.getDefaultProvider(GpioFactory.java:102)
	at com.pi4j.io.gpio.impl.GpioControllerImpl.<init>(GpioControllerImpl.java:67)
	at com.pi4j.io.gpio.GpioFactory.getInstance(GpioFactory.java:85)
	at consoleProg.GPIOtests.main(GPIOtests.java:24)
Caused by: java.io.IOException: CreateProcess error=2, Das System kann die angegebene Datei nicht finden
	at java.lang.ProcessImpl.create(Native Method)
	at java.lang.ProcessImpl.<init>(Unknown Source)
	at java.lang.ProcessImpl.start(Unknown Source)
	... 20 more
java.io.IOException: Cannot run program "bash": CreateProcess error=2, Das System kann die angegebene Datei nicht finden
	at java.lang.ProcessBuilder.start(Unknown Source)
	at java.lang.Runtime.exec(Unknown Source)
	at java.lang.Runtime.exec(Unknown Source)
	at java.lang.Runtime.exec(Unknown Source)
	at com.pi4j.util.ExecUtil.execute(ExecUtil.java:45)
	at com.pi4j.util.ExecUtil.execute(ExecUtil.java:40)
	at com.pi4j.system.SystemInfo.getBashVersionInfo(SystemInfo.java:441)
	at com.pi4j.system.SystemInfo.access$000(SystemInfo.java:43)
	at com.pi4j.system.SystemInfo$2.run(SystemInfo.java:193)
	at com.pi4j.system.SystemInfo$2.run(SystemInfo.java:190)
	at java.security.AccessController.doPrivileged(Native Method)
	at com.pi4j.system.SystemInfo.isHardFloatAbi(SystemInfo.java:190)
	at com.pi4j.util.NativeLibraryLoader.load(NativeLibraryLoader.java:154)
	at com.pi4j.wiringpi.Gpio.<clinit>(Gpio.java:138)
	at com.pi4j.io.gpio.RaspiGpioProvider.<init>(RaspiGpioProvider.java:47)
	at com.pi4j.io.gpio.GpioFactory.getDefaultProvider(GpioFactory.java:102)
	at com.pi4j.io.gpio.impl.GpioControllerImpl.<init>(GpioControllerImpl.java:67)
	at com.pi4j.io.gpio.GpioFactory.getInstance(GpioFactory.java:85)
	at consoleProg.GPIOtests.main(GPIOtests.java:24)
Caused by: java.io.IOException: CreateProcess error=2, Das System kann die angegebene Datei nicht finden
	at java.lang.ProcessImpl.create(Native Method)
	at java.lang.ProcessImpl.<init>(Unknown Source)
	at java.lang.ProcessImpl.start(Unknown Source)
	... 19 more
java.io.IOException: Cannot run program "/usr/bin/readelf": CreateProcess error=2, Das System kann die angegebene Datei nicht finden
	at java.lang.ProcessBuilder.start(Unknown Source)
	at java.lang.Runtime.exec(Unknown Source)
	at java.lang.Runtime.exec(Unknown Source)
	at java.lang.Runtime.exec(Unknown Source)
	at com.pi4j.util.ExecUtil.execute(ExecUtil.java:45)
	at com.pi4j.util.ExecUtil.execute(ExecUtil.java:40)
	at com.pi4j.system.SystemInfo.getReadElfTag(SystemInfo.java:472)
	at com.pi4j.system.SystemInfo.hasReadElfTag(SystemInfo.java:459)
	at com.pi4j.system.SystemInfo.access$100(SystemInfo.java:43)
	at com.pi4j.system.SystemInfo$2.run(SystemInfo.java:193)
	at com.pi4j.system.SystemInfo$2.run(SystemInfo.java:190)
	at java.security.AccessController.doPrivileged(Native Method)
	at com.pi4j.system.SystemInfo.isHardFloatAbi(SystemInfo.java:190)
	at com.pi4j.util.NativeLibraryLoader.load(NativeLibraryLoader.java:154)
	at com.pi4j.wiringpi.Gpio.<clinit>(Gpio.java:138)
	at com.pi4j.io.gpio.RaspiGpioProvider.<init>(RaspiGpioProvider.java:47)
	at com.pi4j.io.gpio.GpioFactory.getDefaultProvider(GpioFactory.java:102)
	at com.pi4j.io.gpio.impl.GpioControllerImpl.<init>(GpioControllerImpl.java:67)
	at com.pi4j.io.gpio.GpioFactory.getInstance(GpioFactory.java:85)
	at consoleProg.GPIOtests.main(GPIOtests.java:24)
Caused by: java.io.IOException: CreateProcess error=2, Das System kann die angegebene Datei nicht finden
	at java.lang.ProcessImpl.create(Native Method)
	at java.lang.ProcessImpl.<init>(Unknown Source)
	at java.lang.ProcessImpl.start(Unknown Source)
	... 20 more
Aug 06, 2014 2:40:01 PM com.pi4j.util.NativeLibraryLoader load
Schwerwiegend: Failed to load library [pi4j] using the System.load(file) method using embedded resource file: [jar:file:/C:/Users/user stuff usw... /RaspberryTests/lib/pi4j-core-sources.jar!/lib/soft-float/libpi4j.so]
Aug 06, 2014 2:40:01 PM com.pi4j.util.NativeLibraryLoader load
Schwerwiegend: ERROR:  The native library [pi4j : libpi4j.so] could not be found in the JVM library path nor could it be loaded from the embedded JAR resource file; you may need to explicitly define the library path '-Djava.library.path' where this native library can be found.
Exception in thread "main" java.lang.UnsatisfiedLinkError: com.pi4j.wiringpi.Gpio.wiringPiSetup()I
	at com.pi4j.wiringpi.Gpio.wiringPiSetup(Native Method)
	at com.pi4j.io.gpio.RaspiGpioProvider.<init>(RaspiGpioProvider.java:47)
	at com.pi4j.io.gpio.GpioFactory.getDefaultProvider(GpioFactory.java:102)
	at com.pi4j.io.gpio.impl.GpioControllerImpl.<init>(GpioControllerImpl.java:67)
	at com.pi4j.io.gpio.GpioFactory.getInstance(GpioFactory.java:85)
	at consoleProg.GPIOtests.main(GPIOtests.java:24)
```


und hier noch der verursachende Code: 

```
package consoleProg;

import com.pi4j.io.gpio.GpioController;
import com.pi4j.io.gpio.GpioFactory;
import com.pi4j.io.gpio.GpioPinDigitalOutput;
import com.pi4j.io.gpio.PinState;
import com.pi4j.io.gpio.RaspiPin;


//import com.pi4j.io.gpio.*;

public class GPIOtests {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws InterruptedException{

		System.out.println("GPIO Tests... started. \n erstelle GPIO Controller... ");
		
		// Erstellt einen GpioController welcher diverse Funktionen anbietet um
                // Ein- Ausgabe Operation durchzuführen.
   
		final GpioController gpio = GpioFactory.getInstance();
        
		System.out.println("Programm ist beendet.");

	}

}
```


----------



## lawila (7. Aug 2014)

ich stelle die frage mal bewusst so : versuchst du deinen code in eclipse auf diner x86er hardware zu testen ?


----------



## Joose (7. Aug 2014)

In diesem Fall steht zwar ganz oben im StackTrace der eigentliche Fehler, aber da es sich hier um eine 3rd Library handelt sollte man natürlich ein bisschen weiter schauen. Ganz unten im StackTrace hast du eine genauere Beschreibung was er nicht findet und sogar auch eine mögliche Lösung vorgeschlagen.

Ansonsten habe ich nur diesen Link zu dem Problem gefunden.



KIllrogg hat gesagt.:


> ```
> Caused by: java.io.IOException: CreateProcess error=2, Das System kann die angegebene Datei nicht finden
> at java.lang.ProcessImpl.create(Native Method)
> at java.lang.ProcessImpl.<init>(Unknown Source)
> ...


----------



## lawila (7. Aug 2014)

@joose
danke für den ausschnitt ... ich habs total überlesen

C:/Users/user stuff usw... /RaspberryTests/lib/pi4j-core-sources.jar!/lib/soft-float/libpi4j.so

@TO
DAS ist doch jetzt wohl echt nicht wirklich dein ernst oder ?

du versuchst native-code der auf dem raspi laufen soll unter windows auf einer völlig anderen hardware zu testen ... DAS kann doch nur schief gehen


----------



## KIllrogg (7. Aug 2014)

hui danke schon mal für die unglaublich schnelle Hilfe!



			
				lawila hat gesagt.:
			
		

> @TO
> DAS ist doch jetzt wohl echt nicht wirklich dein ernst oder ?
> 
> du versuchst native-code der auf dem raspi laufen soll unter windows auf einer völlig anderen hardware zu testen ... DAS kann doch nur schief gehen



äh... doch. 
DAS ist mein Ernst... 
Vorweg: ich erzeuge ja "nur" ein Object vom Typ GpioController. Da greife ich doch nicht (oder doch??) auf eine Hardware zu (ich hab keine Ahnung ob der Constructor evtl. auf die HW zugreift.. das wäre in der Tat... schön blöd...)? 

Also müsste das Schnippselchen Code ja auch auf einer Win Maschine laufen? So meine Idee, nach "einigem versuchen":
Ganz zu Beginn hab ich ja einfach mal ein kleines Prog geschrieben, dass eine controller instanz holt einen Pin generiert und den wollte ich in einer Schleife ein und ausschalten und die ausgehende Spannung messen (um zu prüfen ob die HW und mein kleines mini Prog eh funktionieren.) 

Das ganz als JAR Datei exportiert und am pi gestartet. Und was kommt da raus?
Nachstehende Fehlermeldung auf der raspianconsole:
(die auch ident raus kommt wenn ich nur den Coder der im ersten Post gelistet ist, laufen lasse - also nur die Controllerinstanz holen)



			
				pi console hat gesagt.:
			
		

> GPIO Tests... started.
> erstelle GPIO Controller...
> Exception in thread "main" java.lang.NoClassDefFoundError: com/pi4j/io/gpio/GpioFactory
> at consoleProg.GPIOtests.main(GPIOtests.java:42)
> ...



ok, denk ich mir, der findet eine Klasse nicht ... hmm schauen wir mal was eclipse mir da an stacktrace liefert -> *Win x86er Maschine play drück*

Meinem Verständnis nach sagt die Unmenge an rotem Text in eclipse: "Du hast die JAR nicht richtig eingebunden"
ok... ich glaube doch... (ist ja mMn ned so schwer... vgl. SQL in BuildPath aufnehmen, kenn ich ja...)
Und noch einiges mehr... klar ein 


			
				eclipse hat gesagt.:
			
		

> Cannot run program "bash": CreateProcess error=2, Das System kann die angegebene Datei nicht finden


 wird nicht funktionieren auf dem Windowsrechner... 
ABER eben auch hier jammer eclipse rum von wegen: "libary not found" - klingt wie auf der bash vom pi nach: ich bin zu doof die JAR richtig reinzukriegen... 

Oder, nicht? Oder doch? und wenn doch, wie krieg ich die richtig rein?
Oder bin ich total neben der Spur - dann bitte ich um Erleuchtung 

EDIT: ohho hab ich doch den Link von Joose übersehen... libaries ist nicht gleich libaries... aha - das checke ich noch mal eben ab. 

EDIT: 


			
				Joose;1029391auch eine mögliche Lösung vorgeschlagen.

Ansonsten habe ich nur diesen [URL="http://www.dreamincode.net/forums/topic/319272-using-external-libraries/" hat gesagt.:
			
		

> Link [/URL]zu dem Problem gefunden.



hmmm ja Lösung: libary einbinden... 
nur wie?
Ok folgen wir dem Link... aha... ok das ist also mein Pfad zur Libary... und jetzt? JAR reinkopiert... nix... ist anders... weder am pi noch auf x86 eclipse ... 
NARF


----------



## lawila (7. Aug 2014)

gut .. räumen wir das doch mal von unten nach oben auf

"Exception in thread "main" java.lang.NoClassDefFoundError: com/pi4j/io/gpio/GpioFactory"

doch, du hast schon recht, diese zeile sagt genau aus : ich kann die klasse nicht finden
in deregel passiert das wenn man beim build die IDE nicht mit bundeld ... also am ende nur der eigene code bei raus kommt ... nicht aber die libs

was macht man normalerweise in diesem fall : zwei möglichkeiten

1) FAT-jar : der name sagt es schon : man baut EIN jar in dem ALLES drin ist ... kann aber auch zu fehlern führen und bedarf weiterer logik die von der IDE kommen muss ... sollte man vermeiden

2 (der eigentlich korrekte weg)) man sorgt dafür das die libs auf dem ziel-system verfügbar sind



soviel dazu ... was sagt nun die andere meldung bezüglich Exception in thread "main" java.lang.UnsatisfiedLinkError: com.pi4j.wiringpi.Gpio.wiringPiSetup()I aus ?

ganz einfach : du hast eine .SO ... eine sog. "shared object" ... das sind unter unix die dinger die man unter windows DLL (dynamic link lib) bezeichnet

ergo : eine SO-lib läuft schon mal nur unter unix ... KANN also gar nicht auf deinem windows laufen

weiterhin : der Raspi ist meines wissens nach ARM ... also eine völlig andere prozessor-architektur als dein windows-rechner der auf dme i386 basiert (vermutlich irgendwas modernes AMD64 mäßiges ...)

beduetet : der code der im SO steht kann von deinem prozessor gar nicht ausgeführt werden



zusammengefasst : man kann auf einem windows das auf einer x86 (bezeichnung für alles was vom intel i386 abstammt, auch heutige 64bit cpus nach AMD64) hardware läuft keine unix-lib nutzen die für einen ARM-prozessor gebaut wurde

die lösung : statt in eclipse versuchen zu wollen welcher stack kommt MUSS das ganze direkt auf dem raspi laufen (um überhaupt lauffähig zu sein) ... und es müssen natürlich die nötigen libs auch auf dem raspi vorhanden sein und auch im CP liegen


zu dem "ich erzeuge ja "nur" ein Object vom Typ GpioController"
so leider nicht korrekt
du benutzt eine sog. factory die dir letzten endes ein objekt vom gewünschten type liefert ... was allerdings zwischen dem call der factory und dem return des fertigen objektes liegt weist du nicht (ist auch der sinn einer factory)
dem stack-trace kann man aber entnehmen das die factory bereits dafür zuständig ist die native-lib zu laden ... was natürlich schief geht


----------



## KIllrogg (7. Aug 2014)

gr. Danke! 

ok... mein Plan von einem Maschinenunabhängigen Java Byte Code hat sich gerade verabschiedet... 
auf meinem (in der Tat AMD) wird das also nix mit Code laufen lassen. Die DLL/SO macht mir da einen Strich durch die Rechnung (womit auch geklärt wäre was diese SO Datei überhaupt ist nach dem verlangt wird). Btw.: Ist diese SO vermutlich in den JAR "drin"?

Sei' drum. 
Technisch gesehen kann ich aber den COde auf der WIN x86er Maschine coden und als JAR exportieren und auf dem PI (ARM) laufen lassen, oder? (oder kann ein Windows Eclipse SO dateien nicht mit reinpacken?)

Und der Fehler am PI kommt weil ich keine FAT FILE erzeugt habe und weil eclipse mir die libs so einfach nicht mitnehmen will?

Bin eben über das hier gestolpert: 
Eclipse

Vor zwei Tage wollte ich einfach nur die PINs am PI ansprechen und jetzt geht das hier vom hundersten ins tausendste... 
Ich bring ja ned mal zam dass ich das im Link erwähnte Plugin installiere... 
für den "komplizierten Weg" brauchts wieder ant (hab ich nicht.. und ned mal eine Ahnung was das sein soll) 

34°C hier, nix geht weiter, von meinem eigentlich Ziel bin ich weit ab gekommen und ich komme mir vor wie der letzte Vollpfosten.... *aber hauptsache wir haben ein Semster lang ****erte GUIs mit Java geschrieben (ohne windowbuilder) - poah bin ich genervt! hätten wir mal lieber was gescheites gelernt...*


gibts für den von dir erwähnten "korrekteren" Weg, evtl. iwo eine leichte Anleitung?


----------



## lawila (7. Aug 2014)

ok .. kein problem ... ich versuch es dir gerne so gut wie möglich zu erklären ... das heißt .. soweit meine allgemeinkenntnisse über IDEs und platform-dev reichen

was du machen willst : mit Java und der lib pi4j auf einem Raspberry PI die GPIO-pins ansteuern
wo es irgendwie hakt : dein compileter code will nicht laufen

dann nehmen wir das mal ganz ruhig stück für stück auseinander, analysieren die möglichen wege und versuchen diese umzusetzen

ich beginne damit : wie sollte das ergebnis nachher aussehen ?

nun, eine grundvorraussetzung ist ja nun das bereits ein OS auf dem raspi läuft sowie das java (erstmal egal welche version) installiert ist und läuft

ob das soweit der fall ist kannst du mit dem command

[c]java -version[/c]

prüfen
eine mögliche ausgabe könnte ungefähr so aussehen


```
java version "1.8.0_11"
Java(TM) SE Runtime Environment (build 1.8.0_11-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.11-b03, mixed mode)
```

es kann sein das du fehlermeldung bekommst wie "not found" oder "no command" oder sowas in die richtung ... auf jeden fall alles andere als oben als beispiel

dann kann es sein das java auf dem raspi nicht korrekt installiert ist


du sagtest das du auf dem raspi das os Raspbian laufen hast
das ist ein "Linux" auf basis der distribution "Debian" als konkret angepasste version für den Raspberry PI

unter Debian-basierten distros gibt es das commando "apt-get" und ist der paket-verwaltungsmanager "aptitude"

einer der ersten schritte die man nach einem setup machen sollte ist das updaten, dies wird unter debian mit folgendem commando gemacht

[c]sudo apt-get update && apt-get upgrade[/c]

damit bringst du dein raspbian erstmal auf den aktuellen stand

dann kannst du auch, falls nötig und java sollte nicht installiert sein, über apt auch java korrekt installieren lassen, das geht dann mit

[c]sudo apt-get install openjdk-7-jre[/c]

damit installierst du das JRE - Java Runtime Environment der version OpenJDK 7

danach sollte dann auch "java -version" ein halbwegs sinnvolles ergebnis liefern


so ... das wären erstmal die nötigen vorbedingungen damit es überhaupt funktionieren kann


weiter im text

das korrekte "installieren" einer lib für java

[...] beim googlen gerade was besseres gefunden > alter krams-text wieder weg [...]

es gibt in der download-liste Downloads - pi4j - Connecting Java to the Raspberry Pi - Google Project Hosting ein deb-package was dir das ganze abnimmt

du gehst also erstmal in den java verzeichnis mit

[c]cd ~/java[/c]

und ziehst dir erstmal das package

[c]wget http://pi4j.googlecode.com/files/pi4j-1.0-SNAPSHOT.deb[/c]

danach installierst du das package einfach

[c]sudo dpkg --install pi4j-1.0-SNAPSHOT.deb[/c]

(ich hab grad leider kein debian rumliegen ... weis also nicht was kommt ... aber sollte selbsterklärend sein)

danach sollte dann auf deinem raspi sowohl java als auch pi4j korrekt installiert sein



es macht natürlich sinn einer lib die für einen raspi gedacht ist auf dem meist halt dieses raspbian läuft auch ein deb-package zu spendieren


hast du diese schritte erledigt sollte erstmal grundsätzlich jeder java-code der diese lib nutzt auf deinem raspi lauffähig sein
der vorteil der sich dadurch ergibt : du musst dich weder um ein FAT-jar kümmern noch um classpath oder sonst was ... das sollte der deb-installer alles für dich machen (ggf relogg nötig)


so, wie entwickelst du nun in eclipse ?

du hast es ja schon geschafft in dein project die pi4j lib einzubinden so das du mit dieser arbeiten kannst

eclipse bietet ein sog. "BUILD" an ... also ein "bau mal meinen code zu nem fertigen JAR zusammen"
dabei solltest du das sog. "runnable jar" auswählen ... dadurch baut dir eclipse ein jar zusammen was du dann so "ausführen" kannst

dieses jar kopierst du dann so wie es eclipse als build ausspuckt rüber auf deinen raspi (da die com sinnvoller weise über SSH abläuft macht sich hier ein SCP-client wie "WinSCP" am besten) in den java-verzeichnis ... und führst es dann dort aus

[c]java -jar DeinJarName.jar[/c]

und es sollte dann auch sauber durchlaufen ... (bzw bei deinem "test-code" sollte einfach "nichts" passieren)



wenn du erstmal soweit bist kannst du weiter machen und deinen code schreiben ... sollte sich aber bis hierhin ein fehler eingeschlichen haben meld dich bitte vorher das wir versuchen können ihn gemeinsam zu lösen bevor du dich in der hitze noch in den weiten von google verirrst


----------



## KIllrogg (8. Aug 2014)

lawila hat gesagt.:


> ok .. kein problem ... ich versuch es dir gerne so gut wie möglich zu erklären ... das heißt .. soweit meine allgemeinkenntnisse über IDEs und
> 
> platform-dev reichen


Vielen, vielen DANK!


> was du machen willst : mit Java und der lib pi4j auf einem Raspberry PI die GPIO-pins ansteuern
> wo es irgendwie hakt : dein compileter code will nicht laufen


jo.


> dann nehmen wir das mal ganz ruhig stück für stück auseinander, analysieren die möglichen wege und versuchen diese umzusetzen
> 
> ich beginne damit : wie sollte das ergebnis nachher aussehen ?
> 
> ...


die Laufzeit umgebung hab ich natürlich installiert -> kein laufendes Java Programm ohne installierte runtime enviroment: 

```
java version "1.7.0_40"
Java(TM) SE Runtime Environment (build 1.7.0_40-b43)
Java HotSpot(TM) Client VM (build 24.0-b56, mixed mode)
```



> du sagtest das du auf dem raspi das os Raspbian laufen hast
> das ist ein "Linux" auf basis der distribution "Debian" als konkret angepasste version für den Raspberry PI
> 
> unter Debian-basierten distros gibt es das commando "apt-get" und ist der paket-verwaltungsmanager "aptitude"
> ...


ok. hatte ich alles erledigt. 


> weiter im text
> 
> das korrekte "installieren" einer lib für java
> 
> ...


ist es wichtig dass ich in mein Java verzeichnis wechsle bevor ich den Download starte? (von wo aus das Paket dem Manager übergeben wird ist (hoffentlich?) egal...)
Wenn nein: hatte ich alles erledigt. 
Wenn ja: ups... 



> es macht natürlich sinn einer lib die für einen raspi gedacht ist auf dem meist halt dieses raspbian läuft auch ein deb-package zu spendieren
> 
> 
> hast du diese schritte erledigt sollte erstmal grundsätzlich jeder java-code der diese lib nutzt auf deinem raspi lauffähig sein
> ...


Java Code war schon ausführbar als ich nur die laufzeitumgebung installiert hatte - ein kurzes Testprogramm (contdownausgabe auf der console, ohne pi4j 

Funktionalitäten) lief - da war die Welt noch in Ordnung  



> so, wie entwickelst du nun in eclipse ?


jup


> du hast es ja schon geschafft in dein project die pi4j lib einzubinden so das du mit dieser arbeiten kannst


hatte ich gemacht. 


> eclipse bietet ein sog. "BUILD" an ... also ein "bau mal meinen code zu nem fertigen JAR zusammen"
> dabei solltest du das sog. "runnable jar" auswählen ... dadurch baut dir eclipse ein jar zusammen was du dann so "ausführen" kannst
> 
> dieses jar kopierst du dann so wie es eclipse als build ausspuckt rüber auf deinen raspi (da die com sinnvoller weise über SSH abläuft macht sich hier ein SCP-client
> ...


wie oben schon: 
nur Java Code: geht seit eh und je

```
Starte Countown...
100
99
98
97
96
95
```
Java Code mit pi4J funktionen: 

```
GPIO Tests... started.
 erstelle GPIO Controller...
Exception in thread "main" java.lang.NoClassDefFoundError: com/pi4j/io/gpio/GpioFactory
        at consoleProg.GPIOtests.main(GPIOtests.java:42)
Caused by: java.lang.ClassNotFoundException: com.pi4j.io.gpio.GpioFactory
        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
```



> wenn du erstmal soweit bist kannst du weiter machen und deinen code schreiben ... sollte sich aber bis hierhin ein fehler eingeschlichen haben meld dich bitte vorher
> 
> das wir versuchen können ihn gemeinsam zu lösen bevor du dich in der hitze noch in den weiten von google verirrst



*meld*

Genau hier dachte ich auch: oh ja ich kann mich jetzt um die coolen Sachen, wie meinen Code kümmern... aber denkste... 
Gestern in der Hitze hab ich dann eh nix mehr gepackt.... Mein Hirn wollte einfach nimmer... 


Danke nochmal für deine Bemühungen!


----------



## lawila (8. Aug 2014)

gut ... ich gehe von aus das beim setup der pi4j lib was schief gelaufen ist ... die logausgaben wären mal interessant was da so kommt

fakt ist : der fehler der besteht ist das java warum auch immer die lib nicht laden kann/will ... ist meist ein fehler mit dem classpath


----------



## KIllrogg (8. Aug 2014)

Habs eben nochmal de und wieder installiert (mit 0.5 und dann auch nochmal mit snapshot 1.0) keine Verbesserung. 
Hier der gewünschte Log

```
2014-08-08 13:52:21 startup archives install
2014-08-08 13:52:22 upgrade pi4j:all 1.0+SNAPSHOT 1.0+SNAPSHOT
2014-08-08 13:52:22 status half-configured pi4j:all 1.0+SNAPSHOT
2014-08-08 13:52:22 status unpacked pi4j:all 1.0+SNAPSHOT
2014-08-08 13:52:22 status half-installed pi4j:all 1.0+SNAPSHOT
2014-08-08 13:52:22 status half-installed pi4j:all 1.0+SNAPSHOT
2014-08-08 13:52:22 status unpacked pi4j:all 1.0+SNAPSHOT
2014-08-08 13:52:22 status unpacked pi4j:all 1.0+SNAPSHOT
2014-08-08 13:52:23 configure pi4j:all 1.0+SNAPSHOT 1.0+SNAPSHOT
2014-08-08 13:52:23 status unpacked pi4j:all 1.0+SNAPSHOT
2014-08-08 13:52:23 status half-configured pi4j:all 1.0+SNAPSHOT
2014-08-08 13:52:23 status installed pi4j:all 1.0+SNAPSHOT
```


----------



## lawila (8. Aug 2014)

gut .. sieht soweit erstmal ziemlich nichtssagend aus ...

was sein kann ist das nach dem setup ein relogg (also mit "logout" ausloggen und neu anmelden") oder sogar ein kompletter reboot nötig wird damit die neuen umgebungsvariablen angepasst werden

wenn das getan ist einfach mal prüfen was rauskommt wenn man die variablen prüfen
dazu einfach

[c]export[/c]

eingeben und es müsste ne lange liste kommen was alles gesetzt ist

sinnvoller weise sollte dann der sog. CLASSPATH mindestens auf die pi4j gesetzt sein


was natürlich auch sein kann das sich pi4j ins ext-lib verzeichnis installiert ... ist zwar unter unix an sich normal ... aber java läuft immer noch n bissl anders ... und es ist einfach schlechter stil wenn ne lib direkt ins java-home gepackt wird ... dazu gibts wiegesagt den classpath


sinnvoll ist es einfach mal midnight commander zu installieren und mal nach pi4j zu suchen

standardmäßig hat das midnight-commander-package einfach schlicht den namen "mc"

[c]sudo apt-get install mc[/c]

sowie auch entsprechend das gleichnamige commando
der MC ist quasi ein graphischer commander der es einem auch auf einem text-terminal wie putty über ssh ermöglicht dateiverwaltung einfach zu bewerkstelligen

dann kannst du ja mal versuchen rauszubekommen wohin pi4j überhaupt "installiert" wird



die andere alternative wäre statt das deb-install-pack zu nutzen einfach das ZIP laden, entpacken und selbst den CP drauf legen ... den rest sollte die lib hoffentlich alleine packen


----------



## KIllrogg (8. Aug 2014)

lawila hat gesagt.:


> gut .. sieht soweit erstmal ziemlich nichtssagend aus ...


hajo  



> was sein kann ist das nach dem setup ein relogg (also mit "logout" ausloggen und neu anmelden") oder sogar ein kompletter reboot nötig wird
> 
> damit die neuen umgebungsvariablen angepasst werden


reboot ändert nix... (mache ich bein PI zwangsweiwse öfter... schließlich hängt der ja am Handyladegerät )



> wenn das getan ist einfach mal prüfen was rauskommt wenn man die variablen prüfen
> dazu einfach
> 
> [c]export[/c]
> ...


Ausgabe von Export:

```
declare -x HOME="/home/pi"
declare -x LANG="de_DE.UTF-8"
declare -x LOGNAME="pi"
declare -x LS_COLORS="rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd                                                               
=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:s                                      
t=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.l             
zma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.g                                                               
z=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.                                      
tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31             
:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01                                                               
;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.t                                      
ga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;3             
5:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2                                                               
v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;3                                      
5:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=0             
1;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf                                                               
=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*                                      
.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00             
;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa                                                               
=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36:"
declare -x MAIL="/var/mail/pi"
declare -x OLDPWD="/"
declare -x PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/u                                                               
sr/local/games:/usr/games"
declare -x PWD="/home/testProgramme"
declare -x SHELL="/bin/bash"
declare -x SHLVL="1"
declare -x SSH_CLIENT="10.0.0.5 49916 22"
declare -x SSH_CONNECTION="10.0.0.5 49916 10.0.0.11 22"
declare -x SSH_TTY="/dev/pts/0"
declare -x TERM="xterm"
declare -x USER="pi"
```



> sinnvoller weise sollte dann der sog. CLASSPATH mindestens auf die pi4j gesetzt sein
> 
> was natürlich auch sein kann das sich pi4j ins ext-lib verzeichnis installiert ... ist zwar unter unix an sich normal ... aber java läuft
> 
> ...




find erzählte mir, dass sich pi4j in /opt eingenistet hat. 

ich hab auch mal probiert den classpath direkt beim Aufruf der JAR anzugeben (wie auf der pi4j HP angegeben): 

```
sudo java -classpath .:classes:/opt/pi4j/lib/'*' -jar getController.jar
GPIO Tests... started.
 erstelle GPIO Controller...
Exception in thread "main" java.lang.NoClassDefFoundError: com/pi4j/io/gpio/Gpio                                                                                        Factory
        at consoleProg.GPIOtests.main(GPIOtests.java:42)
Caused by: java.lang.ClassNotFoundException: com.pi4j.io.gpio.GpioFactory
        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
```
den mc kenn ich sogar noch von windows/DOS aus den 90ern....


----------



## KIllrogg (9. Aug 2014)

NARF!

Starte ich den Javacompiler auf dem PI kann ich eine der Beispiele die mit pi4j kommmen compilieren und dann auch laufen lassen: 


```
pi@raspberrypiRASPIAN /opt/pi4j/examples $ javac -classpath .:classes:/opt/pi4j/lib/'*' BlinkGpioExample.java
pi@raspberrypiRASPIAN /opt/pi4j/examples $ sudo java -classpath .:classes:/opt/pi4j/lib/'*' BlinkGpioExample
<--Pi4J--> GPIO Blink Example ... started.
Aug 09, 2014 7:51:24 PM com.pi4j.util.NativeLibraryLoader loadLibraryFromResource
Warnung: The temporary file already exists [/tmp/libpi4j.so]; attempting to delete it now.
 ... the LED will continue blinking until the program is terminated.
 ... PRESS <CTRL-C> TO STOP THE PROGRAM.
```

OK, dass geht. 


Hole ich jetzt das Beispiel in mein JavaProjekt in Eclipse (ACHTUNG! ich habe hier meine Package-Struktur hinzugefügt) und baue eien JAR draus 

und lasse die am PI laufen kommt wieder der alte Bekannte: 

```
pi@raspberrypiRASPIAN /home/testProgramme $ sudo java -jar BlinkGpioExample.jar
<--Pi4J--> GPIO Blink Example ... started.
Exception in thread "main" java.lang.NoClassDefFoundError: com/pi4j/io/gpio/GpioFactory
        at consoleProg.BlinkGpioExample.main(BlinkGpioExample.java:27)
Caused by: java.lang.ClassNotFoundException: com.pi4j.io.gpio.GpioFactory
        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
```
auch wenn ich den Schalter cp verwende wird das auch nicht bessser: 

```
pi@raspberrypiRASPIAN /home/testProgramme $ sudo java -cp /opt/pi4j/lib/'*' -jar BlinkGpioExample.jar
<--Pi4J--> GPIO Blink Example ... started.
Exception in thread "main" java.lang.NoClassDefFoundError: com/pi4j/io/gpio/GpioFactory
        at consoleProg.BlinkGpioExample.main(BlinkGpioExample.java:27)
Caused by: java.lang.ClassNotFoundException: com.pi4j.io.gpio.GpioFactory
        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
```
Ich bin wohl einfach zu ****ert die pi4j lib in meine JARs einzubinden...


Ein doch sehr "russischer" Workarround wäre jetzt natürlich in Eclipse zu Coden und dann den Code als *.java (Textdatei...) auf den pi kopieren (gänzlich ohne Paketstruktur) und dort dann vor Ort alles per Hand zu compileren. -> nervig.


----------



## KIllrogg (9. Aug 2014)

GELÖST!

Ich hatte bisher ja meine Programme (leider) immer nur in der IDE (eclipse) laufen lassen. 
Damit ich nun auch mal was produktives am PI machen konnte musste eine lauffähige Datei her. 
Internet befragt: ja das musst eine JAR Datei machen. 
Gesagt getan. 

Und nun nach langem hin und her muss ich festellen eine JAR != eine runnable JAR


Falls noch jemand so ein (Grundlagen)Problem hat: probier mal eine runnable JAR zu exportieren... 












Ist vermutlich für die meisten hier Grundlagenwissen das man eben wissen muss... tjo... für mich war es ein Stolperstein der mich vier Tage gekostet hat... (ok aber dafür hab ich ein Haufen Zeugs gelernt  ) 


Zum  Abschluss mag ich noch für die engagierte Hilfe die ich erhalten habe "Danke" sagen!


----------



## DominikR (20. Mai 2020)

Hallo.
Auch wenn dieses Thema schon ein wenig her ist, greife ich es nochmal auf. Ich habe das Problem, wenn ich meine "ausführbare .jar Datei", welche die Pi4J Library enthält, auf dem Raspberry starte und dann im Programm der Befehl kommt zum Ansteuern eines GPIO, kommt der Fehler: _NoClassDefFoundError_: _com_/_pi4j_/_io_/_gpio_/_Gpio_Factory 

Ich starte das Programm mit dem Befehl: sudo java -classpath .:classes:/home/pi/Desktop/eclipse/uebung/lib/'*' -jar /home/pi/Desktop/eclipse/uebung/cocktail.jar

In Eclipse habe ich auch den Buildpath mit der Pi4J aktualisiert.

Soviel wie ich bis jetzt herausgefunden habe muss ich dem Programm noch sagen wo es die Pi4J Library findet. Daran scheitere ich jedoch....

danke schonmal für die Hilfe


----------



## advanced_java (20. Mai 2020)

Naja, mit nativen Libs und dem Eclipse-Export ist das so eine Sache... Allerdings steht die genaue Fehlermeldung und -Behebung ja schon in der Eingangsfrage.


----------



## DominikR (20. Mai 2020)

🤷‍♂️


----------



## DominikR (20. Mai 2020)

das hilft mir jetzt nicht wirklich weiter


----------



## advanced_java (20. Mai 2020)

Naja du musst die gefundene Leiche nur mal etwas zerpflücken, es sind noch Fleischstückchen dran.


----------



## DominikR (20. Mai 2020)

Wenn ich wüsste wie ich es machen muss, würde ich nicht fragen. Es kann ja durchaus sein das es nicht viel ist, aber ich komme halt nicht weiter.


----------



## DominikR (22. Mai 2020)

Kann mir da keiner helfen, oder wenigstens noch ein paar Tips geben?


----------



## advanced_java (22. Mai 2020)

DominikR hat gesagt.:


> noch ein paar Tips geben


Neues Thema eröffnen, deine Frage richtig schildern, was du versucht hast und wo es Fehler gibt usw. Die Leiche liegen lassen.


----------

