Frage

Ich schreibe eine Anwendung in Java für den Desktop und verwende die Eclipse SWT-Bibliothek für das GUI-Rendering.Ich denke, SWT hilft Java dabei, die größte Hürde für die Akzeptanz auf dem Desktop zu überwinden:nämlich die Bereitstellung einer Java-Anwendung mit einer konsistenten, reaktionsfähigen Oberfläche, die wie jede andere App auf Ihrem Desktop aussieht.Ich bin jedoch der Meinung, dass das Packen einer Anwendung immer noch ein Problem darstellt.

OSMöglicherweise ist das unter Linux kein so großes Problem, wo der Benutzer wahrscheinlich etwas technisch versierter ist, aber unter Windows hätte ich gerne eine normale .exe-Datei, die er/sie ausführen kann.

Hat jemand Erfahrung mit den verfügbaren .exe-Generierungstools für Java?Ich habe JSmooth ausprobiert, hatte aber verschiedene Probleme damit.Gibt es eine bessere Lösung, bevor ich Visual Studio rausbreche und mein eigenes entwickle?

Bearbeiten: Ich sollte vielleicht erwähnen, dass ich nicht in der Lage bin, viel Geld für eine kommerzielle Lösung auszugeben.

War es hilfreich?

Lösung

Um pauxus Antwort weiterzuführen: Ich verwende launch4j und NSIS in einem meiner Projekte und dachte, es wäre hilfreich zu zeigen, wie ich sie verwende.Hier ist, was ich für Windows mache.Übrigens erstelle ich .app und .dmg für Mac, habe aber noch nicht herausgefunden, was ich für Linux tun soll.

Projektkopien von launch4j und NSIS

In meinem Projekt habe ich ein Verzeichnis „vendor“ und darunter ein Verzeichnis für „launch4j“ und „nsis“.In jedem befindet sich eine Kopie der Installation für jede Anwendung.Ich finde es einfacher, eine Kopie lokal im Projekt zu haben, als andere zu zwingen, beide Produkte zu installieren und eine Art Umgebungsvariable einzurichten, die auf jedes Produkt verweist.

Skriptdateien

Ich habe in meinem Projekt auch ein Verzeichnis „scripts“, das verschiedene Konfigurations-/Skriptdateien für mein Projekt enthält.Zuerst gibt es die Datei 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>

Und dann ist da noch das NSIS-Skript rpgam-setup.nsis.Zur Benennung der Datei kann ein VERSION-Argument verwendet werden.

; 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

Ameisenintegration

Ich habe einige Ziele in meiner Ant-Builddatei (build.xml), um die oben genannten Probleme zu lösen.Zuerst sage ich Ant, dass er die Ant-Aufgaben von launch4j importieren soll:

<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" />

Ich habe dann ein einfaches Ziel zum Erstellen der ausführbaren Wrapper-Datei:

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

Und ein weiteres Ziel für die Erstellung des Installationsprogramms:

<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>

Der obere Teil davon kopiert lediglich die für das Installationsprogramm erforderlichen Dateien an einen temporären Speicherort und die zweite Hälfte führt das Skript aus, das alle Dateien zur Erstellung des Installationsprogramms verwendet.

Andere Tipps

In meiner Firma verwenden wir Launch4J um die exe-Datei zu erstellen und NSIS zum Erstellen des Installationsprogramms mit SWT-Anwendungen.

Wir verwenden es seit Jahren in mehreren kommerziellen Anwendungen und das Paar funktioniert einwandfrei.

Vielleicht solltest du einen Blick darauf werfen IzPack.Ich habe vor einigen Jahren ein sehr schönes Installationsprogramm erstellt und ich wette, dass sie es immer noch verbessern.Es ermöglicht die Installation von Dokumenten, Binärdateien und einem anklickbaren Link zum Starten der Anwendung IIRC.

Ich habe das kostenlose verwendet Launch4J um einen benutzerdefinierten Launcher für meine Java-Programme unter Windows zu erstellen.Kombiniert mit dem kostenlosen NSIS-Installationsprogramm Sie können ein schönes Paket für Ihre Windows-Benutzer erstellen.

Bearbeiten: Ich habe nicht gesehen, dass Sie SWT verwenden.Ich weiß nicht, ob es auch mit SWT funktioniert, da ich in meinen Apps nur Swing verwendet habe.

Haben Sie darüber nachgedacht, ein kleines Programm in C/C++ zu schreiben, das nur aufruft? CreateProcess die Java-VM mit der JAR-Datei (oder Klassendatei) starten?

Du könntest bekommen Visual C++ Express und das Startprogramm ganz einfach zusammenstellen.Dies würde es auch einfach machen, ein freundliches Symbol hinzuzufügen.

