Page d'accueilFindIt !ContactAstuces JavaLes notions de base

Astuces JavaTM

Astuces Java

Tip

 Créer un exécutable et un installateur Windows

Contexte
Téléchargement des outils
Programme de test
Launch4j
Inno Setup
Script Ant

 

Niveau : débutant/initié
Compatibilité : Java sous Windows

Contexte

Comment créer un exécutable Windows à partir de mes fichiers .class ?

C'est la grande question que se posent tous les débutants en Java ! Cette astuce vous propose de découvrir comment la résoudre, et même d'aller plus loin, en vous montrant comment créer un programme d'installation de votre programme qui affranchira vos utilisateurs d'installer Java.
Comme Sun Microsystems ne propose aucune solution standard dans Java, nous utiliserons les outils gratuits Launch4j et Inno Setup dont les licences vous autorisent à créer des exécutables pour des produits qui peuvent être éventuellement commerciaux. Par ailleurs, pour automatiser cette tâche, nous aurons recours à Ant qui est une sorte de Makefile pour Java en bien plus simple.

Note : la mise en oeuvre de cette solution ne vous empêche de déployer aussi une version de votre programme sous la forme d'un fichier Jar exécutable ou d'une application Java Web Start, pour les utilisateurs d'autres systèmes ou pour ceux qui ont installé Java. C'est d'ailleurs la solution qui a été retenue pour la distribution de Sweet Home 3D, une application d'aménagement d'intérieur Open Source créée par eTeks.

Téléchargement des outils

Voilà la liste des outils que vous devez télécharger puis installer :

