Question

J'écris une application en Java pour le bureau en utilisant la bibliothèque Eclipse SWT pour le rendu GUI.Je pense que SWT aide Java à surmonter le plus gros obstacle à l'acceptation sur le bureau :à savoir fournir une application Java avec une interface cohérente et réactive qui ressemble à celle de n'importe quelle autre application sur votre bureau.Cependant, j'estime que le packaging d'une application reste un problème.

OS X fournit nativement un mécanisme simple pour encapsuler des applications Java dans des bundles d'applications natifs, mais produire une application pour Windows/Linux qui ne nécessite pas que l'utilisateur exécute un fichier de commandes laid ou clique sur un .jar reste un problème.Ce n'est peut-être pas un tel problème sous Linux, où l'utilisateur est susceptible d'être un peu plus féru de technologie, mais sous Windows, j'aimerais avoir un .exe régulier à exécuter.

Quelqu'un a-t-il déjà utilisé l'un des outils de génération .exe pour Java disponibles ?J'ai essayé JSmooth mais j'ai rencontré divers problèmes.Existe-t-il une meilleure solution avant de supprimer Visual Studio et de lancer la mienne ?

Modifier: Je devrais peut-être mentionner que je ne suis pas en mesure de dépenser beaucoup d'argent pour une solution commerciale.

Était-ce utile?

La solution

Pour faire suite à la réponse de Pauxu, j'utilise launch4j et NSIS sur un de mes projets et j'ai pensé qu'il serait utile de montrer comment je les utilise.Voici ce que je fais pour Windows.BTW, je crée .app et .dmg pour Mac, mais je n'ai pas encore compris quoi faire pour Linux.

Copies de projet de launch4j et NSIS

Dans mon projet, j'ai un répertoire "fournisseur" et en dessous j'ai un répertoire pour "launch4j" et "nsis".Dans chacun se trouve une copie de l’installation de chaque application.Je trouve plus facile d'avoir une copie locale du projet plutôt que de forcer les autres à installer les deux produits et à configurer une sorte de variable d'environnement pour pointer vers chacun.

Fichiers de scripts

J'ai également un répertoire "scripts" dans mon projet qui contient divers fichiers de configuration/script pour mon projet.Il y a d’abord le fichier launch4j.xml :

<launch4jConfig>
  <dontWrapJar>true</dontWrapJar>
  <headerType>gui</headerType>
  <jar>rpgam.jar</jar>
  <outfile>rpgam.exe</outfile>
  <errTitle></errTitle>
  <cmdLine></cmdLine>
  <chdir>.</chdir>
  <priority>normal</priority>
  <downloadUrl>http://www.rpgaudiomixer.com/</downloadUrl>
  <supportUrl></supportUrl>
  <customProcName>false</customProcName>
  <stayAlive>false</stayAlive>
  <manifest></manifest>
  <icon></icon>
  <jre>
    <path></path>
    <minVersion>1.5.0</minVersion>
    <maxVersion></maxVersion>
    <jdkPreference>preferJre</jdkPreference>
  </jre>
  <splash>
    <file>..\images\splash.bmp</file>
    <waitForWindow>true</waitForWindow>
    <timeout>60</timeout>
    <timeoutErr>true</timeoutErr>
  </splash>
</launch4jConfig>

Et puis il y a le script NSIS rpgam-setup.nsis.Il peut prendre un argument VERSION pour aider à nommer le fichier.

; The name of the installer
Name "RPG Audio Mixer"

!ifndef VERSION
    !define VERSION A.B.C
!endif

; The file to write
outfile "..\dist\installers\windows\rpgam-${VERSION}.exe"

; The default installation directory
InstallDir "$PROGRAMFILES\RPG Audio Mixer"

; Registry key to check for directory (so if you install again, it will 
; overwrite the old one automatically)
InstallDirRegKey HKLM "Software\RPG_Audio_Mixer" "Install_Dir"

# create a default section.
section "RPG Audio Mixer"

    SectionIn RO

    ; Set output path to the installation directory.
    SetOutPath $INSTDIR
    File /r "..\dist\layout\windows\"

    ; Write the installation path into the registry
    WriteRegStr HKLM SOFTWARE\RPG_Audio_Mixer "Install_Dir" "$INSTDIR"

    ; Write the uninstall keys for Windows
    WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\RPGAudioMixer" "DisplayName" "RPG Audio Mixer"
    WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\RPGAudioMixer" "UninstallString" '"$INSTDIR\uninstall.exe"'
    WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\RPGAudioMixer" "NoModify" 1
    WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\RPGAudioMixer" "NoRepair" 1
    WriteUninstaller "uninstall.exe"

    ; read the value from the registry into the $0 register
    ;readRegStr $0 HKLM "SOFTWARE\JavaSoft\Java Runtime Environment" CurrentVersion

    ; print the results in a popup message box
    ;messageBox MB_OK "version: $0"