Erwägen Sie, Ihre Bewerbung in umzuwandeln Eclipse RCP.Es ist eingeschrieben SWT, und die Eclipse-IDE enthält Paketierungstools, die ausführbare Dateien für alle wichtigen Plattformen generieren.Unter Windows kann eine ZIP-Datei oder ein Ordner mit Ihrem Code generiert werden.Für eine allgemeine Installation würde ich NSIS verwenden.Es gibt tatsächlich eine Paketgenerator Projekt bei Eclipse, um gemeinsame Installationsprogramme für alle von Eclipse unterstützten Plattformen zu erstellen.

Haben Sie darüber nachgedacht Java Web Start? Hier ist ein Tutorial speziell für die Bereitstellung einer SWT-Anwendung mit Java Web Start.

Install4J.Nicht kostenlos, aber es lohnt sich.Probieren Sie den Prozess aus

Sie können dies jetzt über Netbeans tun!Es ist wirklich einfach und funktioniert perfekt.Kasse Das Tutorial auf der Netbeans-Website.

Ich habe das Gleiche durchgemacht und festgestellt, dass nicht alle kostenlosen Optionen sehr gut waren.Sieht so aus, als würden Sie Ihr eigenes schreiben.Mich würde interessieren, ob jemand eine kostenlose/günstige Option hat, die funktioniert

Eine weitere Option, die ich in Betracht gezogen habe:Anstatt einen nativen Launcher von Grund auf zu schreiben, enthält Eclipse den Quellcode für seinen eigenen Launcher, der vielleicht für meine App umfunktioniert werden könnte.

Es ist eine Schande, dass Sun nie etwas Ähnliches in das JDK aufgenommen hat.

Noch eine Stimme für Launch4J, ich habe heute Morgen gerade eine Ant-Aufgabe geschrieben, um sie in eines meiner Projekte zu integrieren.Scheint wirklich gut zu funktionieren

Ich habe JSmooth in der Vergangenheit verwendet und habe immer noch Glück damit.Die Benutzeroberfläche ist ziemlich fehlerhaft, aber ich verwende sie nur einmal zum Erstellen der Konfigurationsdatei und baue danach von Ant aus.

Welche Probleme haben Sie mit JSmooth?

JSMooth hat bei uns in einer Produktionsumgebung sehr gut funktioniert, wo ich zunächst ein einzelnes Jar mit one-jar (Fat-Jar-Plugin für Eclipse) generiert und es dann mit JSmooth verpackt habe.

(Bitte beachten Sie, dass ich eine Verteilung einer einzelnen Datei ohne Installation wollte, die bei Bedarf zur Installation der JRE auffordern könnte.)

Es hat so gut funktioniert, dass ich dachte, niemand würde es benutzen :)

Vielleicht möchten Sie unser Tool ausprobieren, BitRock InstallBuilder.Obwohl es sich um eine native Anwendung handelt, verwenden viele unserer Kunden sie zum Paketieren von Desktop-Java-Anwendungen.Wenn Sie die JRE bündeln und einen Launcher usw. erstellen.Der Benutzer muss nicht einmal wissen, dass er eine Java-Anwendung installiert.Es ist plattformübergreifend, sodass Sie Installationsprogramme sowohl für Windows als auch für Mac (und Linux, Solaris usw.) erstellen können. Wie das in einem anderen Beitrag erwähnte Tool install4j handelt es sich um ein kommerzielles Tool. Aber Wir haben kostenlose Lizenzen für Open-Source-Projekte und spezielle Rabatte für MicroISVs/Kleinunternehmen usw.Schreiben Sie uns einfach eine E-Mail.Ich möchte auch betonen, dass es sich hierbei um ein Installationstool handelt, sodass es Ihren Anforderungen nicht gerecht wird, wenn Sie nur nach einer einzelnen ausführbaren Datei suchen.

In meinem Unternehmen verwenden wir launch4J und NSIS für die Windows-Distribution, jdeb für die Debian-Distribution und Java Web Start für das allgemeine Betriebssystem.Das funktioniert ganz gut.

Bitte versuche InstallJammer.Das beste, das ich je benutzt habe.Kostenlos und leistungsstark. Und ausreichend für den persönlichen und kommerziellen Gebrauch.

Haben Sie über Advanced Installer nachgedacht?

Ich habe es mehrfach verwendet, insbesondere für Windows und Mac.Kein Scripting oder Ant erforderlich.Alle GUI.Sehr einfach und verständlich.Es ist nicht kostenlos, aber jeden Cent wert.

- Starten Sie als Administrator
- Dateizuordnung
- Benutzerdefinierte Installationsdesigns + integrierte Designs
- Paket mit JRE
- Installationsort
- Native Splash-Screen-Implementierung
- Sie können Ereignisse zum Erstellen von Diensten und zum Installieren von Ereignissen erstellen
- Voraussetzungen
- JRE-Mindestversion und Höchstversion

Und vieles mehr.Und verdrehen Sie es nicht, ich habe keine Verbindung zu den Jungs ... ihre App ist einfach großartig.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top