Ausführbarkeit von Code testen bzw. Remote Debugging

nonickatall

Mitglied
Wenn ich eine Anwendung schreibe, die von der Verfügbarkeit bestimmter Recourcen abhängt.
Also zum Beispiel bestimmte Hardware, Treiber, Netzwerkzugriff, Server-Dienste was auch immer, kann ich ja mit Remote Debugging arbeiten, wenn das auf der Maschine, auf der ich code, nicht der Fall ist.

In meinem Fall greife ich beispielsweise auf GPIO Pins auf einem Raspberry zu. Das klappt auch. Wenn ich an anderer Stelle codiere, also beispielsweise an der GUI arbeite und die GPIOS nicht brauche, möchte ich das Programm aber einfach unter Windows debuggen.

Dann muss ich ja irgendwie prüfen, ob ich die GPIOS aufrufen kann. Sonst führt der Aufruf ja zu möglicherweise zu einer Exception.

Macht man da, um am Beispiel GPIO zu bleiben, eine Methode mit einer Rückgabe in der Klasse GPIO, die mit try und catch arbeitet, um vorher zu prüfen, ob GPIO überhaupt verfügbar ist, die ich dann bei Programmstart einmal ausführe und dann im Code drauf reagiere? Also zum Beispiel Aufrufe an die GPIO Klasse gar nicht erst weiterleite, oder muss man dann im Grunde jede Methode mit try und catch versehen?

Wie macht man das sinnvoll? Nur mal so konzeptionell gefragt...
 

mihe7

Top Contributor
Entkopplung lautet hier das Zauberwort. Wie die im Detail aussieht, hängt aber von der Situation ab.

Wenn Du z. B. pi4j anschaust (eine Java-Lib, die ich gerade gegoogelt habe), dann ist dort bereits alles über Platform und Provider entkoppelt. Beispiel unter https://pi4j.com/documentation/create-context/

Du könntest also beim Programmstart feststellen, ob das Programm unter Windows läuft, falls ja, dann erzeugst Du einen Context mit gemockten Objekten, ansonsten mit "echten". Es könnte sogar sein, dass das Teil das automatisch macht, da müsste man sich jetzt ein wenig einlesen.

Aber das wäre so das Prinzip: Schnittstellen definieren, auf dem Pi und unter Windows unterschiedliche Implementierungen verwenden.
 

nonickatall

Mitglied
Top, wie immer hilfreich.. 👍

Das Ganze scheint für einen Anfänger nicht ganz einfach zu sein. o_O

Habe da jetzt mal einen Beispielcode implementiert, um das überhaupt mal zu testen.

Hat jetzt zwar mit der Ausgangsfrage nichts zu tun aber vielleicht hast Du dazu auch eine Idee.

Wenn ich folgenden Code verwende:

Java:
import com.pi4j.component.switches.SwitchListener;
import com.pi4j.component.switches.SwitchState;
import com.pi4j.component.switches.SwitchStateChangeEvent;
import com.pi4j.device.piface.PiFace;
import com.pi4j.device.piface.PiFaceLed;
import com.pi4j.device.piface.PiFaceSwitch;
import com.pi4j.device.piface.impl.PiFaceDevice;
import com.pi4j.wiringpi.Spi;

import java.io.IOException;

public class PiFaceApp {

    private static PiFace piface;

    public static void main(String[] args) {
        try {
            piface = new PiFaceDevice(PiFace.DEFAULT_ADDRESS, Spi.CHANNEL_0);
        } catch (IOException e) {
            piface = null;
            e.printStackTrace();
        }

        if (piface != null) {

            piface.getSwitch(PiFaceSwitch.S1).addListener(new SwitchListener() {

                public void onStateChange(SwitchStateChangeEvent switchStateChangeEvent) {
                    if (switchStateChangeEvent.getNewState() == SwitchState.ON) {
                        piface.getLed(PiFaceLed.LED0).on();
                    } else {
                        piface.getLed(PiFaceLed.LED0).off();
                    }
                }

            });

            piface.getSwitch(PiFaceSwitch.S2).addListener(new SwitchListener() {

                public void onStateChange(SwitchStateChangeEvent switchStateChangeEvent) {
                    if (switchStateChangeEvent.getNewState() == SwitchState.ON) {
                        piface.getLed(PiFaceLed.LED1).blink(200L);
                    } else {
                        piface.getLed(PiFaceLed.LED1).blink(0);
                        piface.getLed(PiFaceLed.LED1).off();
                    }
                }

            });

        }

    }
}

Und in Eclipse in den Projekteinstellungen "Build Path" die pi4j Libarys einbinde, die ich mir herunter geladen habe, dann läuft das Projekt natürlich nicht, wenn ich es auf Eclipse in Windows starte und wirft Exceptions.

