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.
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.
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(); } }
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
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.
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
keytool -genkey -keystore myKeys -alias jdc
(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
/etc/httpd/conf //répertoire apache-mime.types //nom du fichier application/x-java-jnlp-file JNLP //ligne à ajouter
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.