sectionEnd

Section "Start Menu Shortcuts"
  CreateDirectory "$SMPROGRAMS\RPG Audio Mixer"
  CreateShortCut "$SMPROGRAMS\RPG Audio Mixer\Uninstall.lnk" "$INSTDIR\uninstall.exe" "" "$INSTDIR\uninstall.exe" 0
  CreateShortCut "$SMPROGRAMS\RPG AUdio Mixer\RPG Audio Mixer.lnk" "$INSTDIR\rpgam.exe" "" "$INSTDIR\rpgam.exe" 0
SectionEnd

Section "Uninstall"

    ; Remove registry keys
    DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\RPGAudioMixer"
    DeleteRegKey HKLM SOFTWARE\RPG_Audio_Mixer

    ; Remove files and uninstaller
    Delete $INSTDIR\rpgam.exe
    Delete $INSTDIR\uninstall.exe

    ; Remove shortcuts, if any
    Delete "$SMPROGRAMS\RPG Audio Mixer\*.*"

    ; Remove directories used
    RMDir "$SMPROGRAMS\RPG Audio Mixer"
    RMDir "$INSTDIR"

SectionEnd

Intégration des fourmis

J'ai quelques cibles dans mon fichier de construction Ant (build.xml) pour gérer ce qui précède.Je demande d’abord à Ant d’importer les tâches Ant de launch4j :

<property name="launch4j.dir" location="vendor/launch4j" />
<taskdef name="launch4j" 
    classname="net.sf.launch4j.ant.Launch4jTask"
    classpath="${launch4j.dir}/launch4j.jar:${launch4j.dir}/lib/xstream.jar" />

J'ai alors une cible simple pour créer l'exécutable du wrapper :

<target name="executable-windows" depends="jar" description="Create Windows executable (EXE)">
    <launch4j configFile="scripts/launch4j.xml" outfile="${exeFile}" />
</target>

Et une autre cible pour créer l'installateur :

<target name="installer-windows" depends="executable-windows" description="Create the installer for Windows (EXE)">
    <!-- Lay out files needed for building the installer -->
    <mkdir dir="${windowsLayoutDirectory}" />
    <copy file="${jarFile}" todir="${windowsLayoutDirectory}" />
    <copy todir="${windowsLayoutDirectory}/lib">
        <fileset dir="${libraryDirectory}" />
        <fileset dir="${windowsLibraryDirectory}" />
    </copy>
    <copy todir="${windowsLayoutDirectory}/icons">
         <fileset dir="${iconsDirectory}" />
    </copy>
    <copy todir="${windowsLayoutDirectory}" file="${exeFile}" />

    <mkdir dir="${windowsInstallerDirectory}" />

    <!-- Build the installer using NSIS -->
    <exec executable="vendor/nsis/makensis.exe">
        <arg value="/DVERSION=${version}" />
        <arg value="scripts/rpgam-setup.nsi" />
    </exec>
</target>

La partie supérieure copie simplement les fichiers nécessaires au programme d'installation dans un emplacement temporaire et la seconde moitié exécute le script qui utilise tout cela pour créer le programme d'installation.

Autres conseils

Dans mon entreprise, nous utilisons Lancement4J pour créer le fichier exe, et NSIS pour créer l'installateur, avec les applications SWT.

Nous l'utilisons depuis des années dans plusieurs applications commerciales et la paire fonctionne bien.

Peut-être que tu devrais jeter un oeil à IzPack.J'ai créé un très bon installateur il y a quelques années et je parierais qu'ils continuent de l'améliorer.Il permet l'installation de docs, de binaires et d'un lien cliquable pour démarrer l'application IIRC.

J'ai utilisé le gratuit Lancement4J pour créer un lanceur personnalisé pour mes programmes Java sous Windows.Combiné avec la gratuité Installateur NSIS vous pouvez créer un package intéressant pour vos utilisateurs Windows.

Modifier: Je n'ai pas vu que vous utilisiez SWT.Je ne sais pas si cela fonctionne également avec SWT, car je n'ai utilisé que Swing dans mes applications.

Avez-vous envisagé d'écrire un petit programme en C/C++ qui appelle simplement CreateProcess démarrer la VM Java avec le fichier jar (ou classe) ?

