Java Webstart

images/blackbelt.png

Java WebStart était un ensemble de mécanismes qui permettaient de déployer du code java à distance.

La principe est en voie d’obsolescence: il y a trop de problèmes potentiels avec les jars modulaires. Il est probable qu'à l’avenir une technologie de remplacement (jars multi-modules?) sera disponible … restez à l’affut!

En attendant voici quand même une présentation.

Sur une machine sur laquelle Java est correctement déployé il est possible de faire traiter des descriptifs jnlp. Ce traitement déclenchera un chargement d’archives jar depuis un site web spécialement configuré.

On aura donc sur le site client un fichier jnlp (qui sera être traité par l’environnement -sinon par l’application javaws-) et sur le site WEB une configuration qui permettra de traiter les demandes de chargement.

Introduction

Configuration minimum du serveur web

Il faut que le serveur reconnaisse le type MIME et sache reconnaitre jnlp.

Ceci dépend du système de configuration du serveur.

Par exemple dans le fichier mime.types de Apache :

application/x-java-jnlp-file          jnlp

Exemple de ressource JNLP

Sur le poste client soit le fichier mag.jnlp :

<?xml version="1.0" encoding="iso-8859-15"?>
<!-- fichier  lancement jnlp -->
<jnlp
  spec="6.0+"
  codebase="http://www.maboite.com:8080/mag/"
  href="mag.jnlp">
  <information>
    <title>Application MAG</title>
    <vendor>MaBoite</vendor>
    <description>application de gestion de magasins</description>
    <offline-allowed/>
  </information>
  <resources>
    <j2se version="1.6+" />
    <jar href="magMain.jar"/>
    <jar href="magComposants.jar"/>
    <jar href="magCore.jar"/>
    <jar href="magDeploy.jar"/>
    <jar href="magSimul.jar"/>
  </resources>
  <application-desc main-class="com.maboite.mag.Main"/>
</jnlp>

On notera que les descriptions "interne" au jar maître (ici magMain.jar) sont dupliquées de manière externe dans le protocole: nom de la classe main, jars dépendants. (on peut aussi décrire <jar href="magMain.jar" main="true"/> ).

La description :

<offline-allowed/>

permet ici de démarrer l’application même si le serveur est inaccessible (à la condition bien sûr que le chargement initial ait pu s’opérer au moins une fois!).

[Note]

Le descriptif jnlp peut également être accédé au travers d’une URL

javaws http://www.maboite.com:8080/mag/ mag.jnlp

ou même directement en passant l’URL à un navigateur.

[Note]

Si on a un descriptif jnlp sur la machine locale il est possible de distinguer deux fichiers jnlp distincts: celui sur le serveur et celui sur le client.

On notera que la version "serveur" n’a pas besoin d’information comme son propre nom ou de propriétés comme "offline allowed". Il est même possible d’avoir une version "client" sans les ressources (donc sans spécifications des jars -ce qui faciliterait la maintenance-) mais, dans ce cas, si on est hors-ligne l’application ne fonctionnera plus. (L’idéal serait d’arriver à mettre à jour dynamiquement le fichier jnlp "client").

Format compressé

Pour réduire la charge réseau il est possible d’utiliser un format de jar hyper-compressé via l’utilitaire pack200.

Procédure simplifiée :

  • Créer un jar compressé :

    pack200 magMain.jar.pack.gz magMain.jar

    va créer un fichier de nom magMain.jar.pack.gz de taille réduite (penser à des options qui retirent les informations de debug).

  • Ces jars compressés pourront être déployés sur le serveur.

    Il faut alors ajouter au descriptif jnlp

    <property name="jnlp.packEnabled" value="true"/>

    (dans le bloc <resources>)

Gestion de versions

Pour optimiser les mises à jour et faire en sorte que l’on ne charge que les modifications nécessaires on peut gérer des versions de jar.

  • coté serveur il faut renommer les jars en leur adjoignant un numéro de version .

    magMain__V1.1.jar

    (donc convention <nom>__V<numero_version>.jar)

  • coté descriptif jnlp modifier les champs de <resources>

    <jar href="magMain.jar" main="true" version="1.1"/>
    <jar href="magComposants.jar" version="2.0"/>
    <property name="jnlp.versionEnabled" value="true"/>

Sécurité

Dans la mesure où l’on s’inscrit dans une logique de codes chargés au travers du réseau toutes les opérations qui rentrent dans le domaine des opérations "protégées" par le système de sécurité sont proscrites (un peu comme pour les applets).

Si les codes ont besoin de droits de sécurité il faudra alors signer les jars (voir documentation) et allouer des droits de sécurité.

Par exemple dans descriptif jnlp :

<security>
      <all-permissions/>
</security>

Pour les entreprises qui souhaitent établir des règles de chargement voir également: la configuration des règles de téléchargement