Wie Java.class auf RPi ausführen?

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo,

    ich habe ein RPi (B-Modell; 512M; Raspbian) und eine java.class-Datei. Das Java-Programm habe ich auf meinem Notebook geschrieben, den javac daraus eine Class-Datei gemacht. Die Class-Datei (und die Java-Datei) habe ich auf der SD-Card draufkopiert.

    Nun bin ich im Cmd prompt und versuche die Class-Datei auszuführen, wie ich es bei meinem Notebook bereits testweise erfolgreich getan habe. Für den RPi habe ich also das hier geschrieben (das Fettgedruckte ist von mir):

    pi@raspberrypi2 ~ $ java j01

    Jedoch kommt beim RPi dieser Fehler.

    Fehler: Hauptklasse j01 konnte nicht gefunden oder geladen werden

    Wo muss die Class-Datei, j01.class, gespeichert werden, damit sie auch ausgeführt wird?

    Vielen Dank für etwaige Antworten.

    vg
    letter

    Einmal editiert, zuletzt von letter (9. März 2013 um 19:07)

  • Zitat von agent47 pid=7455 dateline=1362854111


    Entweder du kopierst die datei in deinen home ordner oder du navigierst mit cd zum speicherort der datei. Wo ist die datei jetzt gespeichert?


    Die Datei ist auf der SD-Card des RP. Die SD-Card hat keinerlei Unterordner.

  • Hallo letter,

    was passiert denn wenn du beim Aufruf den kompletten Pfad zur j01.class angibst?

    Eventuell musst du noch die Umgebungsvariable CLASSPATH setzen und darin den Pfad zu deinem Java-Klassenverzeichnis setzen. Wenn deine j01 unter /home/pi liegt kannst du das mit den folgenden Befehlen mal versuchen.

    Code
    CLASSPATH=/home/pi/java
    export CLASSPATH

    Gruß Georg

    Zitat

    Die Datei ist auf der SD-Card des RP. Die SD-Card hat keinerlei Unterordner.

    Die Datei liegt also in der FAT32-Parition und ist unter /boot gemountet.

    Einmal editiert, zuletzt von boandlkramer (9. März 2013 um 19:43)

  • Danke Georg.

    Aber was ich nicht verstehe: ich habe, was du angegeben hast im Cmd hingeschrieben und nix passiert...:

    pi@raspberrypi2 ~ $ CLASSPATH=/home/pi/java
    pi@raspberrypi2 ~ $ export CLASSPATH
    pi@raspberrypi2 ~ $


    Zitat von boandlkramer pid=7457 dateline=1362854527
    Code
    CLASSPATH=/home/pi/java
    export CLASSPATH
  • Hallo letter,

    es ist sehr wohl etwas passiert. Wenn du dir mit dem Befehl "env" mal die Umgebungsvariablen anzeigen lässt, dann solltest du hier eine Zeile finden welche mit "CLASSPATH=" beginnt und den/die angegebenen Pfad(e) enthält.

    Da du jetzt nur die Befehle so ausgeführt hast wie ich sie gepostet habe, haben diese natürlich noch nichts an deiner Situation geändert. Deshalb erstellst du jetzt mal das Verzeichnis /home/pi/java und kopierst deine j01 in dieses Verzeichnis.

    Code
    mkdir /home/pi/java
    cp /boot/j01.class /home/pi/java

    Anschließend versuchst du deinen Befehlsaufruf erneut.

    Gruß Georg

  • Ok,

    ich habe den Unterordner gemacht und die class-Datei dorthin verschoben und anschließend das hier eingegeben:

    Code
    pi@raspberrypi2 ~ $ CLASSPATH=/home/pi/java
    pi@raspberrypi2 ~ $ export CLASSPATH
    pi@raspberrypi2 ~ $ env


    als Ergebnis kamm das hier raus:

    Code
    (...)
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games
    (...)
    CLASSPATH=/home/pi/java

    Wenn ich jetzt "java j01" ausführe, kommt dieselbe Fehlermeldung wie vorher.

    Code
    pi@raspberrypi2 ~ $ java j01
    Fehler: Hauptklasse j01 konnte nicht gefunden oder geladen werden

    ich habe auch schon versucht den Path zu setzen mit "set path":

    Code
    pi@raspberrypi2 ~ $ set path=%path%; /home/pi/java
    -bash: /home/pi/java: Ist ein Verzeichnis


    als ich "java j01" wieder zum ausführen bringen wollte, kam derselbe Fehler wie oben schon:


    Code
    pi@raspberrypi2 ~ $ java j01
    Fehler: Hauptklasse j01 konnte nicht gefunden oder geladen werden


    Zitat von boandlkramer pid=7459 dateline=1362855978


    Hallo letter,

    es ist sehr wohl etwas passiert. Wenn du dir mit dem Befehl "env" mal die Umgebungsvariablen anzeigen lässt, dann solltest du hier eine Zeile finden welche mit "CLASSPATH=" beginnt und den/die angegebenen Pfad(e) enthält.

    Da du jetzt nur die Befehle so ausgeführt hast wie ich sie gepostet habe, haben diese natürlich noch nichts an deiner Situation geändert. Deshalb erstellst du jetzt mal das Verzeichnis /home/pi/java und kopierst deine j01 in dieses Verzeichnis.

    Code
    mkdir /home/pi/java
    cp /boot/j01.class /home/pi/java

    Anschließend versuchst du deinen Befehlsaufruf erneut.

    Gruß Georg

  • Es kommt dann das hier:

    Code
    pi@raspberrypi2 ~ $ java /home/pi/java/j01.class
    Fehler: Hauptklasse .home.pi.java.j01.class konnte nicht gefunden oder geladen werden
    pi@raspberrypi2 ~ $ java /home/pi/java/j01
    Fehler: Hauptklasse .home.pi.java.j01 konnte nicht gefunden oder geladen werden


    Zitat von boandlkramer pid=7461 dateline=1362857415


    Hallo letter,

    ok, dann versuchs mal indem du beim Starten den kompletten Pfad angibst.

    Code
    java /home/pi/java/j01.class

    Ach ja, die Variable PATH hat eine ganz andere Bedeutung als CLASSPATH.

    Gruß Georg



    ...hmmm... ich hab das ganze versucht nochmal zu machen: Also, das Verzeichnis gelöscht und die java-Dateien zurückkopiert. Beim Anlegen eines neuen Verzeichnisses kam das hier:

    Code
    pi@raspberrypi2 ~ $ mkdir /home/pi/java
    mkdir: kann Verzeichnis â/home/pi/javaâ nicht anlegen: Die Datei existiert bereits

    wie kann das sein, wenn ich es schon gelöscht habe?

    Ok, ich habe es geschafft es zum Laufen zu bringen:

    ich habe den Pfad geändert und die Klasse dort ausgeführt:

    Code
    pi@raspberrypi2 ~ $ cd /boot
    pi@raspberrypi2 /boot $ java j01
    Hello World!Test Test!


    Jedoch habe zwei Dinge immer noch nicht verstanden:


    1. Warum kann ich den Pfad nicht mit "set path" setzen?
    2. Warum sagt er mir, dass er das Verzeichnis "/home/pi/java" bereits existiert, obwohl ich es gelöscht habe?

    Einmal editiert, zuletzt von letter (9. März 2013 um 21:00)

  • Hallo letter,

    Zitat

    1. Warum kann ich den Pfad nicht mit "set path" setzen?

    Da liegen zwei Probleme vor. Zum Ersten gibt es unter Linux die Umgebungsvariable PATH bereits mit einer anderen Bedeutung. Über PATH werden alle Suchpfade angegeben, in welchen die Binaries liegen. Gäbe es die PATH nicht, müsstest du anstelle von zum Beispiel "ls" immer "/bin/ls" schreiben damit die Shell das Binary zu ls findet. Für Java-Klassen ist soweit ich das verstanden habe die CLASSPATH zuständig. Über diese sollte dann eigentlich der korrekte Pfad zu einer Klasse aufgelöst werden (vorausgesetzt diese Klasse liegt auch in einem gelisteten Verzeichnis).

    Der zweite Fehler liegt in folgendem Befehl.

    Code
    set path=%path%; /home/pi/java

    Du hast bisher wohl nur mit Windows gearbeitet. Hier würde dieser Befehl die Umgebungsvariable path in der Tat erweitern. Bei Linux ist aber die Syntax anders. Erstens wird zum exportieren/setzen von Umgebungsvariablen unter Linux nicht set sondern export verwendet. Zweitens werden Variablen nicht in Prozentzeichen geschrieben wenn man diese irgendwo einfügen will. Drittens endet bei einem Semikolon der aktuelle Befehl und es beginnt ein neuer. Dein Befehl besteht also aus zwei Befehlen. Viertens wird bei Linux kein Semikolon zum Trennen der einzelnen Pfade in einer Umgebungsvariable verwendet sondern ein Doppelpunkt. Hier mal ein kleines Beispiel, welches du aber jetzt nicht gleicch ausführen solltest.

    Code
    export PATH=$PATH:/home/pi/bin
    Zitat

    2. Warum sagt er mir, dass er das Verzeichnis "/home/pi/java" bereits existiert, obwohl ich es gelöscht habe?

    Wie hast du das Verzeichnis denn gelöscht?
    Lass dir mal den Verzeichnisinhalt von /home/pi mit ls anzeigen.

    Code
    ls -la /home/pi

    Wenn hier noch ein Ordner java existiert, kannst du diesen natürlich auch nicht anlegen. Löschen kannst du den Ordner in der Shell mit dem folgenden Befehl.

    Code
    rm -rf /home/pi/java

    Gruß Georg

  • Habe das mal eben auch bei mir ausprobiert (Die pi muss doch java koennen :) :(

    Code
    pi@raspbmc:/$ env | grep -i java; ls /home/pi/java/; java HelloWorld
    CLASSPATH=/home/pi/java
    HelloWorld.class
    Hello, World

    Da Du ins /boot Verzeichnis bei Dir gegangen bist funktioniert es jetzt auch bei Dir. Wenn Du Deinen Classpath auf /homepi/java setzt kannst Du es aus jedem beliebigen Verzeichnis aufrufen, denn dort werden die java class Files oder jars gesucht. Die path Umgebungsvariable brauchst Du nicht zu setzen denn das Programm java steht bereits im path

    Code
    pi@raspbmc:/$ echo $PATH; which java
    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games:/opt/vc/bin:/home/pi/.xbmc-current/xbmc-bin/bin
    /usr/bin/java


    Du siehst, dass /usr/bin wo sich java befindet schon im path steht. Der einzig Grund warum es erst nicht bei Dir funktioniert hat ist der, dass die classpath Variable nicht auf /boot bei Dir gesetzt war.

    Wenn Du am Ende der Datei /home/pi/.bashrc die folgende Zeile einfuegst ist diese Variable immer nach dem logon gesetzt. Dann musst Du nur noch all Deine class und jar files in /home/pi/java kopieren.

    Code
    export CLASSPATH=/home/pi/java
  • Hallo boandlkramer,

    ok, ich habe das hier eingegeben und gleich dieses Ergebnis bekommen:

    ... ich nehme an "java" ist dann der Ordner? Ich habe damals mir die Karte genommen auf meinen Notebook-Kartenleser getan und dort händisch gelöscht....


    Zitat von boandlkramer pid=7489 dateline=1362901818


    Hier mal ein kleines Beispiel, welches du aber jetzt nicht gleicch ausführen solltest.

    Code
    export PATH=$PATH:/home/pi/bin


    Warum eigentlich nicht?

  • Hallo letter,

    Zitat

    ... ich nehme an "java" ist dann der Ordner?

    Richtig. Das kannst du auch an dem "d" (directory) am Zeilenanfang erkennen.

    Zitat

    Ich habe damals mir die Karte genommen auf meinen Notebook-Kartenleser getan und dort händisch gelöscht....

    Und auf dem Notebook hast du Windows installiert?
    Wenn du die SD-Karte in einen Windows-Rechner steckst, dann siehst du nur die erste kleine Partition welche zum Booten benötigt wird. Diese Partition wird beim Booten von der SD-Karte unter /boot eingehängt. Die größere Systempartition zeigt dir Windows nicht an, weil Windows das Dateisystem ext4 nicht unterstützt. Das Verzeichnis /home/pi/java befindet sich in der Systempartition. Da wird jetzt auch das Problem liegen warum das Verzeichnis noch immer vorhanden ist.

    Zitat

    Warum eigentlich nicht?

    Wenn ich sage geh zum Bahnhof und spring hinter einen Zug, machst du das dann auch? Wenn ja, dann bitte nicht machen da hätte ich bessere Ideen ;)
    Spaß bei Seite, der Befehl ist ein Beispiel. Er wird nichts auf deinem System zerstören und nach einem Neustart ist auch der ursprüngliche Zustand wiederhergestellt. Aber wie gesagt es ist ein Beispiel und wird dir auch nichts bringen wenn du diesen ausführst. Du solltest aber schon überlegen welche Befehle du auf deinem System ausführst und von welchen du besser die Finger lässt.

    Klappt es jetzt mit deiner Java-Klasse oder gibt es da noch Probleme?

    Gruß Georg

    Einmal editiert, zuletzt von boandlkramer (11. März 2013 um 18:04)

  • Ja, klappt super! Vielen Dank!

    Code
    pi@raspberrypi2 ~ $ CLASSPATH=/home/pi/java
    pi@raspberrypi2 ~ $ export CLASSPATH
    pi@raspberrypi2 ~ $ java j01
    Hello World!Test Test!

    Jetzt gehts auf zu neuen Abenteuern. :D Wir sehen uns hier: Kommunikation zwischen zwei RPs? ;)

    Zitat von boandlkramer pid=7581 dateline=1363021421


    Warum eigentlich nicht?

    Wenn ich sage geh zum Bahnhof und spring hinter einen Zug, machst du das dann auch? Wenn ja, dann bitte nicht machen da hätte ich bessere Ideen ;)


    LOL. Ich stand wohl auf dem Schlauch. :P

  • ... noch eine Frage ist mir eingefallen


    Zitat von framp pid=7506 dateline=1362911349

    Wenn Du am Ende der Datei /home/pi/.bashrc die folgende Zeile einfuegst ist diese Variable immer nach dem logon gesetzt. Dann musst Du nur noch all Deine class und jar files in /home/pi/java kopieren.

    Code
    export CLASSPATH=/home/pi/java

    jedes Mal, wenn ich den RP runterfahre muss ich den CLASSPATH neu setzen. Gibt es eine Möglichkeit dies persistent auf dem RP zu speichern, sodass ich den CLASSPATH nicht jedes Mal neu festlegen muss?

  • Genau diese Zeile habe ich im Cmd geschrieben. Doch wenn ich ihn runterfahren und wiederhochfahre ist es wieder beim alten (= der classpath ist nicht gespeichert und ich muss ihn erneut setzen.... wie ich bereits geschrieben habe...)

    Zitat von boandlkramer pid=7660 dateline=1363112223


    Hallo letter,

    Das hat framp bereits beschrieben und du zitierst die Lösung sogar noch. Wo liegt das Problem?

    Gruß Georg

  • Hallo letter,

    du sollst den Befehl nicht in der Shell ausführen sondern in die "/home/pi/.bashrc" eintragen. Also Schritt für Schritt:

    Nachdem du den Raspberry Pi gestartet hast öffnest du ein Terminal oder eine SSH-Verbindung. Anschließend öffnest du die "/home/pi/.bashrc" mit einem Editor.

    Code
    nano /home/pi/.bashrc

    Am Ende der Datei fügst du die folgende Zeile ein und speicherst die Datei ab.

    Code
    export CLASSPATH=/home/pi/java

    Jetzt sollte auch nach einem Neustart die Umgebungsvariable CLASSPATH gesetzt werden sobald du eine Shell startest.

    Gruß Georg

  • Zitat von framp pid=7665 dateline=1363114112


    Die Variable wird erst gesetzt wenn Du Dich per ssh anmeldest.

    Poste mal die Ausgabe von

    Code
    tail -5 ~/.bashrc

    Dann sehen wir die letzten 5 Zeilen in der Datei.


    Code
    pi@raspberrypi2:~$ tail -5 ~/.bashrc
    tail: â/home/pi/.bashrcâ kann nicht zum Lesen geöffnet werden: Datei oder Verzeichnis nicht gefunden

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!