Domanda

Sto scrivendo un'applicazione in Java per desktop utilizzando la libreria Eclipse SWT per il rendering della GUI.Penso che SWT aiuti Java a superare il più grande ostacolo per l'accettazione sul desktop:vale a dire fornire a un'applicazione Java un'interfaccia coerente e reattiva che assomigli a quella di qualsiasi altra app sul desktop.Tuttavia, ritengo che il confezionamento di un'applicazione sia ancora un problema.

OS X fornisce nativamente un meccanismo semplice per racchiudere le app Java in bundle di applicazioni native, ma produrre un'app per Windows/Linux che non richieda all'utente di eseguire un brutto file batch o di fare clic su un file .jar è ancora una seccatura.Forse questo non è un problema su Linux, dove è probabile che l'utente sia un po' più esperto di tecnologia, ma su Windows mi piacerebbe avere un normale file .exe da eseguire.

Qualcuno ha avuto esperienza con qualcuno degli strumenti di generazione .exe per Java disponibili?Ho provato JSmooth ma ho avuto vari problemi.Esiste una soluzione migliore prima di uscire da Visual Studio e lanciarne una mia?

Modificare: Forse dovrei dire che non posso spendere molti soldi per una soluzione commerciale.

È stato utile?

Soluzione

Per dare seguito alla risposta di pauxu, sto utilizzando launch4j e NSIS su un mio progetto e ho pensato che sarebbe stato utile mostrare come li sto utilizzando.Ecco cosa sto facendo per Windows.A proposito, sto creando .app e .dmg per Mac, ma non ho ancora capito cosa fare per Linux.

Copie del progetto di launch4j e NSIS

Nel mio progetto ho una directory "vendor" e sotto di essa ho una directory per "launch4j" e "nsis".All'interno di ciascuno è presente una copia dell'installazione per ciascuna applicazione.Trovo più semplice avere una copia locale del progetto piuttosto che forzare altri a installare entrambi i prodotti e impostare una sorta di variabile di ambiente per puntare a ciascuno.

File di script

Ho anche una directory "script" nel mio progetto che contiene vari file di configurazione/script per il mio progetto.Innanzitutto c'è il file 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>

E poi c'è lo script NSIS rpgam-setup.nsis.Può richiedere un argomento VERSION per aiutare a nominare il file.

; 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

Integrazione delle formiche

Ho alcuni obiettivi nel mio file di build Ant (build.xml) per gestire quanto sopra.Per prima cosa dico ad Ant di importare le attività Ant di 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" />

Ho quindi un obiettivo semplice per creare l'eseguibile wrapper:

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

E un altro obiettivo per creare il programma di installazione:

<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 parte superiore copia semplicemente i file necessari per il programma di installazione in una posizione temporanea e la seconda metà esegue lo script che li utilizza tutti per creare il programma di installazione.

Altri suggerimenti

Nella mia azienda usiamo Lancia4J per creare il file exe e NSIS per creare l'installer, con le applicazioni SWT.

Lo usiamo da anni in diverse applicazioni commerciali e la coppia funziona bene.

Forse dovresti dare un'occhiata IzPack.Ho creato un programma di installazione molto carino alcuni anni fa e scommetto che lo stanno ancora migliorando.Consente l'installazione di documenti, file binari e un collegamento cliccabile per avviare l'applicazione IIRC.

Ho usato il servizio gratuito Lancia4J per creare un launcher personalizzato per i miei programmi Java su Windows.Combinato con il gratuito Programma di installazione NSIS puoi creare un bel pacchetto per i tuoi utenti Windows.

Modificare: Non ho visto che usi SWT.Non so se funziona anche con SWT, perché ho usato solo Swing nelle mie app.

Hai considerato di scrivere un piccolo programma in C/C++ che chiama semplicemente CreateProcess avviare la VM Java con il file jar (o classe)?

Potresti ottenere Visual C++ espresso e mettere insieme il programma di avvio abbastanza facilmente.Ciò semplificherebbe anche l'aggiunta di un'icona amichevole.

Valuta la possibilità di convertire la tua applicazione in Eclissi RCP.E' scritto dentro SWT, e l'IDE Eclipse contiene strumenti di packaging che generano eseguibili per tutte le principali piattaforme.Per Windows, può generare un file zip o una cartella contenente il tuo codice.Per un'esperienza di installazione comune, utilizzerei NSIS.In realtà esiste un generatore di pacchetti project su Eclipse per creare programmi di installazione comuni per tutte le piattaforme supportate da Eclipse.

Hai pensato a Inizio Web Java? Qui è un tutorial specifico per la distribuzione di un'applicazione SWT con Java Web Start.

Installa4J.Non gratuito, ma ne vale la pena.Dai una chance al processo

Ora puoi farlo tramite Netbeans!È davvero facile e funziona perfettamente.Guardare Questo tutorial sul sito Netbeans.

Ho fatto lo stesso e ho scoperto che tutte le opzioni gratuite non erano molto buone.Sembra che scriverai il tuo.Sarei interessato a vedere se qualcuno ha un'opzione gratuita/economica che funzioni

Un'altra opzione che stavo valutando:invece di scrivere un launcher nativo da zero, Eclipse viene fornito con il codice sorgente per il proprio launcher e questo potrebbe forse essere riproposto per la mia app.

È un peccato che Sun non abbia mai incluso nulla di simile nel JDK.

Un altro voto per Launch4J, stamattina ho appena scritto un compito di formica da integrare con uno dei miei progetti.Sembra funzionare davvero bene

Ho usato JSmooth in passato e ho ancora fortuna.L'interfaccia utente è piuttosto difettosa, ma la uso solo per creare il file di configurazione una volta, quindi successivamente creo da Ant.

Quali problemi riscontri con JSmooth?

JSMooth ha funzionato molto bene per noi in un ambiente di produzione, dove ho prima generato un singolo jar utilizzando one-jar (plugin fat jar per eclipse) e poi l'ho avvolto con JSmooth.

(Si prega di notare che volevo una distribuzione senza installazione di un singolo file, che potesse richiedere l'installazione di JRE se necessario).

Ha funzionato così bene che pensavo che nessuno lo usasse :)

Potresti provare il nostro strumento, BitRock InstallBuilder.Sebbene sia un'applicazione nativa, molti dei nostri clienti la utilizzano per creare pacchetti di applicazioni Java desktop.Se raggruppi JRE e crei un launcher, ecc.non è nemmeno necessario che l'utente sappia che sta installando un'applicazione Java.È multipiattaforma, quindi puoi generare programmi di installazione sia per Windows che per Mac (e Linux, Solaris, ecc.). Come lo strumento install4j menzionato in un altro post, è uno strumento commerciale, Ma disponiamo di licenze gratuite per progetti open source e sconti speciali per microISV/piccole imprese, ecc.basta inviarci un'e-mail.Volevo anche sottolineare che si tratta di uno strumento di installazione, quindi non soddisferà le tue esigenze se stai cercando solo un singolo file eseguibile.

Nella mia azienda utilizziamo launch4J e NSIS per la distribuzione Windows, jdeb per la distribuzione Debian e Java Web Start per il sistema operativo generale.Funziona abbastanza bene.

Per favore prova InstallaJammer.Il migliore che abbia mai usato.Gratuito e potente. E sufficiente per uso personale e commerciale.

Hai considerato il programma di installazione avanzato?

L'ho usato principalmente soprattutto per Windows e Mac.Non sono richiesti script o Ant.Tutta la GUI.Molto semplice e comprensibile.Non è gratuito ma vale ogni centesimo.

- Avvia come amministratore
- Associazione di file
- Temi di installazione personalizzati + Temi integrati
- Pacchetto con JRE
- Installa la posizione
- Implementazione nativa della schermata Splash
- È possibile creare eventi di servizi ed eventi di installazione
- Prerequisiti
- Versione minima e versione massima di JRE

E molto di più.E non fraintendetemi, non ho alcun legame con i ragazzi... la loro app è semplicemente fantastica.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top