S
SE
Da ich mich zur Zeit etwas mit multiplatforming auseinander setze wollte ich hier mal die gelegenheit nutzen um 1) meine aktuellen Erfahrungen für die jenigen anzubieten die diese noch nicht haben und 2) um selbst noch ein paar Fragen loszuwerden.
Zum Thema allgemein
Jeder kennt das : wenn man etwas installiert , ganz gleich ob Spiel , Anwendung oder was auch immer , bekommt man von den meisten Installern die Möglichkeit eine Desktopverknüpfung anzulegen. Das kennt man so von Java nicht : entweder wird ein Launcher als Jar dierekt auf den Desktop gepackt , ein Batch- bzw Shell-Skript welches dann java mit den entsprechenden Parametern startet oder unter Windows auch gerne einen EXE-Wraper.
Geht es auch anderst ?
Ja. Es gibt möglichkeiten auch mit Java "native" Desktopverknüpfungen anzulegen.
Das funktioniert jedoch bei den unterschiedlichen Betriebssystemen jewils anderst.
Welche Möglichkeiten gibt es ?
Windows : eine der einfachsten Möglichkeiten unter Windows ist es dierekt die Windows eigenen Mittel zu verweden. Viele werden jetzt sagen : "Naja dürfte mit JNA nicht schwer werden." Das stimmt auch so weit ... aber es geht auch noch einen Tick einfacher mit JNI. Das zauberwort heißt JShortCut
JShortCut bietet uns eine Windows-DLL mithilfe der wir ganz einfach Verknüpfungen erstellen können. Auch haben wir über eine statische Methode die Möglichkeit spezielle Ordner zu suchen wie etwas den Desktop , den "Programme"-Ordner oder auch das Startmenü. Und da das ganze dierekt durch Informationen von Windows selbst gefüttert wird sollte das auf allen NT-basierten Versionen *2000 , XP , 2003 , 2005 , Vista , 2008 , 7* funktionieren. *Ich selbst habe es auf 2k , 2k3 , XP Pro , XP Pro MCE 05 , Vista und 7 probiert*
Das ganze Paket besteht aus nur einer Klasse und einer DLL-Datei. Da auf der Hompage auch eine API-Doc zu finden ist wird das arbeiten damit sehr einfach.
Beispiel für Windows
Sagen wir mal wir möchten eine Verknüpfung auf dem Desktop erstellen welche eine in ein Jar gepackte Java-Applikation OHNE Consolen-Fenster startet. Was wir dafür brauchen ist recht wenig :
-den Pfad von Java
-den Pfad des Desktops
-den Pfad zum Jar *wir gehen hier in diesem Beispiel davon aus das das Jar unter user.home\appfolder\file.jar liegt*
Wenn wir das nacheinander abarbeiten sieht das ungefähr so aus
Java
Ganz wichtig hier das wir von java.home noch in das Unterverzeichnis BIN gehen.
Desktop
Jar
Wie können unserer Verknüpfung natürlich auch noch ein Icon mitgeben. Dafür braucht ihr unter Windows eine ICO-Datei. Am besten geeignet um aus einem vorhanden bild ein ICO zu machen ist GIMP. Einfach das Bild laden und dann mit Speichern Unter als ICO-File wieder speichern. Wichtig dabei ist das als Modus 32bpp 8Bit Alpha verwendet wird. Wenn wir eine ICO-Datei haben können wir als Index 0 verwenden.
Daraus können wir nun eine Desktopverknüpfung erstellen.
Dazu müssen wir erst ein neues Objekt der Klasse JShellLink erstellen und auf dieses dann verschiedene Methoden anwenden.
Nun sollten wir auf dem Desktop eine neue Verknüpfung haben die den gewählten Namen hat , auf javaw.exe zeigt , mit den nötigen Argumenten ausgestattet ist und das gewählte Icon hat.
Und wie funktioniert das ganze jetzt unter Linux ?
Nun ... unter Linux ist es sogar noch etwas einfacher als unter Windows.
In den meisten Linux-Distributionen werden Desktop-Verknüpfungen durch sog. .desktop-Files repräsentiert *änlich den LNK-Files unter Windows*. Da aber diese .desktop-Files im gegensatzt zu den den .lnk-Files unter Windows nur als text/plain bestehen ist es sehr einfach eine Verknüpfung zu erstellen.
Zunächst brauchen wir auch hier wieder die drei Pfade :
Auffallend hier : es gibt unter Linux kein javaw-Binary. Warum ? Nun , unter Linux wird ein Terminal nur angezeigt wenn man dieses auch anfordert. Wenn man jetzt also zum Beispiel aus einer anderen Java-Applikation eine neue starten will reicht es lediglich das java-Binary zu verwenden. Ein Terminal wird tortzdem nicht mitgestartet. *Was man jetzt machen muss um bei einem solchen aufruf ein Terminal zu erzwingen weis ich leider nicht.*
Achtung : es gibt auch einige Linux-Distributionen wo "Desktop" auch übersetz wurde *z.B. unter Fedora 15 heißt es ~/Arbeitsfläche*. Mich persönlich ärgert dieses Vorgehen des Distributoren da man so für jede Sprache ein locale bräuchte. Man sollte wenigstens die Kompatibilität erhalten und entweder ~/Desktop weiterverdenen oder zumindest ~/Desktop als soft-Link erstellen.
Für das App.jar gehen wir diesmal auch wieder von user.home/myapp/app.jar aus
Nach dem wir nun diese drei Informationen haben können wir uns an das zusammenbauen der desktop-Datei machen.
Auch hier können wir wieder ein Icon mit auf den Weg geben , allerdings untersützen die meisten Linux-Distributionen hier duetlich mehr Dateiformate als Windows. Also können wir beruhigt ein PNG nehmen.
Nun sollten wir auch auf Linux eine Verknüpfung haben welche den gewählten Namen hat , das gewählte Jar ausführt und das gewünschte Icon hat.
getestet unter : OpenSuSE 11.4 KDE / Gnome
wäre für weiteres Testen dankbar
So .. und nun noch für Mac ?
Tja ... da muss ich jetzt leider passen da ich keinen Mac besitze und nur dafür auch nicht zum Raubkopierer werden will. Zu mal ich nicht mal weis ob es Mac auch für i386 CPUs gibt ... ich kenne nur PowerPC-distributionen.
Ich wäre also dankbar wenn sich jemand die Mühe machen würde und hier den Code für Mac einfügen würde. Nach möglichkeit auch bitte ausgiebig testen.
Was ich außedem bräuchte : wie ruft man unter Mac das java-Binary auf ? Wie unterdrückt man das ein Terminal geöffnet wird wenn man aus anderen Applikationen einen Aufruf startet ? *siehe Unterschied win : java.exe vs javaw.exe*
Ich hoffe ich kann hiermit einigen helfen und das mir auch ein wenig geholfen wird was Mac angeht.
SPiKEe
Zum Thema allgemein
Jeder kennt das : wenn man etwas installiert , ganz gleich ob Spiel , Anwendung oder was auch immer , bekommt man von den meisten Installern die Möglichkeit eine Desktopverknüpfung anzulegen. Das kennt man so von Java nicht : entweder wird ein Launcher als Jar dierekt auf den Desktop gepackt , ein Batch- bzw Shell-Skript welches dann java mit den entsprechenden Parametern startet oder unter Windows auch gerne einen EXE-Wraper.
Geht es auch anderst ?
Ja. Es gibt möglichkeiten auch mit Java "native" Desktopverknüpfungen anzulegen.
Das funktioniert jedoch bei den unterschiedlichen Betriebssystemen jewils anderst.
Welche Möglichkeiten gibt es ?
Windows : eine der einfachsten Möglichkeiten unter Windows ist es dierekt die Windows eigenen Mittel zu verweden. Viele werden jetzt sagen : "Naja dürfte mit JNA nicht schwer werden." Das stimmt auch so weit ... aber es geht auch noch einen Tick einfacher mit JNI. Das zauberwort heißt JShortCut
JShortCut bietet uns eine Windows-DLL mithilfe der wir ganz einfach Verknüpfungen erstellen können. Auch haben wir über eine statische Methode die Möglichkeit spezielle Ordner zu suchen wie etwas den Desktop , den "Programme"-Ordner oder auch das Startmenü. Und da das ganze dierekt durch Informationen von Windows selbst gefüttert wird sollte das auf allen NT-basierten Versionen *2000 , XP , 2003 , 2005 , Vista , 2008 , 7* funktionieren. *Ich selbst habe es auf 2k , 2k3 , XP Pro , XP Pro MCE 05 , Vista und 7 probiert*
Das ganze Paket besteht aus nur einer Klasse und einer DLL-Datei. Da auf der Hompage auch eine API-Doc zu finden ist wird das arbeiten damit sehr einfach.
Beispiel für Windows
Sagen wir mal wir möchten eine Verknüpfung auf dem Desktop erstellen welche eine in ein Jar gepackte Java-Applikation OHNE Consolen-Fenster startet. Was wir dafür brauchen ist recht wenig :
-den Pfad von Java
-den Pfad des Desktops
-den Pfad zum Jar *wir gehen hier in diesem Beispiel davon aus das das Jar unter user.home\appfolder\file.jar liegt*
Wenn wir das nacheinander abarbeiten sieht das ungefähr so aus
Java
Java:
String javaPath=(new StringBuilder()).append(System.getProperty("java.home")).append(System.getProperty("file.separator")).append("bin").append(System.getProperty("file.separator")).append("javaw.exe").toString();
Desktop
Java:
String desktopPath=JShellLink.getDirectory("desktop");
Jar
Java:
String jarPath=(new StringBuilder()).append(System.getProperty("user.home")).append(System.getProperty("file.separator")).append("ApplikationsOrder").append(System.getProperty("file.separator")).append("JarFile.jar").toString();
Wie können unserer Verknüpfung natürlich auch noch ein Icon mitgeben. Dafür braucht ihr unter Windows eine ICO-Datei. Am besten geeignet um aus einem vorhanden bild ein ICO zu machen ist GIMP. Einfach das Bild laden und dann mit Speichern Unter als ICO-File wieder speichern. Wichtig dabei ist das als Modus 32bpp 8Bit Alpha verwendet wird. Wenn wir eine ICO-Datei haben können wir als Index 0 verwenden.
Daraus können wir nun eine Desktopverknüpfung erstellen.
Dazu müssen wir erst ein neues Objekt der Klasse JShellLink erstellen und auf dieses dann verschiedene Methoden anwenden.
Java:
JShellLink link=new JShellLink(); //neues JShellLink-Objekt erzeugen
link.setFolder(desktopPath); //Ort der Verknüpfung angeben
link.setName("App"); //Name der Verknüpfung angeben
link.setPath(javaPath); //Ziel der Verknüpfung
link.setArguments("-jar "+jarPath); //Argumente
link.setIconLocation("icon.ico"); //Icon
link.setIconIndex(0); //Icon-Index 0 *1tes Icon* falls mehrere vorhanden sind
link.save(); //Verknüpfung speichern
Nun sollten wir auf dem Desktop eine neue Verknüpfung haben die den gewählten Namen hat , auf javaw.exe zeigt , mit den nötigen Argumenten ausgestattet ist und das gewählte Icon hat.
Und wie funktioniert das ganze jetzt unter Linux ?
Nun ... unter Linux ist es sogar noch etwas einfacher als unter Windows.
In den meisten Linux-Distributionen werden Desktop-Verknüpfungen durch sog. .desktop-Files repräsentiert *änlich den LNK-Files unter Windows*. Da aber diese .desktop-Files im gegensatzt zu den den .lnk-Files unter Windows nur als text/plain bestehen ist es sehr einfach eine Verknüpfung zu erstellen.
Zunächst brauchen wir auch hier wieder die drei Pfade :
Java:
String javaPath=(new StringBuilder()).append(System.getProperty("java.home")).append(System.getProperty("file.separator")).append("bin").append(System.getProperty("file.separator")).append("java").toString();
Java:
String desktopPath=(new StringBuilder()).append(System.getProperty("user.home")).append(System.getProperty("file.separator")).append("Desktop").toString();
Für das App.jar gehen wir diesmal auch wieder von user.home/myapp/app.jar aus
Java:
String jarPath=(new StringBuilder()).append(System.getProperty("user.home")).append(System.getProperty("file.separator")).append("myapp").append(System.getProperty("file.separator")).append("app.jar").toString();
Nach dem wir nun diese drei Informationen haben können wir uns an das zusammenbauen der desktop-Datei machen.
Auch hier können wir wieder ein Icon mit auf den Weg geben , allerdings untersützen die meisten Linux-Distributionen hier duetlich mehr Dateiformate als Windows. Also können wir beruhigt ein PNG nehmen.
Java:
File file=new File(desktopPath+System.getProperty("file.separator")+"myapp.desktop"); //hier muss man darauf achten einen möglichst eindeutigen Namen zu wählen
//auch wäre eine Prüfung ob gewähltes File schon vorhanden ist sinnvoll
PrintStream out=new PrintStream(new FileOutputStream(file)); //einen PrintStream erzeugen um gequem über println(String) zeilenweise in das .desktop-File zu schreiben
out.println("[Desktop Entry]"); //für alle Distributionen : gibt an das jetzt der Block für eine Desktopverknüpfung beginnt
out.println("Name=MyAPP"); //Name der später angezeigt werden soll
out.println("Icon="+System.getProperty("user.home")+System.getProperty("file.separator")+"myapp"+System.getProperty("file.separator")+"icon.png"); //Icon mit absoluter Pfadangabe *kann vorher als Variable erzeugt werden*
out.println("Type=Application"); //Angabe das verlinktes File eine Applikation ist
out.println("Exec="+javaPath+" -jar "+jarPath); //Commando welches auszuführen ist , hier : java-Binary mit Parameter -jar und Angabe des auszuführenden Jar-Files
out.println("Terminal=false"); //Terminal-Fenster unterdrücken
out.println("StartupNotify=true"); //weis ich nicht wozu das gut ist , wird aber beim anlegen von verknüpfungen irgendwie immer auf true gesetz ... also füge ich es auch einfach so mit ein
out.close(); //PrintStream schließen
file.setExecutable(true); //Verknüpfung auf Ausführbar setzen
Nun sollten wir auch auf Linux eine Verknüpfung haben welche den gewählten Namen hat , das gewählte Jar ausführt und das gewünschte Icon hat.
getestet unter : OpenSuSE 11.4 KDE / Gnome
wäre für weiteres Testen dankbar
So .. und nun noch für Mac ?
Tja ... da muss ich jetzt leider passen da ich keinen Mac besitze und nur dafür auch nicht zum Raubkopierer werden will. Zu mal ich nicht mal weis ob es Mac auch für i386 CPUs gibt ... ich kenne nur PowerPC-distributionen.
Ich wäre also dankbar wenn sich jemand die Mühe machen würde und hier den Code für Mac einfügen würde. Nach möglichkeit auch bitte ausgiebig testen.
Was ich außedem bräuchte : wie ruft man unter Mac das java-Binary auf ? Wie unterdrückt man das ein Terminal geöffnet wird wenn man aus anderen Applikationen einen Aufruf startet ? *siehe Unterschied win : java.exe vs javaw.exe*
Ich hoffe ich kann hiermit einigen helfen und das mir auch ein wenig geholfen wird was Mac angeht.
SPiKEe
Zuletzt bearbeitet von einem Moderator: