Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Anwendung soll sich selbst neustarten können

549 views
Skip to first unread message

Tobias Stening

unread,
May 1, 2003, 6:32:03 AM5/1/03
to
Hallo alle miteinander,

ich habe bei der IDE SunOne gesehen, dass sie sich selbst neustarten kann,
wenn sie Updates oder neue Module heruntergeladen hat. Nun haben wir hier
auch eine Anwendung im entstehen, die ebenfalls per Online-Update neue
Module herunterladen kann.

Nun meine Frage: Wie kann sich eine Java-Anwendung selbst neu starten? Oder
seht ihr eine andere Möglichkeit, wie man zur Laufzeit evtl. ohne Neustart
neue Programm-Module einbinden kann?

Wäre für jeden Hinweis dankbar.

Viele Grüße,
Tobias


Walter Hipp

unread,
May 1, 2003, 11:47:49 AM5/1/03
to

"Tobias Stening" <toa...@cmaxx.de> schrieb im Newsbeitrag news:b8qthe$pt5$1...@online.de...

> Hallo alle miteinander,
>
> ich habe bei der IDE SunOne gesehen, dass sie sich selbst neustarten kann,
> wenn sie Updates oder neue Module heruntergeladen hat. Nun haben wir hier
> auch eine Anwendung im entstehen, die ebenfalls per Online-Update neue
> Module herunterladen kann.
>
> Nun meine Frage: Wie kann sich eine Java-Anwendung selbst neu starten? Oder
> seht ihr eine andere Möglichkeit, wie man zur Laufzeit evtl. ohne Neustart
> neue Programm-Module einbinden kann?

Hallo Tobias,
so starte ich neu:

