Best Practice Rückgabe eines Terminal Befehls in eine Variable speichern

noobee

Aktives Mitglied
Hallo,

ich starte mit Netbeans (unter Linux) mittels
Java:
Process p = Runtime.getRuntime().exec("java -jar test_cli.jar);
ein testtool. Wenn ich dies händishc im Terminal starte, läuft dieses ein paar sec und gibt mir dann im Terminal ein Ergebnis zurück. Jetzt weiß ich nicht, wie ich diese Rückgabe nach "unbestimmter" Zeit aus dem Terminal mit Netbeans abfragen kann.
Bei
Java:
p.waitFor();
und
Java:
System.out.println(p.toString());
bekomme ich sofort nur Quark zurück. Eigentlich wollte ich ja mit
Java:
p.waitFor();
auf das Ende des Prozesses warten und erst dann den Wert aus dem Terminal irgendwie holen. Warum funktioniert hier p.waitFor() nicht 😵 ?
 
Java:
import java.io.InputStream;

public class Test {
    public static void main(String[] args) throws Exception {
        Process p = Runtime.getRuntime().exec("java -cp . Cli");
        try(InputStream is = p.getInputStream()) {
            StringBuilder b = new StringBuilder();
            int c;
            while ((c = is.read()) != -1) {
                b.append((char) c);
            }
            System.out.println(b.toString());
        }
    }
}
 
Danke.
Gleich mal probiert. Ich dachte eigentlich, dass Netbeans das mit dem ClassPath macht 😱 Ok, ClassPath rausgesucht und weiter 😉
Wenn ich nun
Java:
java -cp /usr/lib/jvm/java-11-openjdk-amd64/ . test_cli.jar
ausführe gibt es zwei Fehler:
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

btw ist bei meinem fehlerhaften Code natürlich auch "is.read" gleich -1, somit gehts auch nie in die whlie 🙁
 
Nein, Du brauchst schon Deinen java-Aufruf (mit -jar), wenn Du ein Jar mit einem Manifest hast, das die Main-Klasse angibt. Tut mir leid, wenn ich Dich hier etwas verwirrt habe 🙂

Die Alternative bestünde darin, den Classpath anzugeben, dann müsste die Jar in den Classpath mit rein und die Main-Klasse explizit angegeben werden (z. B. java -cp test-cli.jar paket.zur.Main).
 
Den Pfad der Runtime als Classpath anzugeben ist unnötig. Was soll der einsame Punkt bewirken?, wenn es in den Classpath soll: Doppelpunkt und kein Leerzeichen rein, wenn du explizit dort noch *andere* Jars inkludieren musst. Ansonsten lautet der Befehl
java [-cp <path-or-jar1>[:<path-or-jar2[:...]]] -jar <your-executable.jar>
 
Zuletzt bearbeitet:
Öhm, ja. Ich bin dann mal raus 😵 Also jetzt bin ich doch ein wenig verwirrt. Brauch ich nun den Classpath doch nicht? In der Konsole funktioniert es ja, wenn ich es eingebe. Wenn ich aber genau den gleichen Code über Netbeans ablaufen lsase, passiert nix...

Sollte das so aussehen in Netbeans?
Java:
java -cp /usr/lib/jvm/java-11-openjdk-amd64/ -jar test_cli.jar

EDIT: In der Konsole gehts mal wieder, mit Netbeans nicht 🙁
 
Hallo,
tja, es gibt keinen sichtbaren Fehler. Netbeans läuft durch.
Ich sehe es nur daran, dass "is.read()" gleich "-1" ist, somit "try(InputStream is = p.getInputStream()){" nicht funktioniert hat, bzw. "Process p = Runtime.getRuntime().exec" nicht geklappt hat.
 
Ich meine mich daran erinnern zu können, dass beide Streams geöffnet werden müssen. Es kann aber auch falsch sein.
 
Damit wir hier vom gleichen reden: die Testanwendung sieht so aus:
Java:
public class Test {
    public static void main(String[] args) throws Exception {
        Process p = Runtime.getRuntime().exec("java -jar test_cli.jar");
        try(InputStream is = p.getInputStream()) {
            StringBuilder b = new StringBuilder();
            int c;
            while ((c = is.read()) != -1) {
                b.append((char) c);
            }
            System.out.println(b.toString());
        }
    }
}
?

Dann gibt mal noch den Pfad zur test_cli.jar explizit an und wenn das immer noch nicht funktioniert auch den Pfad zu "java".
 
Das verstehe ich - ich würde mir auch nicht trauen. Also, extra für Dich:
Java:
public class Cli {
    public static void main(String[] args) throws Exception {
        Thread.sleep(2000);
        System.out.println("Die Antwortet lautet: " + ((int)(Math.random()*Integer.MAX_VALUE)));
    }
}

Code:
Main-Class: Cli
Java:
import java.io.InputStream;

public class Test {
    public static void main(String[] args) throws Exception {
        Process p = Runtime.getRuntime().exec("java -jar cli.jar");
        try(InputStream is = p.getInputStream()) {
            StringBuilder b = new StringBuilder();
            int c;
            while ((c = is.read()) != -1) {
                b.append((char) c);
            }
            System.out.println(b.toString());
        }
    }
}

Code:
javac *.java
jar -cfm cli.jar Manifest.txt Cli.class
java -cp . Test
Hoffe, nichts vergessen zu haben 😛
 
Dann gibt mal noch den Pfad zur test_cli.jar explizit an und wenn das immer noch nicht funktioniert auch den Pfad zu "java".

😱😱😱😱 Ich dreh durch. Genau das war der Fehler - so was simples. Die Pfadangabe muss explizit sein 😕 Da hätte ich im Leben nicht dran gedacht 🙁

DANKE 🙂🙂 es läuft !!! 🙂🙂 und SORRY wegen dem "Wind für (fast) nichts"
 
Versuch zur Schlichtung
siehe Test1.zip und doppelklicken auf die beiliegende BAT.

Bei mir sind nur seltsamerweise Zeilenumbrüche nicht sichtbar!
 

Anhänge


Zurück
Oben