BeanDev: Neustart der NetBeans-Platform
Achtung: Seit NetBeans 6.7 (platform10) gibt es eine einfachere Methode einen Neustart zu erzwingen. Hier mein Blogeintrag dazu.
Leider gibt es laut Mailing-Liste keine offizielle Möglichkeit die NetBeans-Plattform aus dem Programm heraus neu zu starten.
Also muss man sich behelfen und die Sache "zu Fuß" durchziehen.
Am besten erzeugt man sich mit dem Assistenten eine CallableSystemAction mit dem Namen "SystemRestartAction", setzt sie unter die Kategorie "System", und fügt sie als Global Menu Item im Menü "File" hinter den Menüeintrag "Exit" ein.
Wenn man noch ein schönes Icon hat, kann man es noch im Assistenten hinterlegen, nur ein Tastenkürzel würde ich nicht vergeben.
Der Assistent erzeugt nun eine Java-Klasse mit dem Namen (wie sollte es anders sein) SystemRestartAction. Nur die performAction-Methode muss noch implementiert werden:
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import org.openide.LifecycleManager;
import org.openide.util.Exceptions;
[...]
public void performAction() {
String systemName = NbBundle.getMessage(SystemRestartAction.class, "CTL_SystemFileName");
String homePath = System.getProperty("netbeans.home", ".");
File base = new File(homePath).getParentFile();
File bin = new File(base, "bin");
final File execution = new File(bin, systemName);
if ( execution.exists() ) {
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
public void run() {
try {
new ProcessBuilder(execution.getAbsolutePath()).start();
} catch (IOException ex) {
Exceptions.printStackTrace(ex);
}
}
}));
LifecycleManager.getDefault().exit();
} else {
Exceptions.printStackTrace(new FileNotFoundException ("Can't find the launcher " + execution.getAbsolutePath()));
}
} Der Bundle.properties-Wert "CTL_SystemFileName" muss den Namen der ausführbaren Launcher-Datei tragen. Unter Windows und für NetBeans wäre das netbeans.exe. Damit sieht man schon die wichtigste Einschränkung dieser Methode: sie ist abhängig von dem installierten Betriebssystem. Das zweite (nicht so gravierende) Problem ist, dass man wissen muss wie der Launcher heißt.
Die OS-Abhängigkeit kann man mildern, wenn man per org.openide.util.Utilities die Betriebssysteme abfragt. Die Methoden wären isMac(), isWindows() und isUnix(). Wobei man isUnix und isMac zusammenfassen kann, da der Launcher für die beiden Systeme identisch ist.
Damit könnte man folgende Abfrage realisieren:
String systemName =
NbBundle.getMessage (SystemRestartAction.class,
Utilities.isWindows()
? "CTL_SystemFileName.Windows"
: "CTL_SystemFileName.MacOrUnix");
In der Bundle.properties steht dann für die NetBeans-IDE:
CTL_SystemFileName.Windows=netbeans.exe
CTL_SystemFileName.MacOrUnix=netbeans
Für die eigene Plattform-Anwendung muss man dann natürlich den eigenen Applikationsnamen aus der "Standalone Application" nehmen. Das ist in den Projekt-Eigenschaften der Branding-Name im Abschnitt "Build".
Beste Grüße,
Josch.
Da werden Sie geholfen:
Das deutsche NetBeans Forum
![Validate my RSS feed [Valid RSS]](http://www.sepix.de/fileadmin/valid-rss.png)
Mittwoch, 08-07-09 01:29
FYI: http://www.netbeans.org/nonav/issues/show_bug.cgi?id=168257