Упаковка Java-приложений для рабочего стола Windows / Linux

Я пишу приложение на Java для рабочего стола, используя библиотеку Eclipse SWT для рендеринга GUI. Я думаю, что SWT помогает Java преодолеть самое большое препятствие для принятия на рабочем столе: а именно предоставление Java-приложения с последовательным, отзывчивым интерфейсом, который выглядит так, как принадлежит любому другому приложению на вашем рабочем столе. Тем не менее, я чувствую, что упаковка приложения по-прежнему является проблемой.

OS X изначально обеспечивает простой механизм для упаковки приложений Java в родной пакеты приложений, но создание приложения для Windows / Linux, которое не требует, чтобы пользователь запускал уродливый пакетный файл или нажимал на кнопку.банки по-прежнему проблемой. Возможно, это не такая проблема в Linux, где пользователь, вероятно, будет немного более технически подкованным, но в Windows я хотел бы иметь обычный .exe для его выполнения.

У кого-нибудь был опыт работы с любым из них .exe generation tools для Java, которые там? Я пробовал JSmooth, но имел различные проблемы с ним. Быть там лучшее решение, прежде чем я взломаю Visual Studio и сверну свой собственный?

Edit: Я должен, пожалуй, упомянуть, что я не могу потратить много денег на коммерческое решение.

18 ответов


чтобы следить за ответом pauxu, я использую launch4j и NSIS в своем проекте и подумал, что было бы полезно показать, как я их использую. Вот что я делаю для Windows. Кстати, я создаю .приложение и .dmg для Mac, но еще не понял, что делать для Linux.

проектные копии launch4j и NSIS

в моем проекте у меня есть каталог" поставщик", а под ним у меня есть каталог для" launch4j "и"nsis". В каждую копию установить для каждого приложения. Мне легче иметь локальную копию проекта, чем заставлять других устанавливать оба продукта и настраивать какую-то переменную среды для указания на каждый.

Файлы Скрипта

у меня также есть каталог "скрипты" в моем проекте, который содержит различные файлы конфигурации/скриптов для моего проекта. Во-первых, есть 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>

и затем есть сценарий NSIS rpgam-setup.НСИ. Он может принимать аргумент VERSION чтобы помочь назвать файл.

; 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  register
    ;readRegStr  HKLM "SOFTWARE\JavaSoft\Java Runtime Environment" CurrentVersion

    ; print the results in a popup message box
    ;messageBox MB_OK "version: "

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

у меня есть некоторые цели в моем Ant buildfile (build.xml) для обработки вышеизложенного. Сначала я tel Ant для импорта задач 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" />

у меня тогда есть простая цель для создания исполняемого файла оболочки:

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

и еще одна цель для создания установщика:

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

верхняя часть этого просто копирует необходимые файлы для установщика во временное место и вторая половина выполняет скрипт, который использует все это для создания установщика.


в моей компании мы используем Launch4J для создания exe-файла и NSIS для создания установщика с приложениями SWT.

мы использовали его в течение многих лет в ряде коммерческих приложений и пара работает нормально.


Возможно, вам стоит взглянуть на IzPack. Я создал очень хороший установщик несколько лет назад, и я бы поспорил, что они все еще улучшают его. Это позволяет устанавливать документы, двоичные файлы и ссылку для запуска приложения IIRC.


Я использовал бесплатный Launch4J для создания пользовательского запуска для моих программ Java в Windows. В сочетании с бесплатным установщик NSIS вы можете создать хороший пакет для пользователей Windows.

Edit: не видел, что вы используете SWT. Не знаю, работает ли он с SWT, потому что я использовал только Swing в своих приложениях.


вы рассматривали возможность написания небольшой программы на C / C++, которая просто вызывает CreateProcess для запуска Java VM с файлом jar (или class)?

вы можете узнать Visual C++ Express и собрать программу запуска довольно легко. Это позволит легко добавить дружественный значок, а также.