Verständlich, denn es gibt ja auch keine Hardware dazu und vermutlich sind die Libarys auch nicht Windows kompatibel.

Wenn ich das Ganze als .jar exportiere, dann sind die Libaries ja enthalten und ich kann das Ganze auf dem Raspberry starten.

Starte ich es in einer SSH Konsole mit "java -jar TestA.java" läuft die Anwendung wie sie soll.

Starte ich das Ganze aber in Eclipse "Remote", was mit einem anderen Projekt funktioniert, dann bekomme ich folgende Fehlermeldungen:

Java:
Mai 01, 2021 7:52:06 NACHM. com.pi4j.util.NativeLibraryLoader load

SEVERE: Unable to load [libpi4j.so] using path: [/lib/raspberrypi/dynamic/libpi4j.so]

java.lang.IllegalArgumentException: The path has to be absolute, but found: \lib\raspberrypi\dynamic\libpi4j.so

    at com.pi4j.util.NativeLibraryLoader.loadLibraryFromClasspath(NativeLibraryLoader.java:136)

    at com.pi4j.util.NativeLibraryLoader.load(NativeLibraryLoader.java:105)

    at com.pi4j.wiringpi.Spi.<clinit>(Spi.java:80)

    at PiFaceApp.main(PiFaceApp.java:19)

Hast du dazu eine Idee?

Vielen Dank im Voraus
Ralf
 

mihe7

Top Contributor
Wenn ich es richtig sehe, musst Du Version 2.x von pi4j verwenden. Auf der oben verlinkten Seite steht: "Version 1 was implemented using a static singleton, while version 2 uses a “Context” to avoid static singletons."

Beispiele für V2 sind auf der Seite auch angegeben, z. B. https://pi4j.com/documentation/io-examples/digital-output/

Mehr kann ich dazu nicht sagen, ohne es ausprobiert zu haben :)
 

nonickatall

Mitglied
Wenn ich es richtig sehe, musst Du Version 2.x von pi4j verwenden. Auf der oben verlinkten Seite steht: "Version 1 was implemented using a static singleton, while version 2 uses a “Context” to avoid static singletons."

Beispiele für V2 sind auf der Seite auch angegeben, z. B. https://pi4j.com/documentation/io-examples/digital-output/

Mehr kann ich dazu nicht sagen, ohne es ausprobiert zu haben :)
Hallo,

danke für deine Antwort. Bin erst jetzt dazu gekommen mal weiter zu machen. Ich denke nicht das dies an der Version liegt. Ich habe mir mal ein anderes Beispiel herunter geladen und in mein Projekt eingebunden.

Beispiel

Da sieht man unter "EXAMPLE JAVA PROGRAM" das in einem Link die GithubRepository der Pi4j Version 1.4 hinterlegt ist.

Die habe ich auch installiert und in Eclipse als Libary hinterlegt. Wenn ich die Main Methode ändere und die Klasse aus meinem Projekt heraus aufrufe, dann bekomme ich bei "Remote Debug" Ausführung in Eclipse die Fehlermeldung:

Java:
Mai 04, 2021 12:12:16 VORM. com.pi4j.util.NativeLibraryLoader load
SEVERE: Unable to load [libpi4j.so] using path: [/lib/raspberrypi/dynamic/libpi4j.so]
java.lang.IllegalArgumentException: The path has to be absolute, but found: \lib\raspberrypi\dynamic\libpi4j.so
    at com.pi4j.util.NativeLibraryLoader.loadLibraryFromClasspath(NativeLibraryLoader.java:136)
    at com.pi4j.util.NativeLibraryLoader.load(NativeLibraryLoader.java:105)
    at com.pi4j.wiringpi.Spi.<clinit>(Spi.java:80)
    at myhome.Pi4j_Test.start(Pi4j_Test.java:32)
    at myhome.MyHomeStart.main(MyHomeStart.java:54)

Exportiere ich das aber als Jar File, kann ich es auf dem Raspberry problemlos mit "java -jar Myhome.jar" aufrufen. Also kommen die Libaries ja korrekt im Jar File mit.

Was mich wundert ist der Teil der Fehlmeldung die sagt: "The path has to be absolute, but found: \lib\raspberrypi\dynamic\libpi4.so"

Ich binde ja die Libs einfach im Projekt unter "Properties/Build Path/Libaries" ein und da steht natürlich zunächst ein absoluter Pfad, der aber natürlich auf der Eclipse Maschine liegt. Im Grunde muss!! der Pfad ja relativ sein, sonst läuft das Ganze ja nicht auf Linux und Windows bzw. auf anderen Maschinen, ohne die gleiche Pfadstruktur.

