Cet article est paru dans le magazine
francophone consacré à Linux et aux
logiciels libres n°35 (janvier 2002).

©2002
Editions Diamond


Intégration Java-Linux côté client

Cet article a pour but de montrer les possibilités d'intégration des applications Java dans un environnement utilisateur tournant sous Linux.

Les qualités du SE Linux ne sont plus à démontrer. Après s'être imposé côté serveur, il commence à se généraliser sur les bureaux grâce à la disponibilité de nombreuses applications conviviales. Java, après un début en fanfare dans les navigateurs, est surtout devenu aujourd'hui le langage principal de développement d'applications coté serveur. La situation tend aujourd'hui à se rééquilibrer avec de nombreuses applications de qualité, souvent libres, et un nombre croissant de paquets disponibles dans les distributions.

Installation

Java est une plate-forme, composée d'une machine virtuelle (MVJ), de nombreuses bibliothèques (IPA) et d'un langage de programmation, bien que les applications Java puissent être écrites dans une bonne centaine d'autres langages (Eiffel, Python, Ada, ...) [1].

La plate-forme Java est disponible en plusieurs versions, mais deux sont principalement utilisées.

JRE 1.1.8

Ce Java Runtime Environment date de quelques années mais reste largement utilisé en raison de sa plus faible consommation de ressources et surtout de sa licence. Vous trouverez en général la version de Sun Microsystems sous forme de paquet pour votre distribution, ainsi que Kaffe, une version libre, LPG, développée par Transvirtual. Pour les utilisateurs chanceux de Debian, apt-get install jdk11 suffit. Certains pourront aussi télécharger la version d'IBM [2], un peu plus rapide.

JRE 1.3.1

Ce Java Runtime Environment est le dernier sorti (en version stable, le 1.4.0 étant disponible en beta). Vous trouverez une archive tar.gz gratuitement téléchargeable sur java.sun.com à décompresser dans /usr/local/ et il convient de rajouter ensuite /usr/local/jdk1.3.1/bin dans son PATH (un RPM est aussi disponible). Sa licence plus contraignante empêche le développement d'alternative libre, bien que la MVJ Kaffe combinée avec la dernière version du projet Classpath procure une certaine compatibilité. IBM a aussi développé sa version[3].

Programmation

Pour ceux qui veulent programmer, le Java Development Kit procure, en plus du JRE, un compilateur pour le langage Java. IBM a aussi développé Jikes [4], un compilateur très rapide et libre. Mais cet article ne traite pas de la programmation en Java même si du code apparaîtra plus loin à titre d'illustration.

Applets

Le support de Java dans les navigateurs est en général limité au JRE 1.1. Il est toutefois possible d'installer un greffon, nommé Java Plugin [5] et procurant la compatibilité avec le JRE 1.3. Celui-ci est disponible sur le site de Sun Microsystems. Par ailleurs, Star Office dispose aussi d'un support pour les applets.

Java Web Start

Java Web Start [6] est un petit logiciel permettant de lancer une application Java en cliquant sur un lien dans son navigateur. L'application est décrite dans un fichier XML suivant le protocole JNLP. Il est ainsi possible d'essayer de nombreuses applications très simplement (catalogue C&W [7]). Il existe deux alternatives libres et compatibles, JavaUrl [8] et OpenJNLP [9].

Configuration

Exécutables

Les fichiers *.class contiennent le code compilé. Il est possible de les rendre directement exécutables au niveau du shell en chargeant le module binfmt_java dans le noyau Linux 2.2. On pourra rendre aussi les fichiers *.jar (qui sont des archives de .class) exécutables. Il sera toutefois nécessaire de modifier le module existant ou d'écrire son propre module, ce qui est dans ce cas, relativement simple.

On pourra alternativement faire les associations adéquates au niveau du gestionnaire de fichiers:

.class avec jx.sh %s
.jar avec java -jar %s

jx.sh est le script suivant (à améliorer):

