Problemstellung:
----------------
Es geht um einen JAVA-Class-Aufruf über Runtime.getRuntime().exec(String );
ProblemBeschreibung:
--------------------
habe 2 verschiedene JAVA-Klassen mit jeweils eigene main-fkt.
Klasse A liefert die das Parameter für Klasse B und Klasse B macht
einen einfachen System.out.println mit diesem Param.
Klasse A darf NICHT Klasse B importieren. Der Aufruf muß wie folgt passieren:
String cmd = "java B " + ParamFromA_Class;
Runtime.getRuntime().exec(cmd);
Beispiel-Codes:
-------------
_public class A {
public static void main(String [] args){
String sCmd = "java B " + „Ausgabe!“;
Runtime.getRuntime().exec(sCmd);
//funktioniert nicht!! Auch nicht, wenn der gesamte java.exe-Pfad angegeben wird!!
//Aber den einfachen Notpad kann ich z.B. so aufrufen: sCmd = „C:\WINNT\notepad“
}
}
public class B {
public static void main(String [] args){
System.out.println("Ausgabe von B: " + args[0].toString());
}
}_
?- Wieso geht das nicht??
?- Wie soll ich den Aufruf gestalten???
Danke
PS: Habe unten das Problem auch erklärt, aber der „Baum“ ist zu lang geworden
und ich wollte den Code und eine besser Problembeschreibung Euch zur Verfügung stellen.
habe 2 verschiedene JAVA-Klassen mit jeweils eigene main-fkt.
Klasse A liefert die das Parameter für Klasse B und Klasse B
macht
einen einfachen System.out.println mit diesem Param.
Klasse A darf NICHT Klasse B importieren. Der Aufruf
muß wie folgt passieren:
String cmd = "java B " + ParamFromA_Class;
Runtime.getRuntime().exec(cmd);
Das Probl. hatte ich auch schon:
der String cmd sieht ja „zum Schluss“ so aus:
„java B para“
dann führt die JVM folgendes aus:
das Program „java“
das Program „B“
das Program „para“
Die JVM zerlegt den String in seine „Einzelteile“ und führt sie einzeln aus. (deshalb funkt. auch „notepad“)
es gibt aber eine Variante die den String nicht zerlegt, sieh in der API nach. (ich glaub es war exec(cmd,null)
Die JVM zerlegt den String in seine „Einzelteile“ und führt
sie einzeln aus. (deshalb funkt. auch „notepad“)
Aber z.B. könnte ich ja eine Batch-Datei via exec() aufrufen.
Wenn ich in meiner Batch z.B. einen Call auf cmd mache bzw.
notepad oder auch beides, dann wird alles auch schön ausgeführt und geöffnet. Doch sobald ich in dieser Batch schreibe „java A“, dann macht das Programm nix!!! Hum!!! Bin ziemlich verzweifelt… Hatte eigentlich von JAVA mehr erwartet, als sich mit solchen Banalitäten rumzuschlagen
im vorigen Thread hatte ich dich ja schon mal darauf hingewiesen, dass das ganze auch innerhalb von java funktioniert.
Du scheinst damit Problem gehabt zu haben.
Deswegen ein kleines Beispiel:
public class A
{
public A()
{
}
public static void main(String[] args)
{
A a1 = new A();
try
{
Class b = Class.forName("B");
Class[] argsOfB = new Class[] {String[].class};
java.lang.reflect.Method method = b.getMethod("main", argsOfB);
Object[] argValues = new Object[] {new String[] {"Horst"}};
method.invoke(b, argValues);
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
public class B
{
public B()
{
}
public static void main(String[] args)
{
System.out.println("Tach auch " + args[0]);
}
}
Probiers einfach mal aus. A kann hiermit die main-Routine von B aufrufen, ohne B jemals gesehen zu haben.
Aber z.B. könnte ich ja eine Batch-Datei via exec() aufrufen.
Wenn ich in meiner Batch z.B. einen Call auf cmd mache bzw.
notepad oder auch beides, dann wird alles auch schön
ausgeführt und geöffnet. Doch sobald ich in dieser Batch
schreibe „java A“, dann macht das Programm nix!!! Hum!!! Bin
ziemlich verzweifelt…
das Probl. ist einfach:
die std. ausgabe, std. eingabe und der error-stream werden _nicht_ von der JVM an das dos(-fenster) vergegeben.
die musst du mit getOutputStream (…) vom Runtime-Object selbst „abgreiffen“.
wenn du eine batch machst ist allerdings nicht klar op die std. ausgeabe der Batch oder des Progs. A zurückgegben wird.
Versuchsweise würd ich mal ein Frame in A erzeugen und anzeigen. Das leitet Runtime nicht um. (unter win98)
Hatte eigentlich von JAVA mehr
erwartet, als sich mit solchen Banalitäten rumzuschlagen