39

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

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

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

编辑: 我也许应该提到我无法在商业解决方案上花很多钱。

4

18 回答 18

32

为了跟进 pauxu 的回答,我在我的一个项目中使用了 launch4j 和 NSIS,并认为展示我如何使用它们会很有帮助。这就是我正在为 Windows 做的事情。顺便说一句,我正在为 Mac 创建 .app 和 .dmg,但还没有弄清楚要为 Linux 做什么。

launch4j 和 NSIS 的项目副本

在我的项目中,我有一个“vendor”目录,在它下面有一个“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 构建文件 (build.xml) 中有一些目标来处理上述问题。首先我打电话给 Ant 来导入 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>

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

于 2008-09-29T18:16:22.020 回答
10

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

我们已经在几个商业应用中使用了它多年,并且这对工作正常。

于 2008-09-16T17:05:46.967 回答
7

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

于 2008-08-12T08:05:53.500 回答
4

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

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

于 2008-08-25T21:27:34.087 回答
3

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

您可以获得Visual C++ Express并很容易地组合启动程序。这也可以很容易地添加一个友好的图标。

于 2008-08-12T08:15:51.093 回答
3

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

于 2008-09-16T20:22:59.130 回答
2

您是否考虑过Java Web Start是专门用于使用 Java Web Start 部署 SWT 应用程序的教程。

于 2008-08-11T13:48:31.593 回答
1

安装 4J。不是免费的,但值得。试一试

于 2008-08-11T12:59:04.550 回答
1

您现在可以通过 Netbeans 做到这一点!这真的很简单,而且效果很好。在 Netbeans 网站上查看本教程。

于 2014-05-10T15:24:15.007 回答
0

我经历了同样的事情,发现所有的免费选项都不是很好。看来你要自己写了。我很想看看是否有人有免费/便宜的选择

于 2008-08-11T13:09:20.330 回答
0

我正在考虑的另一个选择:Eclipse 没有从头开始编写本机启动器,而是附带了它自己的启动器的源代码,这也许可以重新用于我的应用程序。

遗憾的是 Sun 从未在 JDK 中包含任何类似的东西。

于 2008-08-12T08:55:33.150 回答
0

又投了一票 Launch4J,今天早上刚写了一个 ant 任务来集成我的一个项目。似乎工作得很好

于 2008-09-16T19:17:14.810 回答
0

我过去使用过 JSmooth,现在仍然很幸运。UI 有很多错误,但我只用它来构建配置文件一次,然后我从 Ant 构建。

您在使用 JSmooth 时遇到什么问题?

于 2008-10-28T07:52:07.767 回答
0

JSMooth 在生产环境中为我们工作得非常好,我首先使用 one-jar (fat jar plugin to eclipse) 生成了一个 jar,然后用 JSmooth 包装它。

(请注意,我想要一个单一文件的免安装分发,如果需要,它可以提示安装 JRE)。

它运行得非常好,我以为没有人在使用它:)

于 2009-01-13T10:24:35.910 回答
0

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

于 2009-01-18T12:49:56.297 回答
0

在我的公司中,我们将 launch4J 和 NSIS 用于 windows 发行版,将 jdeb 用于 Debian 发行版,并将 Java Web Start 用于一般操作系统。这工作得很好。

于 2009-07-31T20:32:33.607 回答
0

请尝试InstallJammer。我用过的最好的。免费且功能强大。足以供个人和商业使用。

于 2012-03-27T06:47:56.027 回答
0

您是否考虑过高级安装程序?

我已经多次使用它,特别是在 Windows 和 Mac 上。不需要脚本或 Ant。所有图形用户界面。非常简单易懂。不是免费的,但值得每一分钱。

- 以管理员身份启动
- 文件关联
- 自定义安装主题 + 内置主题
- 带有 JRE 的软件包
- 安装位置
- 本地启动画面实施
- 您可以创建服务和安装事件
- 先决条件
- JRE 最低版本和最高版本

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

于 2014-08-25T06:17:01.043 回答