Integration von Java-Jars in Gui-Shells (Windows, KDE?, ...)

Die Idee

Seit Java 2 fühlen sich Java-Applikationen in Jars ein wenig wie normale Applikationen an. Sie lassen sich z.B. im Windows Explorer einfach starten, ähnlich in anderen Betriebssystemen und deren Desktopumgebungen.

Ziel des Projekts ist bessere Integration von Java-Applikationen in den Desktop, zum Beispiel die Darstellung in der Shell (Explorer, Konqueror, ...).

Icon
Bisher wurde stets ein eher langweiliges Icon wie z.B. the windows jar icon oder a *nix jar icon verwendet. Nun kann ganz leicht ein applikationsspezifisches Icon verwendet werden, was bisher nur für einen Link auf das Jar realisiert werden konnte. Zudem wird das spezifische Icon im Jar vorgehalten, so das man nur noch das Jar ausliefern muß. Links auf das Jar erhalten nun unter Windows automatisch das spezifische Icon.

List of jars with different icons

 

Type: Executable Jar File
Size: 33KB.

Tooltip
Weiterhin kann man eine Beschreibung angeben welche dann von der Shell z.B. als 'Tooltip' oder in der Statuszeile angezeigt werden kann. Hier werden bisher üblicherweise recht wichtige Informationen angezeigt.

jMineSweeper
a great variation of the game.
© 2003 www.peterbuettner.de

Nun kann man irgendeine unsinnige Beschreibung zum Jar verwenden. Falls die Shell es ermöglicht, sollten die neuen Informationen sinnvollerweise zusammen mit den alten dargestellt werden.

 

Drag'n Drop
Im Sinne das man z.B. im Explorer Dateien auf das Jar fallen lassen kann, dieses wird dann mit den Dateinamen als Parameter gestartet. Ausserdem kann man nun - unter Windows - Jars im SendTo Ordner deponieren und per Kontextmenü aus dem Explorer Dateien mit dieser Anwendung öffnen.

Versionsinformationen
Hier kann der Entwickler weitere Informationen ablegen: VersionsNr, Copyright, Technische Beschreibung, Urls für Support, Sprache ... . Gedacht um verschiedene Versionen sicher zu unterscheiden, für einfachen Support auch wenn sich die Anwendung nicht starten lässt.


Dies kann und sollte natürlich auch für andere Betriebssysteme/Desktopumgebungen implementiert werden.

Wie geht's:

Man fügt dem Jar einfach Icons oder Textdateien in bestimmter Weise hinzu und sie werden angezeigt.
Hier die aktuelle Spezifikation wie und welche zusätzlichen Informationen im Jar gespeichert werden können.

Eine zweite Implementierung für Windows

Die Spezifikation habe ich für Windows zum grössten Teil implementiert, durch eine Reihe von Shell Erweiterungen. Diese Erweiterungen werden mit dem Dateityp 'jarfile' in der Registry verbunden, so werden Benutzerwünsche respektiert, z.B. *.jar mit einem Ziptool zu öffnen.

Aktuell wird Unterstützt:

  • Icon, unter XP auch mit Alpha-Kanal
  • Description als Tooltip
  • Version
  • Drag&Drop: Dateien im Explorer auf das Jar 'fallen lassen'; dadurch auch 'SendTo Ordner'
  • Startoptionen bei z.B.: Drag&Drop, Parameterübergabe über temp.Datei

Beschränkungen: Beim Datei-Drop wäre anzumerken, das maximal etwa 2000 Zeichen (Win2k) in die Kommandozeile passen. 2000 Zeichen sind bei langen Pfadnamen nur wenige Dateinamen (Bsp: 130 je => 15 Dateinamen). Die Grenze erscheint auch bei allen anderen Programmen, ausser sie verwenden DDE.
Die 2000 Zeichen bei Win2k, bei Win9x nur ~500 Zeichen sind reine Empirie. Laut msdn sind mit der API-Funktion CreateProcess 32k möglich,der Explorer verwendet wahrscheinlich die API-Funktion ShellExecute welche nur nur diese wenigen Zeichen erlaubt.

Auch können z.Zt. keine Unicode Zeichen auf der Kommandozeile übertragen werden da java/javaw die Kommandozeile nicht entsprechend interpretieren. Umlaute und alle anderen Zeichen des Ansi Zeichensatzes sind möglich, keine chinesischen, arabischen etc. Zeichen in Dateinamen.

Man kann beim FileDrop die Namen wie in der Spezifikation über eine temporäre Datei übergeben, wodurch diese Beschränkungen von Länge und Zeichensatz aufgehoben werden. Dies ist erprobt bis rund 23.000 Dateinamen mit zusammen 1,6MB Länge. Lediglich der Explorer braucht recht lange (>20s, Athlon XP1700+) diese Liste zusammenzustellen.

