40 Stimmen

Paketierung von Java-Anwendungen für den Windows/Linux-Desktop

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

OS X bietet von Haus aus einen einfachen Mechanismus, um Java-Anwendungen in native Anwendungspakete zu verpacken, aber die Erstellung einer Anwendung für Windows/Linux, bei der der Benutzer keine hässliche Batch-Datei ausführen oder auf eine .jar-Datei klicken muss, ist immer noch mühsam. Möglicherweise ist das unter Linux kein so großes Problem, da der Benutzer dort wahrscheinlich etwas technisch versierter ist, aber unter Windows hätte ich gerne eine normale .exe-Datei, die er/sie ausführen kann.

Hat jemand irgendwelche Erfahrungen mit einem der .exe-Generierungstools für Java, die es da draußen gibt? Ich habe JSmooth ausprobiert, hatte aber verschiedene Probleme damit. Gibt es eine bessere Lösung, bevor ich knacken aus Visual Studio und rollen meine eigenen?

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

1 Stimmen

Bitte führen Sie die Probleme auf, die Sie mit JSmooth hatten.

32voto

Brian Kelly Punkte 5462

Um an die Antwort von pauxu anzuknüpfen, verwende ich launch4j und NSIS in einem Projekt von mir und dachte, es wäre hilfreich, zu zeigen, wie ich sie verwende. Hier ist, was ich für Windows mache. BTW, ich erstelle .app und .dmg für Mac, aber ich habe noch nicht herausgefunden, was ich für Linux mache.

Projektkopien von launch4j und NSIS

In meinem Projekt habe ich ein Verzeichnis "vendor" und darunter ein Verzeichnis für "launch4j" und "nsis". Darin befindet sich jeweils 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.

Skript-Dateien

Ich habe auch ein Verzeichnis "scripts" in meinem Projekt, das verschiedene Konfigurations-/Skriptdateien für mein Projekt enthält. Zunächst ist da 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. Es kann ein VERSION-Argument annehmen, um die Datei zu benennen.

; 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

Integration von Ameisen

Ich habe einige Ziele in meinem Ant-Buildfile (build.xml), um das oben genannte zu behandeln. Zuerst habe ich Ant angewiesen, die Ant-Aufgaben von launch4j zu importieren:

<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 für die Erstellung 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 notwendigen Dateien für das Installationsprogramm an einen temporären Speicherort, und die zweite Hälfte führt das Skript aus, das alles verwendet, um das Installationsprogramm zu erstellen.

0 Stimmen

Ich habe das zwar noch nicht ausprobiert, aber es scheint sehr vollständig zu sein, stimmen Sie dieser Antwort zu!

0 Stimmen

Wahrscheinlich viel zu teuer für die meisten Hobby-Softwareanwendungen :)

0 Stimmen

"Zuerst gibt es die Datei install4j.xml" - Ähm, sollte das heißen launch4j.xml oder so?

10voto

pauxu Punkte 851

In meinem Unternehmen verwenden wir Start4J um die exe-Datei zu erstellen, und NSIS um das Installationsprogramm mit SWT-Anwendungen zu erstellen.

Wir verwenden es seit Jahren in verschiedenen kommerziellen Anwendungen und das Paar funktioniert gut.

7voto

cringe Punkte 12537

Vielleicht sollten Sie einen Blick werfen auf IzPack . Ich habe vor einigen Jahren ein sehr schönes Installationsprogramm erstellt, und ich würde wetten, dass es immer noch verbessert wird. Es ermöglicht die Installation von Dokumenten, Binärdateien und einem klickbaren Link zum Starten der Anwendung IIRC .

0 Stimmen

Wow, OpenSource und es sieht so aus, als wäre es immer noch aktiv, während jsmooth seit einem Jahr ohne Updates ziemlich tot zu sein scheint.

4voto

Ich habe das kostenlose Start4J um einen eigenen Launcher für meine Java-Programme unter Windows zu erstellen. In Kombination mit dem kostenlosen NSIS-Installationsprogramm können Sie 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, weil ich nur Swing in meinen Anwendungen verwendet.

3voto

Heath Borders Punkte 29263

Erwägen Sie die Umwandlung Ihrer Anwendung in Eclipse RCP . Sie ist geschrieben in SWT und die Eclipse IDE enthält Paketierungswerkzeuge, die ausführbare Dateien für alle wichtigen Plattformen erzeugen. Für Windows kann eine Zip-Datei oder ein Ordner mit Ihrem Code erstellt werden. Für eine allgemeine Installationserfahrung würde ich NSIS verwenden. Es gibt sogar eine Paketgenerator Projekt bei eclipse, um gemeinsame Installationsprogramme für alle von eclipse unterstützten Plattformen zu erstellen.

0 Stimmen

Ich habe die Eclipse RCP in Erwägung gezogen, aber sie ist für mein Projekt, das ein leichtgewichtiges Desktop-Blog-Posting-Tool sein soll, zu schwer.

0 Stimmen

Eclipse RCP ist nicht so groß. Wenn Sie nur die notwendigen Klassen für eine grundlegende Benutzeroberfläche behalten und Ihre Projekte nur von org.eclipse.runtime.core und org.eclipse.ui abhängig machen, sind Sie unter 8 MB und erhalten eine schöne Plattform, die es Ihnen ermöglicht, Ihre Abhängigkeiten zu verwalten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X