Wo ist da mein Denkfehler?

Hast du, oder gerne natürlich auch andere, ;) noch eine Idee?

LG
Ralf
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Kann mir jemand wörtlich erklären, was in dem Code genau passiert? Java Basics - Anfänger-Themen 1
Ü Dead Code im Programm? Java Basics - Anfänger-Themen 13
I QR code in Java selber generieren Java Basics - Anfänger-Themen 5
terashy VS Code Project run error Java Basics - Anfänger-Themen 10
JaZuDemNo Code Erklärung Java Basics - Anfänger-Themen 3
M Connect-4-Code analysieren Java Basics - Anfänger-Themen 2
N BMI Rechner Was haltet ihr von dem Code habt ihr Verbesserungsvorschläge weil design teschnisch ist das nicht das geilste würde das gerne überarbeiten Java Basics - Anfänger-Themen 12
W In alten Code zurück- und dort wieder zurechtfinden? Java Basics - Anfänger-Themen 17
T code so schreiben das er von sich selber anpasst (code soll die anzahl aller bustaben bestimmen) Java Basics - Anfänger-Themen 16
J Frage zu einem "Taschenrechner" code Java Basics - Anfänger-Themen 9
T Fehlercode bei code der das Alter ausrechnet Java Basics - Anfänger-Themen 2
T Text einlesen code was kommt dahin? Java Basics - Anfänger-Themen 1
jhfjeh Strukturgramm in code Java Basics - Anfänger-Themen 11
D Tipps zum Code Java Basics - Anfänger-Themen 24
W Java-Code mit Array Java Basics - Anfänger-Themen 14
W Java-Code Java Basics - Anfänger-Themen 2
W Java code- TicTac toe Java Basics - Anfänger-Themen 51
W Java-code Java Basics - Anfänger-Themen 8
W Java-code Java Basics - Anfänger-Themen 9
W Java-Code erklären Java Basics - Anfänger-Themen 6
ohneInformatik; For Schleife. Was macht dieser Code?? Java Basics - Anfänger-Themen 5
Say Fehlenden Code finden in einer while-Schleife? Java Basics - Anfänger-Themen 11
Say 2-DIM Array Code lesen und verstehen Java Basics - Anfänger-Themen 5
Say Stelle in Code herausfinden, wie geht man vor? Java Basics - Anfänger-Themen 12
Say do-While Code Ausführung Java Basics - Anfänger-Themen 3
W Rückfrage zur Programmgestaltung (clean code) Java Basics - Anfänger-Themen 12
M intelliJ auf neuem PC, plötzlich kein Code Java Basics - Anfänger-Themen 3
Pinhg Sound in Greenfoot Code einbinden Java Basics - Anfänger-Themen 2
C Java boolean Code läuft nicht Java Basics - Anfänger-Themen 5
I Code für Bezahlsystem (auch bei Offline Aktivität) Java Basics - Anfänger-Themen 7
J Größter gemeinsamer Teiler: mein Code Java Basics - Anfänger-Themen 6
B Den Dateipfad einer Java Datei durch Code in Selbiger finden? Java Basics - Anfänger-Themen 10
A Wie könnte man diesen Code kürzer machen ? Java Basics - Anfänger-Themen 7
J Frage zu meinem Code (OOP) Java Basics - Anfänger-Themen 4
Alen123 Warum funktioniert mein Code nicht? Java Basics - Anfänger-Themen 64
Max246Sch Frage zu Währungsrechner Code Java Basics - Anfänger-Themen 2
S Hilfe bei Umänderung von Java Code Java Basics - Anfänger-Themen 16
I Code wird nicht ausgeführt Java Basics - Anfänger-Themen 2
K Wie kann man diesen Code schnell und effizient interpretieren (Man hat nur 4 Minuten) Java Basics - Anfänger-Themen 3
R ISBN-10-Code überprüfen Java Basics - Anfänger-Themen 7
I Bitte um Hilfe zu unterstehenden Code Java Basics - Anfänger-Themen 6
I Interface von einer EJB Klasse, um Code zu reduzieren Java Basics - Anfänger-Themen 1
I HTML Code säubern Java Basics - Anfänger-Themen 4
B Brauche Hilfe zu einem Code Java Basics - Anfänger-Themen 5
Temsky34 Problem mit dem Code Java Basics - Anfänger-Themen 17
N Fehler im Code (Aufgabe für Anfänger) Java Basics - Anfänger-Themen 11
N Java-Code abwärtskompatibel machen Java Basics - Anfänger-Themen 4
J Erste Schritte Was mache ich in meinem Code falsch. Java Basics - Anfänger-Themen 3
Ameise04 Variablen Inhalt einer Variable im Code verwenden? Java Basics - Anfänger-Themen 9
S Compiler-Fehler Nicht adressierbarer Code ( Non-addressable code ) Java Basics - Anfänger-Themen 5
Aemulit Java Schaltjahr berechnen Code Java Basics - Anfänger-Themen 7
A Code Problem Java Basics - Anfänger-Themen 6
C Fehler im Code Java Basics - Anfänger-Themen 10
A Zu einem bestimmten Ort im Code springen Java Basics - Anfänger-Themen 11
L Ist der Code richtig Java Basics - Anfänger-Themen 3
josfe1234 code vereinfachen Java Basics - Anfänger-Themen 15
F Frage betreff Programm mit dem man C++-Code in JAVA-Code übersetzen lassen kann Java Basics - Anfänger-Themen 2
S Fehler bei Code mit SubStrings für mich nicht auffindbar. Java Basics - Anfänger-Themen 4
G Programm Code Java Basics - Anfänger-Themen 5
C Code zusammenfassen Java Basics - Anfänger-Themen 5
I Erklärung zum Java Code Java Basics - Anfänger-Themen 2
T Programmablaufsplaninterpretation in Code umformen Java Basics - Anfänger-Themen 1
dieter000 Kurze Frage kann mir ejmand kurz diesen Code erklären, bzw wie man die zeilen erklärt und so Java Basics - Anfänger-Themen 1
AlexVo String zu Java Anweisung getString("*** java code ***") Java Basics - Anfänger-Themen 19
M ISBN-Code Java Basics - Anfänger-Themen 26
B Zeitgleiches Arbeiten am Code mit mehreren Personen? Java Basics - Anfänger-Themen 7
S Wie kann ich bei diesem Code erreichen, das als Ergebnis hier 15 herauskommt? Java Basics - Anfänger-Themen 23
N Kann man den Code vereinfachen? Java Basics - Anfänger-Themen 25
marcooooo Code erklären Java Basics - Anfänger-Themen 28
marcooooo Code erklären Java Basics - Anfänger-Themen 4
S Advent of Code Day4 Java Basics - Anfänger-Themen 4
B Nach eingefügtem Code erkennt Compiler keine Instanzvar und meldet SyntaxError Java Basics - Anfänger-Themen 2
Gaudimagspam Caesars Code entziffern in Java Java Basics - Anfänger-Themen 8
Lukasbsc Wie kann ich meinen Code optimieren? Java Basics - Anfänger-Themen 4
NeoLexx equals()-Methode Verständnis Frage anhand Code Beispiel Java Basics - Anfänger-Themen 22
I Input/Output Code wird doppelt ausgeführt Java Basics - Anfänger-Themen 3
T Main startet nicht bei vorgegebenen Code Java Basics - Anfänger-Themen 41
B Frage zum Code verständnis im Resultat Java Basics - Anfänger-Themen 10
J Fehler im Code, aber ich weiß nicht wieso! Java Basics - Anfänger-Themen 6
S Mehrere Probleme im Code Java Basics - Anfänger-Themen 7
M Code nur für Cracks? Crack the Passwort Übung Java Basics - Anfänger-Themen 7
parrot Code entferneJedeZweiteZiffer Java Basics - Anfänger-Themen 6
G Code kürzen Java Basics - Anfänger-Themen 5
Bluedaishi Source Code Signieren Java Basics - Anfänger-Themen 22
L Best Practice Code Refactoring für Methoden mit fast gleicher Aufbau Java Basics - Anfänger-Themen 6
L Best Practice Code refactern Java Basics - Anfänger-Themen 30
G code kürzen Java Basics - Anfänger-Themen 16
A Code umschreiben Java Basics - Anfänger-Themen 6
Torsten.E JavaFX mit Visual Studio Code verwenden Java Basics - Anfänger-Themen 1
C Beispiel-Code mit Pair wird nicht compiliert. Java Basics - Anfänger-Themen 8
X Reverse algorithm engineering (Java code) Java Basics - Anfänger-Themen 6
T Bufferedwriter code Nullpointerexception Java Basics - Anfänger-Themen 4
V Switch Methode macht Code kaputt Java Basics - Anfänger-Themen 18
R Was muss ich an meinem Code ändern? Java Basics - Anfänger-Themen 2
S Bewertet meinen Code - Part 1 Java Basics - Anfänger-Themen 8
M Java Code Verständnis Java Basics - Anfänger-Themen 4
M Java Code Verständnis Java Basics - Anfänger-Themen 2
J Ich brauche Hilfe bei einem Code (Variablen speichern) Java Basics - Anfänger-Themen 29
F Hierarchi im code darstellen Java Basics - Anfänger-Themen 11
S Struktogramm zu Code Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben