36 votes

Emballage d'applications Java pour le bureau Windows / Linux

Je suis en train d'écrire une application en Java pour le bureau à l'aide de l'Éclipse SWT bibliothèque de l'interface de rendu. Je pense que SWT permet de Java obtenez plus de l'obstacle le plus important pour l'acceptation sur le bureau: à savoir la diffusion d'une application Java avec un uniforme, adaptés interface qui ressemble à celle appartenant à toute autre application sur votre ordinateur de bureau. Cependant, j'ai l'impression que l'emballage d'une application est toujours un problème.

OS X natif fournit un mécanisme simple pour envelopper les applications Java dans l'application native de faisceaux, mais de produire une application pour Windows/Linux qui ne nécessite pas l'utilisateur d'exécuter une vilaine lot de fichier ou cliquez sur une .le pot est toujours une corvée. Éventuellement, ce n'est pas un problème sur Linux, où l'utilisateur est susceptible d'être un peu plus tech-savvy, mais sur Windows j'aimerais avoir un régulier .exe pour lui/elle pour s'exécuter.

Quelqu'un a eu une expérience avec un de la .exe les outils de génération de Java qui sont là-bas? J'ai essayé JSmooth mais avait divers problèmes avec elle. Est-il une meilleure solution avant que je craque Visual Studio et rouler mon propre?

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

30voto

Brian Kelly Points 2744

À suivre sur pauxu réponse, je suis en utilisant launch4j et INS sur un projet de mine et pensé qu'il serait utile de montrer à quel point je suis en les utilisant. Voici ce que j'ai fais pour Windows. BTW, je suis en train de créer .app et .dmg pour les Mac, mais je n'ai pas compris quoi faire pour Linux.

Projet de Copies de launch4j et INS

Dans mon projet j'ai un "vendeur" répertoire et en dessous j'ai un répertoire pour "launch4j" et "nsis". Au sein de chaque est une copie de l'installation de chaque application. Je trouve qu'il est plus facile d'avoir une copie locale du projet, plutôt que de forcer les autres à installer à la fois des produits et mis en place une sorte de variable d'environnement à point pour chaque.

Les Fichiers De Script

J'ai aussi un répertoire "scripts" dans mon projet qui occupe différents de configuration/des fichiers de script pour mon projet. Il y a d'abord l'launch4j.xml fichier:

<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.ins. Il peut prendre une VERSION de l'argument à l'aide du nom du 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

Ant Intégration

J'ai quelques objectifs dans mon Ant buildfile (build.xml) pour le traitement ci-dessus. J'ai d'abord tél Ant à l'importation launch4j de tâches Ant:

<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 d'un simple objectif de la création de 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 la fabrication de 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 de la copie seulement les fichiers nécessaires pour l'installer à un emplacement temporaire et la seconde moitié exécute le script qui utilise tout pour faire de l'installateur.

10voto

pauxu Points 588

Dans mon entreprise, nous utilisons Launch4J pour créer le fichier exe et NSIS pour créer le programme d'installation avec les applications SWT.

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

7voto

cringe Points 2759

Peut-être devriez-vous jeter un coup d'œil à IzPack . J'ai créé un très bon installateur il y a quelques années et je parierais qu'ils l'améliorent encore. Il permet l'installation de documents, de fichiers binaires et d'un lien cliquable pour démarrer l'application IIRC .

4voto

J'ai utilisé le gratuit Launch4J pour créer un lanceur personnalisé pour mes programmes Java sous Windows. En combinaison avec le programme d' installation NSIS gratuit, vous pouvez créer un package intéressant pour vos utilisateurs Windows.

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

3voto

Derek Park Points 25025

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X