#!/bin/bash
c=`basename "$1" .class`
d=`dirname  "$1"`
shift
java -classpath $CLASSPATH:$d $c $*

Dans les deux cas, la solution ne fonctionne avec un fichier .class que s'il s'agit d'une classe non empaquetée (càd sans paquet, au sens java). Sinon, il faudrait récupérer le nom complet de la classe. Dans le cas du compilateur standard javac, il est stocké dans la table des constantes. Une bibliothèque comme la gnu.bytecode ou le programme javaclassname fourni dans la documentation du noyau 2.4 permettent de l'en extraire. D'autre part, il apparaît que Jikes l'enregistre à partir de l'octet 16.

Les choses sont plus faciles avec le noyeau 2.4 qui fournit un support générique pour tous les interprêteurs sous la forme du module binfmt_misc. La documentation (fichiers binfmt_misc.txt et java.txt) fournit toutes les informations pour rendre exécutables les fichiers *.class et *.jar. Il suffit de les enregistrer par:

echo ':Class:M::\xca\xfe\xba\xbe::/usr/local/bin/javawrapper:'
>/proc/sys/fs/binfmt_misc/register
echo ':Jar:E::jar::/usr/local/bin/jarwrapper:'
>/proc/sys/fs/binfmt_misc/register

javawrapper est listé dans la documentation et où jarwrapper est le script suivant:

#!/bin/bash
/usr/local/jdk/bin/java -jar $*

Polices

Les polices de caractères fournies avec la MVJ 1.2 et supérieure de Sun Microsystems ne sont pas toujours du meilleur effet sous XFree. En effet, si le JRE 1.1 utilisait des polices X, le JRE 1.2+ dispose d'un support pour les polices TrueType. La configuration des polices s'effectue dans les fichiers font.properties et fonts/fonts.dir du répertoire /usr/local/jdk/jre/lib/. Le premier fait le lien entre les noms et encodages Java et X11. Le second fait le lien entre les noms X11 et les polices TrueType. Ce dernier peut être aisément modifié pour remplacer les polices par défaut par d'autres plus sympathiques. La police --symbol-* étant souvent absente, on pourra commenter les lignes y faisant référence pour éviter les avertissements au démarrage. Il existe aussi un fichier psfont.properties qui permet de contrôler précisément les polices utilisées à l'impression.

Aspect visuel

Si au début les applications Java utilisaient les contrôles Motif, la plupart (mais encore rarement les applets) utilisent aujourd'hui la bibliothèque Swing qui est très riche et surtout indépendante du SE sous-jacent. Par défaut, un aspect particulier, appelé Metal est utilisé. Mais il est tout à fait possible d'en changer. Les utilisateurs de KDE et Gnome seront en particulier intéressés par les trois Look and Feel SkinLF [10], SLAF [11] et GTK/Swing [12]. Le premier permet d'appliquer n'importe quel thème GTK ou KDE bien formé à une application Java. Les deux autres se limitent aux aspects par défaut.

Ceci peut être fait en quelques lignes de code Java:

import com.memoire.slaf.*;
SlafLookAndFeel lnf=new SlafLookAndFeel();
lnf.setCurrentTheme("gtk");
UIManager.setLookAndFeel(lnf);

ou bien, sans toucher au source, en utilisant la commande suivante:

#!/bin/bash
java -cp slaf.jar:$CLASSPATH \
com.memoire.slaf.Slaf -theme mon_theme mon.appli
# où mon_theme vaut gtk, gnome ou kde

La méthode est similaire pour SkinLF, mais il faut d'abord charger le thème avec loadSkin puis l'appliquer avec setSkin.

Intégration

Copier / Coller

Le copier/coller sous Linux entre une application native et une application Java fonctionne mais reste limité à du texte dans l'attente d'un protocole plus riche au niveau de X.

// Récupération d'une référence sur
// le presse-papiers de X
Clipboard clipboard = getToolkit()
  .getSystemClipboard();

// Copier (affectation du contenu)
clipboard.setContents(new StringSelection
  ("mon texte"),null);