Tu pourrais obtenir Visual C++ Express et mettre en place le programme de démarrage assez facilement.Cela faciliterait également l'ajout d'une icône conviviale.

Pensez à convertir votre application en RCP Éclipse.Il est écrit en SWT, et l'IDE Eclipse contient des outils de packaging qui génèrent des exécutables pour toutes les principales plates-formes.Pour Windows, il peut générer un zip ou un dossier contenant votre code.Pour une expérience d'installation commune, j'utiliserais NSIS.Il existe en fait un générateur de packages projet chez Eclipse pour créer des installateurs communs pour toutes les plates-formes prises en charge par Eclipse.

As-tu pensé à Démarrage Web Java? Ici est un didacticiel spécifiquement destiné au déploiement d'une application SWT avec Java Web Start.

Installer4J.Ce n'est pas gratuit, mais ça vaut le coup.Essayez le procès

Vous pouvez désormais le faire via Netbeans !C'est vraiment simple et fonctionne parfaitement.Vérifier ce tutoriel sur le site Netbeans.

J'ai vécu la même chose et j'ai découvert que toutes les options gratuites n'étaient pas très bonnes.On dirait que vous allez écrire le vôtre.Je serais intéressé de voir si quelqu'un a une option gratuite/bon marché qui fonctionne

Une autre option que j'envisageais :plutôt que d'écrire un lanceur natif à partir de zéro, Eclipse est livré avec le code source de son propre lanceur, et celui-ci pourrait peut-être être réutilisé pour mon application.

C'est dommage que Sun n'ait jamais rien inclus de similaire dans le JDK.

Un autre vote pour Launch4J, je viens d'écrire une tâche de fourmi ce matin à intégrer à l'un de mes projets.Ça a l'air de très bien fonctionner

J'ai utilisé JSmooth dans le passé et j'ai toujours de la chance avec cela.L'interface utilisateur est assez boguée, mais je ne l'utilise qu'une seule fois pour créer le fichier de configuration, puis je construis à partir de Ant après cela.

Quels problèmes rencontrez-vous avec JSmooth ?

JSMooth a très bien fonctionné pour nous dans un environnement de production, où j'ai d'abord généré un seul pot en utilisant one-jar (plugin fat jar pour Eclipse), puis je l'ai enveloppé avec JSmooth.

(Veuillez noter que je voulais une distribution sans installation d'un seul fichier, qui pourrait inciter à l'installation du JRE si nécessaire).

Cela a si bien fonctionné que je pensais que personne ne l'utilisait :)

Vous voudrez peut-être essayer notre outil, Générateur d'installation BitRock.Bien qu’il s’agisse d’une application native, beaucoup de nos clients l’utilisent pour empaqueter des applications Java de bureau.Si vous regroupez le JRE et créez un lanceur, etc.l'utilisateur n'a même pas besoin de savoir qu'il installe une application Java.Il est multiplateforme, vous pouvez donc générer des installateurs pour Windows et Mac (et Linux, Solaris, etc.). Comme l'outil install4j mentionné dans un autre article, il s'agit d'un outil commercial, mais nous disposons de licences gratuites pour les projets open source et de remises spéciales pour les microISV/petites entreprises, etc.envoyez-nous simplement un e-mail.Je voulais également souligner qu'il s'agit d'un outil d'installation, il ne répondra donc pas à vos besoins si vous recherchez uniquement un seul fichier exécutable.

Dans mon entreprise, nous utilisons launch4J et NSIS pour la distribution Windows, jdeb pour la distribution Debian et Java Web Start pour le système d'exploitation général.Cela fonctionne très bien.

S'il vous plaît essayez InstallerJammer.Le meilleur que j’ai jamais utilisé.Gratuit et puissant. Et suffisant pour un usage personnel et commercial.

Avez-vous pensé à Advanced Installer ?

Je l'ai utilisé plusieurs fois notamment pour Windows et Mac.Aucun script ou Ant requis.Toute l'interface graphique.Très simple et compréhensible.Ce n'est pas gratuit mais vaut chaque centime.

- Lancer en tant qu'administrateur
- Association de fichier
- Thèmes d'installation personnalisés + Thèmes intégrés
- Forfait avec JRE
- Emplacement d'installation
- Implémentation de l'écran Splash natif
- Vous pouvez créer des événements de services et d'événements d'installation
- Conditions préalables
- Version minimale et version maximale de JRE

Et beaucoup plus.Et ne vous méprenez pas, je n'ai aucun lien avec les mecs... leur application est tout simplement géniale.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top