protected void restartApp()
{
try {
String pth1 = "Pfad zu Deiner Anwendung" + System.getProperty

("file.separator");
String cmd = null;
if (_opSys == 1) //Unix/Linux, falls externe Bibliotheken verwendet werden,
// da der Seperator in diesem Fall ":" ist
{
// Beispiel mit externen Bibliotheken
cmd = "java -cp " + pth1 + "jhall.jar:" + pth1 + "skinlf.jar -jar " + pth1 +
"DeineAnwendung";

}
else
{
// Beispiel mit externen Bibliotheken
// der Seperator in diesem ist Fall ";"
cmd = "java -cp " + pth1 + "jhall.jar;" + pth1 + "skinlf.jar " +
"-jar " + pth1 + "DeineAnwendung";
}
Process ps = null;
//System.out.println("Runtime Dir = " + pth1);
ps = Runtime.getRuntime().exec(cmd);
try {
ps.waitFor();
} catch (InterruptedException _iex) { System.out.println("Start Interrupted"); }
} catch (IOException _ioe) { System.out.println("Unable to start myself, please try it at your
own"); }
System.exit(0);
}

Gruß Walter


Stefan Matthias Aust

unread,
May 1, 2003, 1:15:39 PM5/1/03
to
Tobias Stening wrote:

> Nun meine Frage: Wie kann sich eine Java-Anwendung selbst neu starten?

Variante 1: Du hast ein Java-Programm, das ein zweites Java-Programm per
Runtime.exec() startet und auf deren Ende wartet. Beim Programmende
wird ein Return-Code zurückgegeben. Ist dieser sagen wir -5383, dann
startet das äußere Programm einfach das innere erneut. Andernfalls
beendet es sich mit dem ursprünglichen Return-Code.

Variante 2: Ein Starter in Java lädt die eigentlichen Klassen mit einem
eigenen Classloader und ruft danach dann eine vereinbare Methode auf.
Diese Methode kann dann zurückliefern, ob neu gestartet oder beendet
werden soll. Da nach der Rückkehr der Methode der gesamte ClassLoader
mit allen gelanden Klassen und globalen Variablen weggeworfen wird,
kommt ein erneutes Laden mit einer neuen ClassLoader-Instanz einem
Neustart gleich.


bye
--
Stefan Matthias Aust //
www.3plus4software.de // Inter Deum Et Diabolum Semper Musica Est

Marcus Stursberg

unread,
May 1, 2003, 1:17:12 PM5/1/03
to
Tobias Stening schrieb:

> Nun meine Frage: Wie kann sich eine Java-Anwendung selbst neu starten? Oder
> seht ihr eine andere Möglichkeit, wie man zur Laufzeit evtl. ohne Neustart
> neue Programm-Module einbinden kann?

Ein eigener ClassLoader wäre eine Lösung.

Schau dir einmal den URLClassloader an. Mit ihm ist es sehr leicht
möglich, jar-Dateien erst zur Laufzeit einzubinden.

Somit kannst du, bevor deine regulären jar Dateien geladen werden, das
update durchführen.

Wenn ich das richtig verstanden habe, kannst du bereits geladene Klassen
(auch jar-Files?) wieder frei geben, indem du deinen verwendeten
Class-Loader "weg schmeißt". D.h. du müsstest nicht die JVM beenden
(schneller, benutzerfreundlicher). Ich habe das allerdings noch nicht
ausprobiert.

Patrick Roemer hat dazu einen FAQ Punkt geschrieben [1].

Gruß

Marcus


[1]
http://groups.google.de/groups?selm=avkh0v%24in2%2401%241%40news.t-online.com&rnum=2

Tobias Stening

unread,
May 1, 2003, 8:28:53 PM5/1/03
to
Danke für die Hinweise.

Werde mir mal die einzelnen Tipps genauer ansehen.

Viele Grüße,
Tobias :-)


Robert Schröder

unread,
May 2, 2003, 2:24:21 AM5/2/03
to
Walter Hipp wrote:

> protected void restartApp()
> {
> try {
> String pth1 = "Pfad zu Deiner Anwendung" + System.getProperty
>
> ("file.separator");
> String cmd = null;
> if (_opSys == 1) //Unix/Linux, falls externe Bibliotheken verwendet werden,
> // da der Seperator in diesem Fall ":" ist
> {
> // Beispiel mit externen Bibliotheken
> cmd = "java -cp " + pth1 + "jhall.jar:" + pth1 + "skinlf.jar -jar " + pth1 +
> "DeineAnwendung";
>
> }
> else
> {
> // Beispiel mit externen Bibliotheken
> // der Seperator in diesem ist Fall ";"
> cmd = "java -cp " + pth1 + "jhall.jar;" + pth1 + "skinlf.jar " +
> "-jar " + pth1 + "DeineAnwendung";
> }

Anstelle der if-Verzweigung könntest du auch File.pathSeparatorChar
verwenden: Liefert das plattformabhängige Trennzeichen zwischen
Dateinamen in einer Liste. Unter Unix ":", unter Windows ";".
Und System.getProperty("file.separator") könnte man auch ersetzen durch
File.separator.

Grüße
Robert

Pascal Bockhorn

unread,
May 2, 2003, 1:48:10 PM5/2/03
to

"Tobias Stening" <toa...@cmaxx.de> schrieb:

> Hallo alle miteinander,

hidiho,

> ich habe bei der IDE SunOne gesehen, dass sie sich selbst neustarten
kann,
> wenn sie Updates oder neue Module heruntergeladen hat. Nun haben wir
hier
> auch eine Anwendung im entstehen, die ebenfalls per Online-Update neue
> Module herunterladen kann.

schön sowas wollte ich auch noch mal machen...

> Nun meine Frage: Wie kann sich eine Java-Anwendung selbst neu starten?
Oder
> seht ihr eine andere Möglichkeit, wie man zur Laufzeit evtl. ohne
Neustart
> neue Programm-Module einbinden kann?

hab das mal auch benötigt und hab das seinerzeit so gelöst: (bißchen für
dich angepasste version)

public static void newInstance() throws Exception {
File javaPath = new File(System.getProperty("java.home") +
System.getProperty("file.separator") + "bin" +
System.getProperty("file.separator"));
// check for windows consoleless
File java = new File(javaPath, "javaw.exe");
// else take the default interpreter
if (!java.exists())
java = new File(javaPath, "java");
String[] cmd = new String[4 + params.length];
// path to java
cmd[0] = java.getAbsolutePath();
// parameter for classpath
cmd[1] = "-cp";
// restore classpath
cmd[2] = System.getProperty("java.class.path");
// class to start
cmd[3] = Start.class.getName();
// copy old params
System.arraycopy(params, 0, cmd, cmd.length - params.length,
params.length);
// execute
Runtime.getRuntime().exec(cmd);
}

public static void restart() {
try {
newInstance();
} catch (Exception e) {
// perhaps make a info dialog to inform user about the
failed restart
System.exit(1);
} finally {
// fine, the new instance is running
System.exit(0);
}
}

public static void main(String[] args) {
// save params for another instance
params = args;
// ...
}

> Wäre für jeden Hinweis dankbar.

vielleicht war das ja einer...

das ganze wurde damals unter linux und windows erfolgreich getestet.
falls du noch mehr änderungen an der vm durch start parameter einbaust
kannst du die ja auch noch als uebergabeparameter einbauen. denkbar
waere z.b. noch den library path zu kopieren.

> Viele Grüße,
> Tobias

grüße,
pascal


Tobias Stening

unread,
May 7, 2003, 6:30:52 PM5/7/03
to
"Pascal Bockhorn" <pascalb...@web.de> schrieb

Na das sieht doch schon ganz gut aus. Werde es mal testen und mich hier
wieder melden, falls es Probleme gibt!

Danke für die Hinweise... :-)

Viele Grüße, Tobias

0 new messages