A cette liste, s'ajoute bien sûr votre programme Java, constitué d'un ensemble de fichiers sources .java (dont l'un au moins contient une méthode main) et éventuellement de fichiers en ressource et de bibliothèques non standards Java.

Programme de test

Pour simplifier la présentation de cette astuce, nous considérerons que votre programme n'a pas recours à des ressources et/ou des bibliothèques non standards. A vous d'adapter le script Ant proposé si nécessaire, mais cela devrait être simple.
Voici donc le programme qui nous servira de test :

class Bienvenue {
public static void main (java.lang.String [] args) {
javax.swing.JOptionPane.showMessageDialog(null, "Bienvenue");
}
}

Comme vous le voyez, rien de bien compliqué ! Ce programme affiche simplement une boîte de dialogue contenant le texte Bienvenue puis s'arrête une fois que l'utilisateur a cliqué sur le bouton Ok de cette boîte (il est rappelé au passage que pour utiliser le look and feel du système en cours, il suffit d'ajouter l'instruction UIManager.setLookAndFeel (UIManager.getSystemLookAndFeelClassName()); en début de programme).

Bienvenue

Enregistrez cette classe dans fichier Bienvenue.java, sous le dossier src du projet Bienvenue, et créez la première partie du script Ant build.xml qui permettra de compiler cette classe dans le dossier classes, puis de créer un fichier Bienvenue.jar dans le dossier install/lib (ce qui au passage, n'a rien d'obligatoire, mais même si nous travaillons sur un programme simple, cela n'empêche pas de s'organiser correctement...) :

<project basedir="." default="build" name="Bienvenue">
<target name="build">
<!-- Création du dossier classes -->
<mkdir dir="classes"/>

<!-- Compilation des classes du programme -->
<javac srcdir="src" destdir="classes" />

<!-- Création du dossier install -->
<mkdir dir="install/lib"/>

<!-- Création du fichier Bienvenue.jar -->
<jar destfile="install/lib/Bienvenue.jar" basedir="classes"/>

<!-- Suppression du dossier classes -->
<delete dir="classes"/> </target>
</project>

Pour que cette première partie et la suite du script Ant fonctionne, les fichiers du projet seront organisés ainsi :

Bienvenue
src
Bienvenue.java
classes  (dossier de compilation des classes créé puis supprimé pendant la compilation)
Bienvenue.class
install  (dossier de création de l'installateur créé puis supprimé à la fin du script)
lib
Bienvenue.jar  (bibliothèque créée pendant la compilation)
jre1.6.0_02  (dossier contenant une copie du JRE créé dans la suite du script)
Bienvenue.exe  (fichier exécutable du programme créé par Launch4j)
build.xml (script Ant)
installerLaunch4j.xml  (fichier Launch4j de création du fichier install/Benvenue.exe)
installerInnoSetup.iss  (fichier Inno Setup de création du fichier BenvenueSetup.exe)
COPYING.TXT  (fichier de la licence GNU GPL du programme affiché par Inno Setup au cours de l'installation)
BenvenueSetup.exe  (fichier d'installation du programme créé par Inno Setup)

Dans cette arborescence sont indiqués en gras les fichiers et les dossiers qu'il vous faudra créer pour arriver à créer le fichier d'installation BenvenueSetup.exe. Ce sont par conséquent les fichiers qu'il faudra archiver pour vos backups dans la vraie vie.

Vous pouvez tester ce script en ouvrant une fenêtre de commande, puis en exécutant la commande ant dans le dossier Bienvenue. Sous Eclipse, sélectionnez l'élément Run As > Ant Build du menu contextuel du fichier build.xml, après avoir créé un projet respectant l'organisation décrite ci-dessus.

Launch4j

Launch4j va nous permettre de créer un fichier exécutable Windows à partir du fichier Bienvenue.jar créé précédemment. Bien qu'il soit possible aussi de créer avec Inno Setup un programme d'installation qui contient un raccourci de lancement de votre programme Java, nous utiliserons Launch4j en plus ici pour les raisons suivantes :

Lancez Launch4j à l'aide de son raccourci qui apparaît dans la liste des programmes Windows, puis remplissez les onglets Basic, Classpath, JRE et Version Info de la fenêtre Launch4j de la façon suivante (tous les champs marqués d'une étoile rouge à six branches sont obligatoires) :

1. Onglet Basic

Launch4j onglet Basic

2. Onglet Classpath

Launch4j onglet Classpath

3. Onglet JRE

Launch4j onglet JRE

4. Onglet Version Info

Launch4j onglet Version Info

Choisissez éventuellement un écran d'accueil dans l'onglet Splash, puis finalement enregistrez votre configuration dans le fichier installerLaunch4j.xml dans le dossier du projet.

Pour la configuration décrite ci-dessus, on obtient le fichier installerLaunch4j.xml suivant :

<launch4jConfig>
<dontWrapJar>true</dontWrapJar>
<headerType>gui</headerType>
<jar></jar>
<outfile>install\Bienvenue.exe</outfile>
<errTitle></errTitle>
<cmdLine></cmdLine>
<chdir>.</chdir>
<priority>normal</priority>
<downloadUrl>http://java.com/download</downloadUrl>
<supportUrl></supportUrl>
<customProcName>true</customProcName>
<stayAlive>false</stayAlive>
<icon></icon>
<classPath>
<mainClass>Bienvenue</mainClass>
<cp>lib/Bienvenue.jar</cp>
</classPath>
<jre>
<path>jre1.6.0_02</path>
<minVersion></minVersion>
<maxVersion></maxVersion>
<dontUsePrivateJres>false</dontUsePrivateJres>
<initialHeapSize>0</initialHeapSize>
<maxHeapSize>0</maxHeapSize>
</jre>
<versionInfo>
<fileVersion>1.0.0.0</fileVersion>
<txtFileVersion>1.0</txtFileVersion>
<fileDescription>Bienvenue</fileDescription>
<copyright>Copyright (c) 2007 eTeks</copyright>
<productVersion>1.0.0.0</productVersion>
<txtProductVersion>1.0</txtProductVersion>
<productName>Bienvenue</productName>
<companyName>eTeks</companyName>
<internalName>Bienvenue</internalName>
<originalFilename>Bienvenue.exe</originalFilename>
</versionInfo>
</launch4jConfig>

Remarquez qu'on y retrouve, indiqué en gras, toutes les informations saisies précédemment, plus d'autres qui correspondent aux valeurs par défaut de certains champs. Comme ce fichier est au format XML, vous pouvez facilement le modifier sans l'outil graphique de Launch4j pour y ajouter des bibliothèques après coup par exemple.

Vous pouvez tester cette configuration en cliquant sur l'icône Build wrapper (icône représentant un roue dentée).
Le fichier Bienvenue.exe généré dans le dossier install ne fonctionne pas encore correctement, car le dossier du JRE n'a pas encore été copié dans le dossier install. Complétons donc la cible build du script Ant build.xml avec les deux tâches suivantes :

    <!-- Copie du JRE dans le dossier install/jre1.6.0_02 en excluant les fichiers
inutiles mentionnés dans le fichier README.TXT du JRE
(attention il faut garder le fichier bin/javaw.exe du JRE) -->

<copy todir="install/jre1.6.0_02">
<fileset dir="C:\Program Files\Java\jre1.6.0_02">
<include name="*"/>
<include name="bin/**"/>
<include name="lib/**"/>
<exclude name="lib/charsets.jar"/>
<exclude name="lib/ext/sunjce_provider.jar"/>
<exclude name="bin/rmid.exe"/>
<exclude name="bin/rmiregistry.exe"/>
<exclude name="bin/tnameserv.exe"/>
<exclude name="bin/keytool.exe"/>
<exclude name="bin/kinit.exe"/>
<exclude name="bin/klist.exe"/>
<exclude name="bin/ktab.exe"/>
<exclude name="bin/policytool.exe"/>
<exclude name="bin/orbd.exe"/>
<exclude name="bin/servertool.exe"/>
<exclude name="bin/java.exe"/>
<exclude name="bin/javaws.exe"/>
<exclude name="bin/javacpl.exe"/>
<exclude name="bin/jucheck.exe"/>
<exclude name="bin/jusched.exe"/>
<exclude name="bin/wsdetect.dll"/>
<exclude name="bin/npjava*.dll"/>
<exclude name="bin/npoji610.dll"/>
<exclude name="bin/regutils.dll"/>
<exclude name="bin/axbridge.dll"/>
<exclude name="bin/deploy.dll"/>
<exclude name="bin/jpicom.dll"/>
<exclude name="bin/javacpl.cpl"/>
<exclude name="bin/jpiexp.dll"/>
<exclude name="bin/jpinscp.dll"/>
<exclude name="bin/jpioji.dll"/>
<exclude name="bin/jpishare.dll"/>
<exclude name="lib/deploy.jar"/>
<exclude name="lib/plugin.jar"/>
<exclude name="lib/deploy/messages*.properties"/>
<exclude name="lib/deploy/splash.jpg"/>
</fileset>
</copy>

<!-- Création du fichier Bienvenue.exe avec Launch4j -->
<exec executable="C:\Program Files\Launch4j\launch4jc.exe">
<arg value="${basedir}\installerLaunch4j.xml"/>
</exec>

La première tâche copie tous les fichiers du JRE nécessaires à l'exécution du programme en tenant compte de ceux que Sun Microsystems autorise à ne pas redistribuer, ce qui permettra d'alléger un peu le poids du programme d'installation.
La seconde tâche lance le programme launch4jc.exe en lui passant en paramètre le fichier installerLaunch4j.xml pour qu'il crée l'exécutable Bienvenue.exe qui est décrit dans ce fichier.

Après avoir exécuté ce script, le programme Bienvenue.exe fonctionne maintenant correctement.

Inno Setup

Inno Setup va nous permettre de créer un programme d'installation Windows à partir des fichiers contenus dans le dossier install. Non seulement cet outil est gratuit, mais en plus c'est l'un des plus pratiques à utiliser par rapport à d'autres, car il comporte notamment un assistant (wizard) qui vous permet de créer en quelques clics un programme d'installation.

Lancez Inno Setup Compiler à l'aide de son raccourci qui apparaît dans la liste des programmes Windows, puis complétez les informations qui vous sont demandées ainsi :

1. Ecran d'accueil d'Inno Setup

Inno Setup écran d'accueil

2. Ecran d'accueil de l'assistant de création de programme d'installation

Assitant Inno Setup écran d'accueil

3. Informations sur l'application installée

Assistant Inno Setup informations

4. Dossier de destination de l'application

Inno Setup dossier

5. Fichiers de l'application à inclure dans le programme d'installation puis à installer

Inno Setup fichiers

6. Création des icônes de l'application

Inno Setup icones

7. Documents de l'application

Inno Setup écran d'accueil

8. Langues proposées dans le programme d'installation

Inno Setup langues

9. Paramètres du compilateur d'Inno Setup

Inno Setup compilateur

10. Fin de l'assistant de création de programme d'installation

Inno Setup écran fin

En lançant BienvenueSetup.exe, vous obtiendrez la suite d'écrans suivante, très classique pour un assistant d'installation de programme sous Windows, et qui ne laissera même pas penser à vos utilisateurs qu'ils vont installer puis utiliser un programme Java...

Finalement, les icônes suivantes sont ajoutées au menu des applications Windows :

 

Après l'exécution de l'assistant de création de programme d'installation, apparaît dans la fenêtre principale d'Inno Setup le texte du script installerInnoSetup.iss qui ressemble à un fichier .ini. Pour ne pas rendre la création du fichier BienvenueSetup.exe dépendante du dossier où se trouve le projet, nous allons le modifier très légèrement, comme suit :

[Setup]
AppName=Bienvenue
AppVerName=Bienvenue 1.0
AppPublisher=eTeks
AppPublisherURL=http://www.eteks.com/
AppSupportURL=http://www.eteks.com/
AppUpdatesURL=http://www.eteks.com/
DefaultDirName={pf}\Bienvenue
DefaultGroupName=Bienvenue
LicenseFile=COPYING.TXT
OutputDir=.
OutputBaseFilename=BienvenueSetup
Compression=lzma
SolidCompression=yes VersionInfoVersion=1.0.0.0
VersionInfoTextVersion=1.0
VersionInfoDescription=Bienvenue Setup
VersionInfoCopyright=Copyright (c) 2007 eTeks
VersionInfoCompany=eTeks
[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"
Name: "french"; MessagesFile: "compiler:Languages\French.isl"
[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
[Files]
Source: "install\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
[Icons]
Name: "{group}\Bienvenue"; Filename: "{app}\Bienvenue.exe"
Name: "{group}\{cm:UninstallProgram,Bienvenue}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\Bienvenue"; Filename: "{app}\Bienvenue.exe"; Tasks: desktopicon
[Run]
Filename: "{app}\Bienvenue.exe"; Description: "{cm:LaunchProgram,Bienvenue}"; Flags: nowait postinstall skipifsilen

Après ces modifications, la clé LicenseFile et OutputDir ne font plus référence à un chemin complet, tandis que la partie [Files] fait référence à tout le contenu du dossier temporaire install sans détailler la liste de ses sous-dossiers. Nous y avons ajouté aussi les clés débutant par Version pour renseigner la version du programme d'installation. Consultez l'aide d'Inno Setup pour découvrir les nombreuses autre possibilités offertes par ce logiciel, comme par exemple la possibilité de créer une association entre votre programme et les fichiers qui porte une certaine extension.

Complètons finalement la cible build du script Ant build.xml avec la tâche suivante :

    <!-- Création du fichier BienvenueSetup.exe avec Inno Setup -->
<exec executable="C:\Program Files\Inno Setup 5\ISCC.exe">
<arg value="${basedir}\installerInnoSetup.iss"/>
</exec>

Cette tâche lance le programme d'Inno Setup ISCC.exe en lui passant en paramètre le fichier installerInnoSetup.iss pour qu'il crée le programme d'installation BienvenueSetup.exe.

Script Ant

Au final, après avoir une ajouté une tâche qui supprime le dossier temporaire install après la création du fichier BienvenueSetup.exe, on obtient le script Ant build.xml suivant, qui vous permettra donc d'automatiser la création du programme d'installation :

<project basedir="." default="build" name="Bienvenue">
<!-- Crée le fichier d'installation BienvenueSetup.exe -->
<target name="build">
<!-- Création du dossier classes -->
<mkdir dir="classes"/>

<!-- Compilation des classes du programme -->
<javac srcdir="src" destdir="classes" />

<!-- Création du dossier install/lib -->
<mkdir dir="install/lib"/>

<!-- Création du fichier Bienvenue.jar -->
<jar destfile="install/lib/Bienvenue.jar" basedir="classes"/>

<!-- Suppression du dossier classes -->
<delete dir="classes"/>

<!-- Copie du JRE dans le dossier install/jre1.6.0_02 en excluant les fichiers
inutiles mentionnés dans le fichier README.TXT du JRE
(attention il faut garder le fichier bin/javaw.exe du JRE) -->

<copy todir="install/jre1.6.0_02">
<fileset dir="C:\Program Files\Java\jre1.6.0_02">
<include name="*"/>
<include name="bin/**"/>
<include name="lib/**"/>
<exclude name="lib/charsets.jar"/>
<exclude name="lib/ext/sunjce_provider.jar"/>
<exclude name="bin/rmid.exe"/>
<exclude name="bin/rmiregistry.exe"/>
<exclude name="bin/tnameserv.exe"/>
<exclude name="bin/keytool.exe"/>
<exclude name="bin/kinit.exe"/>
<exclude name="bin/klist.exe"/>
<exclude name="bin/ktab.exe"/>
<exclude name="bin/policytool.exe"/>
<exclude name="bin/orbd.exe"/>
<exclude name="bin/servertool.exe"/>
<exclude name="bin/java.exe"/>
<exclude name="bin/javaws.exe"/>
<exclude name="bin/javacpl.exe"/>
<exclude name="bin/jucheck.exe"/>
<exclude name="bin/jusched.exe"/>
<exclude name="bin/wsdetect.dll"/>
<exclude name="bin/npjava*.dll"/>
<exclude name="bin/npoji610.dll"/>
<exclude name="bin/regutils.dll"/>
<exclude name="bin/axbridge.dll"/>
<exclude name="bin/deploy.dll"/>
<exclude name="bin/jpicom.dll"/>
<exclude name="bin/javacpl.cpl"/>
<exclude name="bin/jpiexp.dll"/>
<exclude name="bin/jpinscp.dll"/>
<exclude name="bin/jpioji.dll"/>
<exclude name="bin/jpishare.dll"/>
<exclude name="lib/deploy.jar"/>
<exclude name="lib/plugin.jar"/>
<exclude name="lib/deploy/messages*.properties"/>
<exclude name="lib/deploy/splash.jpg"/>
</fileset>
</copy>

<!-- Création du fichier Bienvenue.exe avec Launch4j -->
<exec executable="C:\Program Files\Launch4j\launch4jc.exe">
<arg value="${basedir}\installerLaunch4j.xml"/>
</exec>

<!-- Création du fichier BienvenueSetup.exe avec Inno Setup -->
<exec executable="C:\Program Files\Inno Setup 5\ISCC.exe">
<arg value="${basedir}\installerInnoSetup.iss"/>
</exec>

<!-- Suppression du dossier install -->
<delete dir="install/"/>
<echo message="BienvenueSetup.exe ready"/>
</target>
</project>

Ce script s'exécute simplement en ouvrant une fenêtre de commande, puis en exécutant la commande ant dans le dossier du projet Bienvenue. Sous Eclipse, sélectionnez l'élément Run As > Ant Build du menu contextuel du fichier build.xml.

N'oubliez pas de modifier les numéros de versions indiquées dans les fichiers installerLaunch4j.xml, installerInnoSetup.iss quand vous mettez à disposition une mise à jour de votre programme. Comme ces fichiers sont textuels, vous n'aurez même pas besoin de lancer les outils Launch4j et Inno Setup pour effectuer cette mise à jour. Finalement, si vous avez bien observé à quoi correspond chacun des éléments de ces fichiers dans l'interface graphique de Launch4j et d'Inno Setup, vous pourrez appliquer cette astuce à vos applications en éditant simplement les fichiers qui vous sont proposés.

Dernière mise à jour le 01/10/2007


Page d'accueilFindIt !ContactAstuces JavaLes notions de baseDébut de la page
© Copyrights 1997-2023 Emmanuel PUYBARET / eTeks
- Tous droits réservés -
Astuces Java