Java Programm mit exec starten

Dimax

Top Contributor
Guten Tag ,

Ich brauche Hilfe beim Starten eines java Programm aus einem anderen java Programm.

Das Test-Programm Abra.java ist compiliert und liegt auf dem Desktop zusammen mit Abra.class

Java:
import javax.swing.JFrame;

public class Abra{

public static void main(String args[]){
JFrame meinFrame = new JFrame("Beispiel JFrame");
meinFrame.setSize(200,200);
meinFrame.setVisible(true);

if(Integer.valueOf(args[0])==1){
System.out.println("blalblaln");

}
}
}

Das StringSplit.java liegt in einem war File und soll Abra.java starten
Java:
public class StringSplit {

    public static void main(String[] args) {
        try {
            System.out.println("Creating Process...");
            Process p=Runtime.getRuntime().exec("java C:\\Users\\Desktop\\Abra 1");
            System.out.println("Executed Process...");
            InputStream error=p.getErrorStream();
            for(int i=0;i<error.available();i++) {
                System.out.println("->"+error.read());
                System.out.println("->"+error.toString());
                
            }
p.destroy();
    }catch(Exception ex) {
        System.out.println("Creating Error...");
        ex.printStackTrace();
    }
}
}
Beim ausführen des StringSplit im Eclipse wird :
Creating Process...
Executed Process...
ausgegeben aber mehr nicht.
Die Frage : Wie kann mann das Programm Abra in anderem java Programm richtig Starten und falls Problemmen gibt ,Fehler auslesen.
Danke im Voraus.
 
Ich habe StringSplit.java modifiziert
Java:
public class StringSplit {

    public static void main(String[] args) {
        String sep="\\";
        try {
            System.out.println("Creating Process...");
            Process p=Runtime.getRuntime().exec("java C:"+sep+"Users"+sep+""Desktop"+sep+"Abra 1");
            System.out.println("Executed Process...");
            InputStream error=p.getErrorStream();
            InputStreamReader isr=new InputStreamReader(p.getErrorStream(),Charset.forName("UTF-8"));
            StringBuilder sb=new StringBuilder();
            char[] buffer=new char[1024];
            int length=0;
            while((length=isr.read(buffer,0,buffer.length))>=0) {
                sb.append(buffer,0,length);
            }
            System.out.println(sb.toString());
            isr.close();
            for(int i=0;i<error.available();i++) {
                System.out.println("->"+error.read());
                System.out.println("->"+error.toString());
                
            }
p.destroy();
    }catch(Exception ex) {
        System.out.println("Creating Error...");
        ex.printStackTrace();
    }
}
}
und bekomme folgende Ausgabe
Code:
Executed Process...
Fehler: Hauptklasse C:\Users\Desktop\Abra konnte nicht gefunden oder geladen werden

Creating Error...
java.io.IOException: Stream Closed
    at java.io.FileInputStream.available0(Native Method)
    at java.io.FileInputStream.available(FileInputStream.java:306)
    at methoden.StringSplit.main(StringSplit.java:29)
 
Du darfst nicht java C:\Users\Desktop\Abra 1 aufrufen, die Befehlszeile muss lauten java -cp C:\Users\Desktop Abra 1, wobei Du statt Backslashes auch normale Schrägstriche verwenden können solltest.
 
Danke mihe7 für schnelle Antwort
Nach dem ich folgende Zeilen geändert habe
String sep="/"; Process p=Runtime.getRuntime().exec("java -cp C:"+sep+"Users"+sep+"Desktop"+sep+"Abra 1");
bekomme ich
Fehler: Hauptklasse 1 konnte nicht gefunden oder geladen werden
Wie kann ich Abra mit verschiedenen Parametern starten?
 
Ok..alles erledigt.
Richtige Zeile sollte so aussehen
Process p=Runtime.getRuntime().exec("java -cp C:/Users/Desktop Abra 1");
Abra und Parameter 1 sollten vom Pfad getrennt geschrieben werden .
Danke mihe7.
 
Nur zur Erläuterung, damit Du das alles auch verstehst:

Java erwartet die Angabe der Klasse (mit dem vollen Namen, also incl. Package). Da Deine Klasse im unbenannten Paket ist, ist das einfach "Abra".

Damit Java aber auch die Klasse findet, muss man sagen, wo diese zu finden sind. Daher der Parameter "-cp" mit dem Ort, wo die class Datei zu finden ist. (Das gilt so nur, weil die Klasse im unbenannten Paket ist. Ansonsten wäre es nicht der Ort, wo die class Datei liegt sondern das Wurzelverzeichnis, ab dem man die Klasse finden kann. Eine Klasse my.package.MyClass hat eine MyClass.class Datei in einem Ordner my\package\ und das Wurzelverzeichnis wäre dann das Verzeichnis, in dem das Verzeichnis "my" liegen würde.)

Nach dem Klassennamen kommen dann die Parameter, die übergeben werden sollen. Bei Deinem Beispiel wird die 1 übergeben.
 

Zurück
Oben