Вопрос

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

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

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

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

Это было полезно?

Решение

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

Копии проекта launch4j и NSIS

В моем проекте у меня есть каталог «поставщик», а под ним — каталог для «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 (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 для создания exe-файла и НСИС создать установщик с приложениями SWT.

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

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

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

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

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

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

Рассмотрите возможность преобразования вашего приложения в Затмение РКП.Это написано в SWT, а Eclipse IDE содержит инструменты упаковки, которые генерируют исполняемые файлы для всех основных платформ.Для Windows он может создать zip-архив или папку, содержащую ваш код.Для обычного процесса установки я бы использовал NSIS.На самом деле существует генератор пакетов проект в eclipse для создания общих установщиков для всех платформ, поддерживаемых eclipse.

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

Установить4J.Не бесплатно, но оно того стоит.Дайте суду шанс

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

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

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

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

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

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

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

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

(Обратите внимание, что мне нужен был дистрибутив с одним файлом, не требующий установки, который при необходимости мог бы предложить установить JRE).

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

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

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

Пожалуйста попробуйте Установить Jammer.Лучший из тех, что я когда-либо использовал.Бесплатный и мощный. Достаточно для личного и коммерческого использования.

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

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

- Запуск от имени администратора
- Ассоциация файлов
- Пользовательские темы установки + встроенные темы
- Пакет с JRE
- Место установки
- Встроенная реализация заставки
- Вы можете создавать события услуг и установки.
- Предварительные условия
- Минимальная версия JRE и максимальная версия

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top