Pakowanie aplikacji Java na pulpit Windows/Linux

Piszę aplikację w Javie na pulpit przy użyciu biblioteki SWT Eclipse do renderowania GUI. Myślę, że SWT pomaga Javie pokonać największą przeszkodę dla akceptacji na pulpicie: mianowicie zapewnienie aplikacji Java ze spójnym, responsywnym interfejsem, który wygląda jak należący do każdej innej aplikacji na pulpicie. Uważam jednak, że pakowanie aplikacji nadal stanowi problem.

OS X natywnie zapewnia łatwy mechanizm zawijania aplikacji Java w natywną aplikację pakiety, ale tworzenie aplikacji Dla Windows/Linux, która nie wymaga od użytkownika uruchomienia brzydkiego pliku wsadowego lub kliknięcia najar wciąż jest kłopotliwy. Prawdopodobnie to nie jest taki problem na Linuksie, gdzie użytkownik może być trochę bardziej doświadczony technologicznie, ale na Windowsie chciałbym mieć stały .exe dla niego / jej do uruchomienia.

Czy ktoś miał jakieś doświadczenie z którymś znarzędzia do generowania exe dla Javy, które są tam? Próbowałem JSmooth, ale miałem z tym różne problemy. Czy istnieje lepsze rozwiązanie zanim rozkręcę Visual Studio i nakręcę własne?

Edit: powinienem chyba wspomnieć, że nie jestem w stanie wydać dużo pieniędzy na komercyjne rozwiązanie.

Author: Jonik, 2008-08-11

18 answers

Aby śledzić odpowiedź pauxu, używam launch4j i NSIS w moim projekcie i pomyślałem, że pomocne będzie pokazanie, jak z nich korzystam. Oto co robię Dla Windows. BTW, tworzę .app i .dmg dla Mac, ale jeszcze nie wiem, co zrobić dla Linuksa.

Kopie projektu launch4j i NSIS

W moim projekcie mam katalog "vendor", a pod nim mam katalog " launch4j "i"nsis". Wewnątrz każdego znajduje się Kopia instalacji dla każdego podanie. Wydaje mi się, że łatwiej jest mieć kopię lokalną do projektu, niż zmuszać innych do instalacji obu produktów i skonfigurowania jakiejś zmiennej środowiskowej, która wskazywałaby na każdy z nich.

Pliki Skryptów

Mam również katalog "scripts" w moim projekcie, który zawiera różne pliki konfiguracji / skryptów dla mojego projektu. Najpierw jest launch4j.xml plik:

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

I jest jeszcze skrypt NSIS rpgam-setup.nsis. Można użyć argumentu VERSION, aby pomóc w nazwaniu plik.

; 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

Integracja Mrówek

Mam kilka celów w moim Ant buildfile (build.xml) do obsługi powyższego. Najpierw tel Ant aby zaimportować zadania Ant 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" />

Następnie mam prosty cel do utworzenia pliku wykonywalnego wrappera:

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

I kolejny cel wykonania instalatora:

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

Górna część tego po prostu kopiuje niezbędne pliki instalatora do tymczasowej lokalizacji, a druga połowa wykonuje skrypt, który używa go do zrób instalator.

 29
Author: Brian Kelly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-14 15:52:59

W mojej firmie używamy Launch4J do tworzenia pliku exe, a NSIS do tworzenia instalatora, z aplikacjami SWT.

Używamy go od lat w kilku komercyjnych aplikacjach i para działa dobrze.

 10
Author: pauxu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 17:05:46

Może powinieneś rzucić okiem na IzPack . Kilka lat temu stworzyłem bardzo fajny instalator i założę się, że wciąż go ulepszają. Umożliwia instalację dokumentów, plików binarnych i klikalnego łącza do uruchomienia aplikacji IIRC .

 7
Author: cringe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-12 08:05:53

Użyłem DARMOWEGO Launch4J do stworzenia niestandardowego Launchera dla moich programów Java w systemie Windows. W połączeniu z darmowym instalatorem NSIS możesz zbudować fajny pakiet dla swoich użytkowników Windows.

Edit: nie widziałem, że używasz SWT. Nie wiem, czy działa również ze SWT, ponieważ używałem tylko Swing w moich aplikacjach.

 4
Author: Johannes K. Lehnert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-25 21:27:34

Czy zastanawiałeś się nad napisaniem małego programu w C / C++, który wywołuje CreateProcess aby uruchomić maszynę Wirtualną java z plikiem jar (lub klasą)?

Możesz uzyskać Visual C++ Express i całkiem łatwo złożyć program startowy. Ułatwiłoby to również dodanie przyjaznej ikony.

 3
Author: Derek Park,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-12 08:21:36

