Упаковка приложений Java для рабочего стола Windows / Linux
Я пишу приложение на Java для настольного компьютера, используя библиотеку Eclipse SWT для рендеринга графического интерфейса пользователя. Я думаю, что SWT помогает Java преодолеть самое серьезное препятствие для принятия на настольном ПК: а именно предоставление Java-приложению согласованного, отзывчивого интерфейса, который выглядит так же, как и у любого другого приложения на вашем рабочем столе. Однако я считаю, что упаковка приложения все еще остается проблемой.
OS X изначально предоставляет простой механизм для упаковки приложений Java в пакеты собственных приложений, но создание приложения для Windows / Linux, которое не требует от пользователя запуска уродливого пакетного файла или щелчка по файлу .jar, по-прежнему вызывает затруднения. Возможно, это не такая уж проблема в Linux, где пользователь, вероятно, будет немного более технически подкованным, но в Windows я бы хотел, чтобы у него / нее был обычный .exe.
У кого-нибудь был опыт работы с какими-либо инструментами генерации .exe для Java, которые существуют? Я пробовал JSmooth, но у меня были разные проблемы. Есть ли лучшее решение, прежде чем я раскрою Visual Studio и открою собственную?
Изменить: я должен, возможно, упомянуть, что я не могу потратить много денег на коммерческое решение.
Ответов (18)18
Чтобы продолжить ответ pauxu, я использую launch4j и NSIS в своем проекте и подумал, что было бы полезно показать, как я их использую. Вот что я делаю для Windows. Кстати, я создаю .app и .dmg для Mac, но еще не понял, что делать для Linux.
Копии проектов launch4j и NSIS
В моем проекте у меня есть каталог vendor, а под ним - каталог launch4j и nsis. В каждом есть копия установки для каждого приложения. Я считаю, что проще иметь локальную копию проекта, чем заставлять других устанавливать оба продукта и настраивать какую-то переменную среды, указывающую на каждый из них.
Файлы сценария
У меня также есть каталог «scripts» в моем проекте, в котором хранятся различные файлы конфигурации / скрипта для моего проекта. Сначала идет файл 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.nsis. Он может принимать аргумент 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 $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
Интеграция Ant
У меня есть несколько целей в моем файле сборки Ant (build.xml) для обработки вышеуказанного. Сначала я приказываю 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>
Верхняя часть просто копирует необходимые файлы для установщика во временное место, а вторая половина выполняет сценарий, который использует все это для создания установщика.
Установить4J . Не бесплатно, но оно того стоит. Сделайте пробный выстрел
Пожалуйста, попробуйте InstallJammer . Лучшее, что я когда-либо использовал. Бесплатно и мощно, и этого достаточно для личного и коммерческого использования.
Вы рассматривали Advanced Installer?
Я использовал его несколько раз, особенно для Windows и Mac. Никаких скриптов или Ant не требуется. Все GUI. Очень просто и понятно. Не бесплатно, но стоит каждой копейки.
- Лауч в качестве администратора
- Ассоциация файлов
- Пользовательские темы установки + Встроенные темы
- Пакет с JRE
- Место установки
- Встроенная реализация экрана-заставки
- Вы можете создавать службы и события установки
- Предварительные требования
- Минимальная и максимальная версия JRE
И многое другое. И не запутайся, у меня нет никаких связей с парнями ... их приложение просто потрясающее.
Теперь вы можете сделать это через Netbeans! Это действительно просто и отлично работает. Ознакомьтесь с этим руководством на веб-сайте Netbeans.
Вы думали о Java Web Start ? Вот руководство, специально предназначенное для развертывания приложения SWT с помощью Java Web Start.
Может тебе стоит взглянуть на IzPack . Несколько лет назад я создал очень хороший установщик и держу пари, что они все еще улучшают его. Он позволяет устанавливать документы, двоичные файлы и интерактивную ссылку для запуска приложения IIRC .
Еще один вариант, который я рассматривал: вместо того, чтобы писать собственный модуль запуска с нуля, Eclipse поставляется с исходным кодом для своей собственной программы запуска, и его, возможно, можно было бы перепрофилировать для моего приложения.
Жаль, что Sun никогда не включала ничего подобного в JDK.
Думали ли вы о написании небольшой программы на C/C++, которая просто вызывает CreateProcess
запуск виртуальной машины Java с файлом jar (или класса)?
Вы можете получить Visual C++ Express и довольно легко собрать программу запуска. Это также упростило бы добавление дружественного значка.
Я использовал бесплатную программу Launch4J для создания настраиваемой программы запуска для своих программ Java в Windows. В сочетании с бесплатным установщиком NSIS вы можете создать хороший пакет для пользователей Windows.
Изменить: не видел, чтобы вы использовали SWT. Не знаю, работает ли он и с SWT, потому что в своих приложениях я использовал только Swing.
Рассмотрите возможность преобразования вашего приложения в Eclipse RCP . Он написан на SWT , а Eclipse IDE содержит инструменты упаковки, которые генерируют исполняемые файлы для всех основных платформ. Для Windows он может создать zip-архив или папку, содержащую ваш код. Для обычного процесса установки я бы использовал NSIS. На самом деле в eclipse есть проект генератора пакетов для создания общих установщиков для всех поддерживаемых eclipse платформ.
JSMooth очень хорошо зарекомендовал себя в производственной среде, где я сначала сгенерировал одну банку, используя one-jar (плагин толстой банки для eclipse), а затем обернул ее JSmooth.
(Обратите внимание, что мне нужен один файл без установки, который может предлагать установку JRE в случае необходимости).
Он сработал так хорошо, что я подумал, что никто им не пользуется :)
Вы можете попробовать наш инструмент BitRock InstallBuilder . Хотя это собственное приложение, многие наши клиенты используют его для упаковки настольных Java-приложений. Если вы объединяете JRE и создаете программу запуска и т. Д., Пользователю даже не нужно знать, что он устанавливает приложение Java. Это кроссплатформенный инструмент, поэтому вы можете создавать установщики как для Windows, так и для Mac (и Linux, Solaris и т. Д.). Как и инструмент install4j, упомянутый в другом сообщении, это коммерческий инструмент, но у нас есть бесплатные лицензии для проектов с открытым исходным кодом и специальные скидки. для microISV / малого бизнеса и т. д. просто напишите нам по электронной почте. Также хотел подчеркнуть, что это инструмент установки, поэтому он не будет отвечать вашим потребностям, если вы ищете только один исполняемый файл.