// Coller (récupération du contenu)
String selection=(String)clipboard
  .getContents(this).getTransferData
    (DataFlavor.stringFlavor);

Tirer / Lâcher

Le tirer/lâcher est assez instable et entraîne souvent le plantage de la MVJ. De plus il est limité aux applications Motif, en attendant que les trois environnements Motif, Gnome et KDE unifient leur système. En gros, à part faire glisser des URL depuis Communicator, il n'a qu'assez peu d'intérêt dans son état actuel.

Une meilleure solution serait de charger le code du Drag-and-drop de Gnome dans la MVJ via JNI et de définir le lien avec les interfaces existantes.

Utiliser GTK

Une solution pour résoudre ces problèmes consiste à ne pas utiliser les composants Motif ou Swing mais les composants GTK. De la même manière que GTK peut être utilisé dans des programmes écrits en Python, en Perl et dans une dizaine d'autres langages, il existe des bibliothèques libres [13] [14] faisant le lien entre Java et GTK. Toutefois, le code devient ainsi très lié au couple SE/processeur, ce qui explique l'usage limité de cette solution, les développeurs Java étant souvent attachés à la portabilité.

Communiquer

Java fournit en standard depuis le JDK1.2 le support de CORBA, bus distribué et normalisé multi-langages. Mais il existe aussi des implantations pour le JDK1.1, y compris libres (comme l'excellent JacORB 1.3 [15]). Or Gnome dispose d'un bus CORBA dénommé Orbit et tous les composants sont des objets disposant d'interfaces CORBA définis dans /usr/share/idl. Il est donc possible d'accéder à leurs données et d'appeler leurs méthodes, autrement dit de commander l'ensemble des applications Gnome. En particulier, un programme Java peut transférer des données depuis Gnumeric, activer les applets du panel, envoyer un courrier avec Balsa, ...

Si KDE devait au départ disposer d'un support CORBA, KDE 2 a définitivement choisi une autre solution, DCOP. Il devrait toutefois y avoir un pont vers CORBA. Il en existe surtout déjà un vers XMLRPC. Il s'avère alors très simple de commander les applications KDE puisqu'il suffit d'établir une connection HTTP et d'y écrire du XML (ou d'utiliser directement un client XMLRPC). L'inverse est aussi possible car il existe une version alpha de DCOP pour Java mais aussi de nombreux serveurs XMLRPC.

En conclusion, cet article a montré dans sa première partie comment installer au mieux une MVJ sur un poste client Linux et donner à son utilisateur l'accés aux nombreuses applications disponibles. La seconde partie concernait plutôt l'intégration d'une application Java dans un bureau, qu'il s'agisse de Gnome ou de KDE.

____
Guillaume Desnoix
Août 2001, révisé Décembre 2001
GLOSSAIRE RÉFÉRENCES
  1. Langages for the JVM, grunge.cs.tu-berlin.de/~tolk/vmlanguages.html
  2. IBM JRE 118, www-106.ibm.com/developerworks/java/jdk/118/linux/
  3. IBM JRE 130, www-106.ibm.com/developerworks/java/jdk/linux130/
  4. Jikes, www10.software.ibm.com/developerworks/opensource/jikes/
  5. Java Plug-in, java.sun.com/products/plugin/
  6. Java Web Start, www.javawebstart.com
  7. C&W catalog, www.connectandwork.com/external/
  8. JavaUrl, www.amherst.edu/~tliron/javaurl/
  9. OpenJNLP, openjnlp.sourceforge.net
  10. SkinLF, javootoo.l2fprod.com/plaf/skinlf/
  11. Slaf, www.memoire.com/guillaume-desnoix/slaf/
  12. Gtk/Swing, gtkswing.sourceforge.net
  13. Java-Gnome, java-gnome.sourceforge.net
  14. Gtk-j, www.l2fprod.com/software/gtkj/
  15. JacORB, www.jacorb.org
Ring
Million Dollar Desktop Screenshot, Nashville, Moscow, Beverage, , ...