Discussion:
externes Programm mit JAVA starten
(zu alt für eine Antwort)
Franz Hornung
2004-10-22 16:36:03 UTC
Permalink
Hi,

ich suche nach einer Minimalstkonfig um aus einem Java-Programm ein externes
Programm zu starten. Die Platform worüber JAVA läuft, sei als bekannt
vorauszusetzen (SuSE Linux 9.1)

Unter C genügte hier einfach der Befehl system("externesprogramm.exe"), es
auf DOS übersetzt wurde. Ich suche nun etwas, was (fast) genauso einfach
ist.

mfG
Franz
Achim Peters
2004-10-22 16:55:28 UTC
Permalink
Post by Franz Hornung
ich suche nach einer Minimalstkonfig um aus einem Java-Programm ein
externes Programm zu starten.
Unter C genügte hier einfach der Befehl system("externesprogramm.exe"),
es auf DOS übersetzt wurde. Ich suche nun etwas, was (fast) genauso
einfach ist.
Runtime.getRuntime().exec ("externesprogramm.exe")

HTH

Bye
Achim
Franz Hornung
2004-10-22 17:02:45 UTC
Permalink
Hi,

folgendes habe ich in eine InforMatik.java geschrieben:

import java.io.*;

public class InforMatik {
public static void main (String[] arguments)
{
Runtime.getRuntime().exec ("ipconfig");
}
}

anschliessend mit javac InforMatik.java übersetzt. Machte er aber nicht
sonder lieferte folgende Fehlermeldung:

InforMatik.java:6: unreported exception java.io.IOException; must be caught
or d
eclared to be thrown
Runtime.getRuntime().exec ("ipconfig");
^
1 error


Was habe ich falsch gemacht?

Danke und Gruß
Franz
Post by Franz Hornung
ich suche nach einer Minimalstkonfig um aus einem Java-Programm ein
externes Programm zu starten.
Unter C genügte hier einfach der Befehl system("externesprogramm.exe"), es
auf DOS übersetzt wurde. Ich suche nun etwas, was (fast) genauso einfach
ist.
Runtime.getRuntime().exec ("externesprogramm.exe")

HTH

Bye
Achim
Frank Buss
2004-10-22 17:11:13 UTC
Permalink
Die quick-and-dirty-Lösung:

public static void main (String[] arguments) throws Exception
--
Frank Buß, ***@frank-buss.de
http://www.frank-buss.de, http://www.it4-systems.de
Hero Wunders
2004-10-22 17:21:39 UTC
Permalink
Hallo!
Post by Franz Hornung
import java.io.*;
public class InforMatik {
public static void main (String[] arguments) {
Runtime.getRuntime().exec ("ipconfig");
}
}
anschliessend mit javac InforMatik.java übersetzt. Machte er aber nicht
Post by Franz Hornung
InforMatik.java:6: unreported exception java.io.IOException; must be
caught or declared to be thrown: Runtime.getRuntime().exec ("ipconfig");
1 error
Was habe ich falsch gemacht?
(Zitat verschönert)

Die Fehlermeldung sagt dir meistens, was du tun musst.
Anscheinend hast du noch nicht so große Erfahrungen mit Exceptions.
Post by Franz Hornung
exception java.io.IOException; must be caught or declared to be thrown
Die IOException muss also abgefangen werden oder du musst in deiner
Methodensignatur deutlich machen, dass sie diese Exception weiterleitet.

Das Abfangen geht mit dem try-catch Konstrukt.
Dein Code würde also so aussehen:

import java.io.*;

public class InforMatik {
public static void main(String[] arguments) {
try {
Runtime.getRuntime().exec("ipconfig");
} catch(IOException ioe) {
System.out.println(ioe.getMessage());
}
}
}

Da du hier eine main Methode verwendest, wird dieser Code wohl nicht von
einer weiteren Klasse instanziert, daher musst du die Exception abfangen
und kannst sie IIRC nicht weiterleiten.

Weiterleiten geht mit dem Schlüsselwort "throws" in der Methodensignatur.

