打包Windows / Linux桌面的Java应用程序

时间:2008-08-11 12:37:51

标签: java windows swt executable software-distribution

我正在使用Eclipse SWT库为桌面编写用于桌面的Java应用程序。我认为SWT帮助Java克服了桌面接受的最大障碍:即为Java应用程序提供一致的响应式界面,该界面看起来像是桌面上任何其他应用程序的界面。但是,我觉得打包应用程序仍然是一个问题。

OS X本身提供了一种简单的机制,可以将Java应用程序包装在本机应用程序包中,但是为Windows / Linux生成一个不需要用户运行丑陋的批处理文件或点击.jar的应用程序仍然是个麻烦。可能在Linux上并不是这样的问题,用户可能会更精通技术,但在Windows上我希望有一个常规的.exe供他/她使用。

有没有人有任何针对Java的.exe生成工具的经验?我尝试过JSmooth,但遇到了各种各样的问题。在我破解Visual Studio并推出自己的解决方案之前,是否有更好的解决方案?

编辑:我或许应该提一下,我无法在商业解决方案上投入大量资金。

18 个答案:

答案 0 :(得分:30)

为了跟进pauxu的回答,我在我的一个项目中使用了launch4j和NSIS,并认为展示我如何使用它们会很有帮助。这就是我正在为Windows做的事情。顺便说一句,我正在为Mac创建.app和.dmg,但还没弄清楚该怎么办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.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)中有一些目标来处理上述问题。首先我通过tel tel来导入launch4j的Ant任务:

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

它的顶部只是将安装程序所需的文件复制到临时位置,后半部分执行使用所有文件来创建安装程序的脚本。

答案 1 :(得分:10)

在我的公司中,我们使用Launch4J创建exe文件,使用NSIS创建安装程序,使用SWT应用程序。

我们已经在几个商业应用中使用它多年了,这对很好。

答案 2 :(得分:7)

也许你应该看看IzPack。几年前我创建了一个非常好的安装程序,我敢打赌他们仍在改进它。它允许安装文档,二进制文件和可点击的链接来启动应用程序 IIRC

答案 3 :(得分:4)

我使用免费Launch4J为Windows上的Java程序创建自定义启动程序。结合免费的NSIS Installer,您可以为Windows用户构建一个不错的软件包。

编辑:没有看到您使用SWT。不知道它是否也适用于SWT,因为我在我的应用程序中只使用了Swing。

答案 4 :(得分:3)

考虑将您的申请转换为Eclipse RCP。它是用SWT编写的,Eclipse IDE包含为所有主要平台生成可执行文件的打包工具。对于Windows,它可以生成包含代码的zip或文件夹。对于常见的安装体验,我使用的是NSIS。在eclipse中实际上有一个packages generator项目,可以为eclipse支持的所有平台创建通用安装程序。

答案 5 :(得分:3)

您是否考虑过用C / C ++编写一个小程序,只调用CreateProcess来启动带有jar(或类)文件的java VM?

您可以轻松获得Visual C++ Express并将启动程序放在一起。这样可以轻松添加友好图标。

答案 6 :(得分:2)

你有没有想过Java Web StartHere是专门用于使用Java Web Start部署SWT应用程序的教程。

答案 7 :(得分:1)

Install4J。不是免费的,但值得。试试一次

答案 8 :(得分:1)

你现在可以通过Netbeans做到这一点!这真的很容易,而且效果很好。查看Netbeans网站上的this教程。

答案 9 :(得分:0)

在我的公司中,我们使用launch4J和NSIS进行Windows发行,使用jdeb进行Debian发行,使用Java Web Start进行常规操作系统。这很好用。

答案 10 :(得分:0)

JSMooth在生产环境中对我们非常有效,我首先使用one-jar(胖jar插件到eclipse)生成一个jar,然后用JSmooth包装它。

(请注意,我希望无法安装单个文件,如果需要,可以安装JRE。)

它运作良好,我以为没有人使用它:)。

答案 11 :(得分:0)

您是否考虑过Advanced Installer?

我已经多次使用它,尤其适用于Windows和Mac。无需脚本或Ant。所有GUI。非常简单易懂。不是免费的,但值得每一分钱。

- Lauch作为管理员
- 文件协会
- 自定义安装主题+内置主题
- 带有JRE的包装
- 安装位置
- Native Splash屏幕实现
- 您可以在活动中创建服务和安装事件 - 先决条件
- JRE最低版本和最高版本

还有更多。并且不要让它扭曲,我与这些家伙没有关系...他们的应用程序真棒。

答案 12 :(得分:0)

我过去使用过JSmooth,但仍然很幸运。用户界面很糟糕,但我只用它来构建一次配置文件,之后我就用Ant构建了。

您对JSmooth有什么问题?

答案 13 :(得分:0)

我经历了同样的事情,发现所有免费选项都不是很好。看起来你会写自己的。我有兴趣看看有人有免费/便宜的选项吗?

答案 14 :(得分:0)

Launch4J的另一次投票,今天早上写了一个蚂蚁任务,与我的一个项目集成。似乎工作得很好

答案 15 :(得分:0)

您可能想尝试我们的工具BitRock InstallBuilder。虽然它是本机应用程序,但我们的许多客户都使用它来打包桌面Java应用程序。如果捆绑JRE并创建启动器等,用户甚至不需要知道他们正在安装Java应用程序。它是跨平台的,因此您可以为Windows和Mac(以及Linux,Solaris等)生成安装程序。就像在另一篇文章中提到的install4j工具一样,它是一个商业工具,但是我们有免费许可证对于开源项目和microISV /小企业的特别折扣等,请给我们发一封电子邮件。还要强调这是一个安装工具,因此如果您只查找单个文件可执行文件,它将无法满足您的需求。

答案 16 :(得分:0)

我正在考虑的另一个选择:Eclipse不是从头开始编写本机启动器,而是自带启动器的源代码,这可能会改为我的应用程序。

令人遗憾的是,Sun从未在JDK中包含任何类似内容。

答案 17 :(得分:0)

请尝试InstallJammer。我用过的最好的一个。自由而强大。足以供个人和商业使用。