Es wird beobachtet, das manchmal ein falsches Icon dargestellt wird. Dieser Effekt tritt auch bei anderen solcher Shell Extensions auf, was darauf hinweist das es ein Windows-Problem ist. In 'normalen' Ordnern habe ich es nicht beobachtet, nur im Startmenü und selten auf dem Desktop. Hier hätte ich möglicherweise einen Lösungsansatz den ich in der nächsten Zeit überprüfen werde.

Die 'Tooltips' sollten ab Win98/2000 bzw. (Win95/NT + IE4: shell32.dll Version 4.71) angezeigt werden.

Jars mit Unicodenamen werden behandelt als wären keine Shell Metainformationen enthalten, dies wird in einer nächsten Version behoben sein.

Technik: Realisierung mit Windows Shell Extension. Die Shell fragt die Extension für jedes Jar nach einem passenden Icon oder Tooltip. Geschrieben ist es in C/C++, die info-zip lib ist statisch dazugelinkt, so daß keine weiteren Dlls gebraucht werden.

Download: Experimenteller code, keine Garantien, Version 0.2 Fertige dll Download jarshell.zip 94KB gezippt.

Beispiele: Die Erweiterungen unterstüzende jars:

  • jMineSweeper meine Version des Spiels: Icon (+ alpha channel), Description, Version.
  • StartParam (im zip dabei): Zeigt die übergebenen Parameter in einer Liste, incl. Source: Description, Version, File-Drop: auch über temp Datei und stdin.

Warum gerade so?

Vieles kann man auf unterschiedliche Art und Weise lösen. Ich wollte es einfach, aber funktionierend, wenig Kollision mit dem Sun/IBM/... Java Paket. Alles was bisher funktionierte sollte es auch mit den hier beschriebenen Erweiterungen tun. Ausserdem soll es leicht portierbar sein und für Entwickler leicht anwendbar, also nur ein Iconformat (keine png,xpm,gif,...).

Einiges wurde in der Newsgroup de.comp.lang.java besprochen, für die guten Anregungen und Verbesserungen möchte ich mich hier bedanken.

Es ist davon auszugehen das eine Shellerweiterung die Daten immer nur einzeln benötigt, also erst mal das Icon, einige Zeit später vielleicht einen Text. Die Ablage sollte also kleine Informationsstücke einfach und schnell zur Verfügung stellen, es wird nichts zwischengespeichert damit man nicht unnötig Speicher verbraucht.

Die Daten werden alle unterhalb des Verzeichnisses '/shell-meta-inf/' im Jar abgelegt. Ich habe mich gegen das Verzeichniss /meta-inf/ entschieden da es 'Sun-Bereich' ist. Ebenso gegen die Verwendung von /meta-inf/manifest.mf, wo hier hinzukommt das das Manifest bei signierten Klassen recht groß werden kann, was dann alles geparst werden müsste.

Die Daten sind zumeist zeilenorientierte Textdateien in der Form 'name=value'. Vom xml Format habe ich wegen des dann nötigen Xml-Parsers abgesehen.

Weitere Bildformate ausser Windows-Icon: ich dachte mal es wäre eine gute Idee. Man lasse es eher bleiben, denn es kompliziert den zu portierenden Teil, führt zu mehr C/C++ Code. Es ist wohl besser bei der schreibenden Rolle (Icon-Generator) mehr Intelligenz zu investieren um die lesende Seite einfacher zu halten.

Eigentlich bieten Windows-Icons auch alles was man braucht, auch welche mit Alpha-channel sind möglich. Es gibt genügend Icon-Editoren, deshalb sollte man dieses alteingesessene Format einfach verwenden. Ein freier Icon Editor der auch solche mit alphachannel erzeugen kann ist z.B. '@icon sushi'. Er startet unter Linux/Wine, allerdings habe ich es unter Linux nicht ausführlich getestet.
Da das .ico Format mit seinen Bitmaps recht vielfältig sein kann, sollte man es wohl auf die unkomplizierten und unkomprimierten Bitmaps mit 1,4,8,24,32 Bit Farbtiefe beschränken.

Wo geht's hin

Kleinen Installer verwenden.

In andere Umgebungen portieren.

Mit der Runtime ausliefern lassen.

Andere Erweiterungen

Für Windows gibt es noch einige Shell Extensions die man realisieren könnte, wobei mir allerdings wenig Verwendungszweck einfällt. Andere Plattformen bieten vielleicht noch andere Erweiterungen an.

Drop handler: Das Drag'n Drop unter Windows leistet noch mehr, man kann auch beliebige Daten - Texte, Bilder oder was auch immer - direkt aus einer Anwendung auf eine Datei im Explorer fallen lassen. Zugegeben, das implementieren recht wenige Anwendungen für ihre Dateitypen. Hierfür könnte man im Jar konfigurieren welche Datentypen es annehmen kann . Es wäre vorstellbar einen Marker zu definieren, womit dann das Jar gestartet wird; ähnlich der anderen 'Start Options' wie in obengenannter Spezifikation beschrieben. Es würde eine temporäre Datei angegeben in welcher die Daten liegen.