public class meineKlasse {
public void bla() throws VerySeriousException {
// Code ohne try-catch, welches eine VerySeriousException
// nicht abfängt.
}
}

Alles klar?
Vielleicht solltest du aber mal eines der "Standardwerke" (siehe FAQ)
hinsichtlich dieses Themas lesen.

Mit freundlichen Grüßen,
Hero Wunders
Eric Bodden
2004-10-22 17:27:00 UTC
Permalink
Post by Franz Hornung
Was habe ich falsch gemacht?
Genau das, was da steht. Die IOException nicht hochgeleitet oder
abgefangen.

Eric - der empfiehlt, erst mal ein Anfängerbuch zu lesen
--
Eric Bodden, ICQ: 12656220, http://www.bodden.de, PGP: BB465582
Arithmetic Coding Revealed - a comprehensive guide to AC
http://bodden.de/studies/publications/pub_ac_en/
Hero Wunders
2004-10-22 17:25:44 UTC
Permalink
Hallo!
Post by Franz Hornung
import java.io.*;
public class InforMatik {
public static void main (String[] arguments) {
Runtime.getRuntime().exec ("ipconfig");
}
}
anschliessend mit javac InforMatik.java übersetzt.
Post by Franz Hornung
InforMatik.java:6: unreported exception java.io.IOException; must
Runtime.getRuntime().exec ("ipconfig");
1 error
Was habe ich falsch gemacht?
(Zitat verschönert)

Die Fehlermeldung sagt dir meistens, was du tun musst.
Anscheinend hast du noch nicht so große Erfahrungen mit Exceptions.
Post by Franz Hornung
exception java.io.IOException; must be caught or declared to be thrown
^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Die IOException muss also abgefangen werden oder du musst in deiner
Methodensignatur deutlich machen, dass sie diese Exception weiterleitet.

Das Abfangen geht mit dem try-catch Konstrukt.
Dein Code würde also so aussehen:

import java.io.*;

public class InforMatik {
public static void main(String[] arguments) {
try {
Runtime.getRuntime().exec("ipconfig");
} catch(IOException ioe) {
System.out.println(ioe.getMessage());
}
}
}

Da du hier eine main Methode verwendest, wird dieser Code wohl nicht von
einer weiteren eigenen Klasse instanziert. Daher ist es nur sinnvoll die
Exception auch selbst abzufangen (und nicht weiterzuleiten).

Weiterleiten geht mit dem Schlüsselwort "throws" in der Methodensignatur.

public class meineKlasse {
public void bla() throws VerySeriousException {
// Code ohne try-catch, welches eine VerySeriousException
// nicht abfängt.
}
}

Alles klar?
Vielleicht solltest du aber mal eines der "Standardwerke" (siehe FAQ)
hinsichtlich dieses Themas lesen.

Mit freundlichen Grüßen,
Hero Wunders
Franz Hornung
2004-10-22 17:54:59 UTC
Permalink
Post by Hero Wunders
Alles klar?
Vielleicht solltest du aber mal eines der "Standardwerke" (siehe FAQ)
hinsichtlich dieses Themas lesen.
Hi,

jetzt compiliert er zwar anständig, aber wenn ich deinen Lösungsvorschlag
dann mit java InforMatik auf meinem XP-Rechner ausführe, passiert gar nix,
es werden also nicht die IP-Einstellungen angezeigt, wie ich erhofft hatte.

Ja, ich bin JAVA-Newbie und habe es in diesem Semester als Wahlpflichfach
belegt. Das mit den try-catch-Sachen kommt noch laut Skript.

Ich wollte eigentlich damit nur testen ob man mithilfe von JAVA und Applet
über eine Webseite ein Programm starten kann. Wäre ja eine ziemliches
Risiko, und ein triftiger Grund, als Admin nicht im Web zu surfen, da
womöglich ein böser Student eine Java-Applet auf seiner Homepage benutzt,
mit dem das Programm shutdown gestartet wird :o)

Wäre nett, wenn du mir da noch helfen könntest.

Gruß
Franz
Marco Schmidt
2004-10-22 18:08:23 UTC
Permalink
Post by Franz Hornung
jetzt compiliert er zwar anständig, aber wenn ich deinen Lösungsvorschlag
dann mit java InforMatik auf meinem XP-Rechner ausführe, passiert gar nix,
es werden also nicht die IP-Einstellungen angezeigt, wie ich erhofft hatte.
Du kannst Dir die Ausgabe des Programm geben lassen und dann auf der
Konsole ausgeben lassen (Stichwort Process.getIn/OutputStream,
System.out).
Post by Franz Hornung
Ja, ich bin JAVA-Newbie und habe es in diesem Semester als Wahlpflichfach
belegt. Das mit den try-catch-Sachen kommt noch laut Skript.
Dann schau doch mal rein.
Post by Franz Hornung
Ich wollte eigentlich damit nur testen ob man mithilfe von JAVA und Applet
über eine Webseite ein Programm starten kann.
Nein, kann man nicht.

Letzten Endes kann man einem Java-Applet durch Signieren etc. alles
Mögliche erlauben, aber die Standardeinstellung ist sehr konservativ
mit dem, was sie erlaubt.

Gruß,
Marco
--
Bitte nur in der Newsgroup antworten, nicht per Email!
de.comp.lang.java Homepage: http://www.dclj.de/
FAQ: http://www.faqs.org/faqs/de/comp-lang-java/faq/
Meine Java-Seiten: http://www.geocities.com/marcoschmidt.geo/java.html
Frank Buss
2004-10-22 18:13:42 UTC
Permalink
Post by Franz Hornung
jetzt compiliert er zwar anständig, aber wenn ich deinen
Lösungsvorschlag dann mit java InforMatik auf meinem XP-Rechner
ausführe, passiert gar nix, es werden also nicht die IP-Einstellungen
angezeigt, wie ich erhofft hatte.
das liegt daran, daß die Standard-Aus-/Eingabe des aufgerufenen Prozesses
nicht an die Standard-Aus-/Eingabe des Java-Prozesses weitergeleitet
wird, sondern z.B. mit dem InputStream, den du per getInputStream() auf
dem per exec zurückgelieferten Process-Objekts bekommst, erst ausgelesen
werden muß.
Post by Franz Hornung
Ich wollte eigentlich damit nur testen ob man mithilfe von JAVA und
Applet über eine Webseite ein Programm starten kann. Wäre ja eine
ziemliches Risiko, und ein triftiger Grund, als Admin nicht im Web zu
surfen, da womöglich ein böser Student eine Java-Applet auf seiner
Homepage benutzt, mit dem das Programm shutdown gestartet wird :o)
das geht nur mit signierten Applets oder wenn du die
Sicherheitseinstellungen in den entsprechenden Policy-Dateien geändert
hast, ansonsten haben Applets ziemlich wenig Rechte auf dem Rechner, auf
dem sie ausgeführt werden.
--
Frank Buß, ***@frank-buss.de
http://www.frank-buss.de, http://www.it4-systems.de
Dieter Sebastian
2004-10-22 18:39:57 UTC
Permalink
Post by Franz Hornung
Hi,
public class InforMatik {
public static void main (String[] arguments)
{
Runtime.getRuntime().exec ("ipconfig");
}
}
Was Du brauchst, ist vielleicht folgendes:
java.net.NetworkInterface.getNetworkInterfaces();

Raus kommt eine Enumerartion. Werte sie aus und du kommst an die Daten,
die Du brauchst.

Gruss
Dieter
Malte Schneider
2004-10-25 07:57:06 UTC
Permalink
Post by Franz Hornung
Hi,
ich suche nach einer Minimalstkonfig um aus einem Java-Programm ein
externes Programm zu starten. Die Platform worüber JAVA läuft, sei als
bekannt vorauszusetzen (SuSE Linux 9.1)
Unter C genügte hier einfach der Befehl system("externesprogramm.exe"),
es auf DOS übersetzt wurde. Ich suche nun etwas, was (fast) genauso
einfach ist.
mfG
Franz
Hier wird das Thema ausführlich auseinander genommen:
http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html

Runtime#exec birgt nämlich diverse Stolperfallen

Malte

Loading...