Technologies internet


Web Start


Voir:

Introduction

Java Web Start est tout simplement un mécanisme qui permet de livrer un programme Java par l'entremise d'un serveur web. Activés par le fureteur, ces programmes sont déployés aux clients et exécutés à l'extérieur du fureteur. Après l'installation, ces programmes n'ont plus besoin d'être téléchargés. De plus, ces applications peuvent être mises à jour par un processus automatique sans que l'utilisateur n'ait besoin de tout télécharger et réinstaller à nouveau.

On pourrait croire qu'un risque d'utilisation frauduleuse existe puisque ces programmes sont exécutés à l'extérieur du fureteur. Mais il n'en n'est pas le cas, ces applications sont lancées à l'intérieur d'un contenant (SandBox) qui est très sécurisé. Si l'application essaie d'accéder quelque chose (fichier ou application) à l'extérieur de la SandBox, une fenêtre message apparaîtra. Celle-ci demandera les droits d'accès à l'utilisateur.

Pour exécuter des applications utilisant Java Web Start, il s'agit tout simplement d'installer le logiciel côté client.

Exemples

Installation de Java Web Start

Caractéristiques

Étapes pour déployer une application Java Web Start

Bien qu'elles soient faciles à utiliser, ces applications sont un peu plus difficiles à déployer et la distribution de celles-ci demande quelques manipulations.

Nous illustrons ce processus avec deux exemples.

Code source

Voici le code source de l'application The Time 1.

import java.awt.*;
import javax.swing.*;
import java.io.*;
import java.net.*;

public class TheTime {
  public static void main(String args[]) {
    JFrame frame = new JFrame("Time Check");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JLabel label = new JLabel();
    Container content = frame.getContentPane();
    content.add(label, BorderLayout.CENTER);
    String message = "missing";
    BufferedReader reader = null;
    try {              // port 13 = DAYTIME service
      Socket socket = new Socket("time.nist.gov", 13);
      InputStream is = socket.getInputStream();
      InputStreamReader isr = new InputStreamReader(is);
      reader = new BufferedReader(isr);
      reader.readLine(); // skip blank line
      message = reader.readLine();
    } catch (MalformedURLException e) {
      System.err.println("Malformed:" + e);
    } catch (IOException e) {
      System.err.println("I/O Exception: " + e);
    }
    finally {
      if (reader != null) {
        try {
           reader.close();
        }
        catch (IOException ignored) {
        }
      }
    }
    label.setText(message);
    frame.pack();
    frame.show();
  }
}
et le code source de l'application The Time 2.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.net.*;
import javax.jnlp.*;

public class TheTime {
  static BasicService basicService = null;
  public static void main(String args[]) {
    JFrame frame = new JFrame("Time Check");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JLabel label = new JLabel();
    Container content = frame.getContentPane();
    content.add(label, BorderLayout.CENTER);
    String message = "missing";
    BufferedReader reader = null;
    try {
      Socket socket = new Socket("time.nist.gov", 13);
      InputStream is = socket.getInputStream();
      InputStreamReader isr = new InputStreamReader(is);
      reader = new BufferedReader(isr);
      reader.readLine(); // skip blank line
      message = reader.readLine();
    }
    catch (MalformedURLException e) {
      System.err.println("Malformed: " + e);
    }
    catch (IOException e) {
      System.err.println("I/O Exception: " + e);
    }
    finally {
      if (reader != null) {
        try {
          reader.close();
        }
        catch (IOException ignored) {
        }
      }
    }
    label.setText(message);
    try {
      basicService = (BasicService)
                        ServiceManager.lookup("javax.jnlp.BasicService");
    }
    catch (UnavailableServiceException e) {
      System.err.println("Lookup failed: " + e);
    }
    JButton button = new JButton("http://java.sun.com");
    ActionListener listener = new ActionListener() {
      public void actionPerformed(ActionEvent actionEvent) {
        try {
          URL url = new URL(actionEvent.getActionCommand());
          basicService.showDocument(url);
        }
        catch (MalformedURLException ignored) {
        }
      }
    };
    button.addActionListener(listener);
    content.add(button, BorderLayout.SOUTH);
    frame.pack();
    frame.show();
  }
}

1. Compilation du code source avec un compilateur Java

javac TheTime.java
# ou bien, si TheTime.java utilise javax.jnlp.*
javac -classpath C:\Progra~1\Java~1\javaws.jar TheTime.java

Suite à la compilation vous obtenez un ou plusieurs fichiers .class.

TheTime.class
# ou bien, pour TheTime 2
TheTime.class, TheTime$1.class

2. Création du fichier .jar

Le fichier .jar contiendra tous les fichiers .class que vous avez créés suite à la compilation.

jar cf JNLPTime.jar TheTime.class
# ou bien, pour TheTime 2
jar cf JNLPTime2.jar *.class

La commande jar -tf affiche le contenu du fichier jar.

jar -tf JNLPTime.jar
META-INF/MANIFEST.MF
TheTime.class

# ou
jar -tf JNLPTime2.jar
META-INF/MANIFEST.MF
TheTime$1.class
TheTime.class

Pour plus d'information sur les fichiers .jar référez-vous à la documentation disponible en tapant :

jar --help

ou allez à http://java.sun.com/j2se/1.5.0/docs/guide/jar/index.html.

3. Création du fichier .jnlp

JNLP (Java Network Launch Protocol) exige un fichier (.jar) contenant l'application et un fichier (.jnlp) décrivant comment lancer cette application. Ce dernier est un fichier en format xml. Voici, ce à quoi un tel fichier doit ressembler.

<?xml version="1.0" encoding="UTF-8"?>
<jnlp spec="1.0+"
  codebase="http://w4.uqo.ca/iglewski/ens/inf4533/src/webstart"
>
<information>
  <title>Time Check</title>
  <vendor>Java Developer Connection</vendor>
  <homepage href="http://java.sun.com/jdc" />
  <description>Demonstration of JNLP</description>
</information>
<offline-allowed/>
<security>
  <j2ee-application-client-permissions/>
</security>
<resources>
  <j2se version="1.2+" />
  <jar href="JNLPTime.jar"/>
  </resources>
<application-desc main-class="TheTime" />
</jnlp>

Ce fichier nommé TheTime.jnlp, sera le fichier appelé par le lien que vous aurez inséré dans votre site web. Vous remarquerez que dans ce fichier un autre fichier est appelé :

: <a href="http://w4.uqo.ca/iglewski/ens/inf4533/src/webstart/TheTime.jnlp">The Time</a>

: <jar href="http://w4.uqo.ca/iglewski/ens/inf4533/src/webstart/JNLPTime.jar"/>

: JNLPTime.jar

4. Création d'un contenant de clés

keytool -genkey -keystore myKeys -alias jdc

5. Signature du fichier .jar

(le fichier .SF contient le certificat)

 jarsigner -keystore myKeys JNLPTime.jar jdc
 jar -tf JNLPTime.jar
 META-INF/MANIFEST.MF
 META-INF/JDC.SF
 META-INF/JDC.DSA
 TheTime.class

6. Configuration du serveur Web (Apache)

Récapitulation

1- Création du fichier .class
2- Création du fichier .jar
3- Création du fichier .jnlp
4- Création d'un contenant de clés.
5- Signature du fichier .jar
6- Configuration du serveur web.

Exemple de script.