рассмотрите возможность преобразования вашего приложения в Eclipse RCP. Это написано в SWT, и Eclipse IDE содержит инструменты упаковки, которые генерируют исполняемые файлы для всех основных платформ. Для windows он может генерировать zip или папку, содержащую ваш код. Для общего опыта установки я бы использовал NSIS. Существует на самом деле пакеты генератор проект в eclipse для создания общих установщиков для всех платформ eclipse поддерживает.


вы думали о Java Web Start? здесь это учебник специально для развертывания приложения SWT с Java Web Start.


Install4J. Не бесплатно, но стоит того. Дайте пробный выстрел


теперь вы можете сделать это через Netbeans! Это очень легко и работает отлично. Проверьте этой учебник на веб-сайте Netbeans.


Я прошел через то же самое и обнаружил, что все бесплатные варианты были не очень хорошими. Похоже, ты будешь писать свою собственную. Мне было бы интересно узнать, есть ли у кого-то бесплатный/дешевый вариант, который работает


другой вариант, который я рассматривал: вместо того, чтобы писать родную пусковую установку с нуля, Eclipse поставляется с исходным кодом для собственной пусковой установки, и это, возможно, может быть перепрофилировано для моего приложения.

жаль, что Sun никогда не включала ничего подобного в JDK.


еще один голос за Launch4J, только что написал задачу ant сегодня утром, чтобы интегрироваться с одним из моих проектов. Кажется, работает очень хорошо


Я использовал JSmooth в прошлом, и все еще удачи с ним. Пользовательский интерфейс довольно глючит, но я использую его только для создания файла конфигурации один раз, а затем я строю из Ant после этого.

какие проблемы у вас возникли с JSmooth?


JSMooth работал очень хорошо для нас в производственной среде, где я сначала сгенерировал одну банку с помощью one-jar (плагин fat jar для eclipse), а затем завернул ее в JSmooth.

(обратите внимание, что я хотел не устанавливать дистрибутив одного файла, который мог бы promt для установки JRE, если это необходимо).

Он работал так хорошо, что я думал, что никто не использовал его :)


вы можете попробовать наш инструмент, Пренадлежащие Bitrock InstallBuilder. Хотя это родное приложение, многие наши клиенты используют его для упаковки настольных приложений Java. Если вы связываете JRE и создаете launcher и т. д. пользователю даже не нужно знать, что они устанавливаются Java-приложения. Это кросс-платформенный, поэтому вы можете создавать установщики как для Windows, так и для Mac (и Linux, Solaris и т. д.) Как инструмент install4j, упомянутый в другом сообщении, это коммерческий инструмент, но у нас есть бесплатные лицензии на проекты с открытым исходным кодом и специальные скидки для microISVs / малого бизнеса и т. д. просто напишите нам письмо. Также хотел подчеркнуть, что это инструмент установки, поэтому он не будет удовлетворять ваши потребности, если вы ищете только один исполняемый файл.


в моей компании мы используем launch4J и NSIS для дистрибутива windows, и jdeb для дистрибутива Debian, и Java Web Start для общей операционной системы. Это прекрасно работает.


пожалуйста InstallJammer.Лучший, который я когда-либо использовал. Свободный и могущественный.И достаточно для личного и коммерческого использования.


вы рассматривали расширенный установщик?

Я использовал его отдельно для Windows и Mac. Никаких сценариев или Ant не требуется. Все GUI. Очень просто и понятно. Не бесплатно, но стоит каждого пенни.

- Lauch как администратор
- Ассоциация Файлов
- Пользовательские темы установки + в построенных темах
- Пакет с JRE
- Установить местоположение
- Родной Сплэш-экран
- Вы можете событие создать услуги и события установки
- Предпосылки
- JRE минимальная версия и максимальная версия

и многое другое. И не пойми меня неправильно, у меня нет никаких связей с парнями...их приложение просто потрясающее.