Rozważ konwersję aplikacji na Eclipse RCP. Jest napisany w SWT, A Eclipse IDE zawiera narzędzia do pakowania, które generują pliki wykonywalne dla wszystkich głównych platform. W systemie windows może wygenerować plik zip lub folder zawierający kod. Aby uzyskać powszechną instalację, użyłbym NSIS. W eclipse istnieje projekt packages generator do tworzenia wspólnych instalatorów dla wszystkich platform obsługujących eclipse.

 3
Author: Heath Borders,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 20:22:59
 2
Author: Jason Day,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-11 13:48:31

Install4J . Nie za darmo, ale warto. Daj szansę na próbę

 1
Author: basszero,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-11 12:59:04

Teraz możesz to zrobić przez Netbeans! To naprawdę proste i działa idealnie. Sprawdź Ten tutorial na stronie Netbeans.

 1
Author: Mafro34,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-10 15:24:15

Przeszedłem przez to samo i stwierdziłem, że wszystkie darmowe opcje nie były zbyt dobre. Wygląda na to, że będziesz pisał swoje. Chcialbym zobaczyc czy ktos ma Darmowa / tania opcje ktora dziala

 0
Author: basszero,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-11 13:09:20

Inna opcja, którą rozważałem: zamiast pisać natywny launcher od podstaw, Eclipse jest wyposażony w kod źródłowy dla własnego launchera, a to może być repurposed dla mojej aplikacji.

Szkoda, że Sun nigdy nie włączył czegoś podobnego do JDK.

 0
Author: alexmcchessers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-12 08:55:33

Kolejny głos na Launch4J, właśnie dziś rano napisałem zadanie ant do integracji z jednym z moich projektów. Wydaje się działać naprawdę dobrze

 0
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 19:17:14

Używałem JSmooth w przeszłości i nadal mam z nim szczęście. Interfejs jest dość błędny, ale używam go tylko do budowania pliku konfiguracyjnego raz, a następnie buduję z Ant po tym.

Jakie masz problemy z JSmooth?

 0
Author: James Van Huis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-28 07:52:07

JSMooth działa bardzo dobrze dla nas w środowisku produkcyjnym, gdzie najpierw wygenerowałem pojedynczy jar za pomocą one-jar (fat jar plugin to eclipse), a następnie owinąłem go JSmooth.

(proszę zauważyć, że chciałem dystrybucję bez instalacji pojedynczego pliku, która mogłaby promt do instalacji JRE w razie potrzeby).

Zadziałało tak dobrze, że myślałem, że nikt go nie używa:)

 0
Author: Thorbjørn Ravn Andersen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-13 10:24:35

Możesz wypróbować nasze narzędzie, BitRock InstallBuilder. Chociaż jest to aplikacja natywna, wielu naszych klientów używa jej do pakowania aplikacji Java na komputery stacjonarne. Jeśli połączysz JRE i utworzysz launcher itp. użytkownik nie musi nawet wiedzieć, że instaluje aplikację Java. Jest wieloplatformowy, więc można generować instalatory zarówno dla Windows i Mac (i Linux, Solaris, itp.) Podobnie jak narzędzie install4j wspomniane w innym poście, jest to narzędzie komercyjne, ale mamy darmowe licencje dla projektów open source i specjalne zniżki dla mikroisv / small business, itp. napisz do nas. Chciałem również podkreślić, że jest to narzędzie instalatora, więc nie będzie odpowiadać na twoje potrzeby, jeśli szukasz tylko jednego pliku wykonywalnego.

 0
Author: Daniel Lopez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-18 12:49:56

W mojej firmie używamy launch4J i NSIS dla dystrybucji windows, jdeb dla dystrybucji Debian i Java Web Start dla ogólnego systemu operacyjnego. To działa całkiem nieźle.

 0
Author: Gatorhall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-31 20:32:33

Proszę spróbować InstallJammer .Najlepszy, jakiego kiedykolwiek użyłem. Wolny i potężny.I wystarczające do użytku osobistego i komercyjnego.

 0
Author: Munim Dibosh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-27 06:47:56

Rozważałeś zaawansowany Instalator?

Używałem go osobno, szczególnie dla Windows i Mac. Nie wymaga skryptów ani Ant. Wszystkie GUI. Bardzo proste i zrozumiałe. Nie za darmo, ale warte każdego grosza.

- Lauch jako Administrator
- Asocjacja Plików
- Custom install Themes + in built Themes
- Pakiet z JRE
- Install location
- Implementacja natywnego ekranu powitalnego
- Można utworzyć zdarzenia usługi i zdarzenia instalacji
- Prerequisites
- Wersja minimalna JRE i wersja maksymalna

I wiele więcej. I nie przekręcaj tego, nie mam żadnych powiązań z kolesami...ich aplikacja jest po prostu niesamowite.

 0
Author: Richboy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-25 06:17:01