Properties handler: Da kann man per Dialog Dinge mit dem Jar anstellen lassen. Die obengenannten Versionsinformationen werden hiermit angezeigt. Es wäre eine Idee - optional für Entwickler - eine weiter Eigenschaftsseite mit Zugriff auf das Manifest sowie weiteren Informationen zum Jars anzuzeigen, leichtes starten des Jars mit einem Ziptool. Weitere Vorschläge?

Thumbnail example

Thumbnail Image Handler: Hier zeigt Windows oder auch Kde eine größere Vorschau (~120x120) auf die Dateien. Man sehe sich mal unter Windows einen Ordner an in dem einige html Dateien liegen und schalte die Ansicht auf Miniaturansicht. Hier z.B. eine Vorschau auf die aktuelle Html-Seite.

Dies ist eher gut für Dokumente, für Anwendungen sehe ich hier erstmal kaum Sinn. Nun, vielleicht ein Mail-Programm das die Anzahl der Mails anzeigt? Man könnte ein größeres Icon anzeigen lassen, vielleicht eine Vorschau auf ein Anwendungsfenster.
Im Extremfalle könnte man eine Java Virtual Machine starten und eine Vorschau auf die Daten geben. Hier müsste man dann die VM aber mit sehr eingeschränkten Rechten starten, sonst ist das zu gefährlich: man kopiert ein Jar in den falschen Ordner, es wird angezeigt und schon wird Code aus dem Jar mit Benutzerrechten ausgeführt.

 

Menu handler: Hier kann man aus dem Explorer/Shell-Kontextmenü Aktionen starten. Aber wofür? Anbieten das der Entwickler im Jar Menüpunkte konfiguriert, die dann den Start mit bestimmten Parametern anstösst?

JRE Versions Auswahl: Ähnlich wie in Webstart könnte man vorgeben, welche Java Version benötigt wird. Dazu evtl. ein optionaler Download der Jre. Soweit ich mich erinnere, gibt es einen OpenSource Webstart clone von welchem man den code dazu leihen könnte. Allerdings muss man dann in den Start von Javaanwendungen eingreifen, diesen Schritt möchte ausklammern, er sollte den 'grossen' Organisationen Sun, IBM ... vorbehalten bleiben. Innerhalb einer Organisation, Firma, etc. ist solch eine Erweiterung durchaus denkbar. Evtl, könnte man eine eigene Dateierweiterung (z.B.: jexe) hernehmen und mit einem eigenen Starter versorgen.

Alternativen

Einige Möglichkeiten des gerade vorgestellten Ansatzes lassen sich auch mit anderen Methoden erreichen, mit unterschiedlichen Vor- und Nachteilen. Zwei mir bekannte möchte ich hier kurz ansprechen, weitere Vorschläge sind willkommen.

Exe header

Gemeint ist ein kleines Executable mit dahinterkopiertem Jar. Das Executable startet dann javaw mit diesem Verbund: javaw -jar ExeUndJar.exe. Hiermit hat man dann Icons und kann auch Dateien 'darauf fallenlassen'. Da gibt es im Netz schon Beispiele.

Nachteil ist, das sich jeder Java-Entwickler evtl. etwas neues aneignen muß, dazu braucht man für jedes Betriebssystem eine eigene Version des Headers. Vorteil ist, das der Endbenutzer nichts installieren muß.

Webstart

Da gibt es ja bereits Webstart.

Webstart ist wohl eher auf zentrale Ablage von Programmen ausgerichtet, es erfolgt eine meiner Meinung nach etwas unkontrollierte Aktualisierung der Programmdaten auf den Clients.
Der auf dieser Seite vorgestellte Ansatz zielt eher auf traditionelle Programme, solche die vom Benutzer installiert/kopiert werden und dann nur durch den Benutzer gesteuert verändert werden. Eine Desktopintegration im Sinne von File-Drop, Tooltips und anderem bietet Webstart nicht, Icons mit unterschiedlichen Größen/Farbtiefen werden anscheinend auch noch nicht unterstützt.

Vergleich: JarShell/Exeheader/Webstart

Der Vergleich ist nur ein erster Ansatz. Was auf anderen Plattformen als Windows möglich ist kann ich nicht beurteilen. Bei 'modernen' Desktops wie Mac-OsX, KDE oder Gnome könnte ich mir ähnliche Möglichkeiten vorstellen

  JarShell Exeheader Webstart
Installation auf Client nötig (~150kB) nicht nötig nötig (1-2MB), kommt ab JRE-1.4 mit
Aufwand für Entwickler Dateien ins Jar aufnehmen eins von:
  • C kompilieren
  • Resourcen Editor verwenden
  • In 'anderes' Produkt einarbeiten
JNLP erstellen
Plattform-
abhängigkeit
Für alle OS dasselbe Jar Für jedes OS anderes Executable Für alle OS dasselbe Jar
Fähigkeiten, Plattform-
abhängig
  • Icon
  • DropFiles
  • Tooltips
  • Versioninfo
  • (Data-Drop)
  • Icon
  • DropFiles
  • Icon
  • einfach ins Startmenü

© 15. September 2003 Peter Büttner