为 Windows/Linux 桌面打包 Java 应用程序
Posted
技术标签:
【中文标题】为 Windows/Linux 桌面打包 Java 应用程序【英文标题】:Packaging Java apps for the Windows/Linux desktop 【发布时间】:2010-09-05 16:23:00 【问题描述】:我正在使用用于 GUI 呈现的 Eclipse SWT 库用 Java 编写桌面应用程序。我认为 SWT 帮助 Java 克服桌面上接受的最大障碍:即为 Java 应用程序提供一个一致的、响应式的界面,看起来就像属于桌面上的任何其他应用程序一样。但是,我觉得打包一个应用程序仍然是一个问题。
OS X 原生提供了一种将 Java 应用程序包装在原生应用程序包中的简单机制,但是为 Windows/Linux 生成一个不需要用户运行丑陋的批处理文件或单击 .jar 的应用程序仍然很麻烦.在 Linux 上这可能不是这样的问题,用户可能更精通技术,但在 Windows 上,我希望有一个常规的 .exe 供他/她运行。
有没有人使用过任何现有的 Java .exe 生成工具?我尝试过 JSmooth,但遇到了各种问题。在我破解 Visual Studio 并自己动手之前有没有更好的解决方案?
编辑:我或许应该提一下,我无法在商业解决方案上花很多钱。
【问题讨论】:
请列出您在使用 JSmooth 时遇到的问题。 【参考方案1】:为了跟进 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) 中有一些目标来处理上述问题。首先我 tel 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>
上半部分只是将安装程序所需的文件复制到一个临时位置,后半部分执行使用所有文件来制作安装程序的脚本。
【讨论】:
并不是我实际上已经尝试过这个,但它看起来很完整,投票给这个答案! 对于大多数爱好软件应用程序来说可能太贵了:) “首先是 install4j.xml 文件” - 嗯,应该说 launch4j.xml 还是什么?【参考方案2】:在我的公司,我们使用Launch4J 创建exe 文件,使用NSIS 创建带有SWT 应用程序的安装程序。
我们已经在多个商业应用中使用了它多年,并且这对运行良好。
【讨论】:
【参考方案3】:也许你应该看看IzPack。几年前我创建了一个非常好的安装程序,我敢打赌他们仍在改进它。它允许安装文档、二进制文件和一个可点击的链接来启动应用程序IIRC。
【讨论】:
哇,开源,它看起来仍然很活跃,而 jsmooth 似乎已经死了,去年没有更新。【参考方案4】:我使用免费的Launch4J 为我在Windows 上的Java 程序创建了一个自定义启动器。结合免费的NSIS Installer,您可以为您的 Windows 用户构建一个不错的软件包。
编辑:没有看到您使用 SWT。不知道它是否也适用于 SWT,因为我在我的应用程序中只使用了 Swing。
【讨论】:
【参考方案5】:您是否考虑过用 C/C++ 编写一个只调用 CreateProcess
以使用 jar(或类)文件启动 java VM 的小程序?
你可以得到Visual C++ Express 并很容易地组合启动程序。这也使得添加友好图标变得容易。
【讨论】:
【参考方案6】:考虑将您的应用程序转换为Eclipse RCP。它是用SWT 编写的,Eclipse IDE 包含为所有主要平台生成可执行文件的打包工具。对于 Windows,它可以生成一个 zip 文件或包含您的代码的文件夹。对于常见的安装体验,我会使用 NSIS。 eclipse 上实际上有一个packages generator 项目,用于为 eclipse 支持的所有平台创建通用安装程序。
【讨论】:
我考虑过 Eclipse RCP,但它对我的项目来说有点沉重,它旨在成为一个轻量级的桌面博客发布工具。 Eclipse RCP 没有那么大。如果您只保留基本 UI 的必要类,使您的项目仅依赖于 org.eclipse.runtime.core 和 org.eclipse.ui,那么您的大小将低于 8 MB,并且您将获得一个很好的平台来管理您的依赖项.【参考方案7】:你有没有想过Java Web Start? Here 是专门用于使用 Java Web Start 部署 SWT 应用程序的教程。
【讨论】:
【参考方案8】:Install4J。不是免费的,但值得。试一试
【讨论】:
install4j 可以很好地生成完全原生的 .exe Windows 安装程序(它也支持其他目标平台)。此外,它也是专门用于部署 Java 软件的绝佳选择。有关我使用它的经验的更多详细信息:***.com/questions/759855/… 虽然它是一个商业工具,所以可能不适合原始提问者。【参考方案9】:您现在可以通过 Netbeans 做到这一点!这真的很简单,而且效果很好。查看 Netbeans 网站上的 this 教程。
【讨论】:
【参考方案10】:我经历了同样的事情,发现所有免费选项都不是很好。看来你要自己写了。我很想看看是否有人有一个有效的免费/便宜选项
【讨论】:
【参考方案11】:我正在考虑的另一个选择:Eclipse 没有从头开始编写本机启动器,而是附带了它自己的启动器的源代码,这也许可以重新用于我的应用程序。
很遗憾,Sun 从未在 JDK 中包含任何类似的东西。
【讨论】:
实际上,他们确实做到了。 Eclipse 的可执行文件使用 JNI 来启动 JVM,任何其他提供者都可以创建本机二进制文件来在进程中启动 JVM。【参考方案12】:又一票给 Launch4J,今天早上刚写了一个 ant 任务来集成我的一个项目。看起来效果很好
【讨论】:
【参考方案13】:我过去使用过 JSmooth,现在仍然很幸运。 UI 有很多 bug,但我只用它来构建配置文件一次,然后我从 Ant 构建。
您在使用 JSmooth 时遇到什么问题?
【讨论】:
【参考方案14】:JSMooth 在生产环境中非常适合我们,我首先使用 one-jar(eclipse 的胖 jar 插件)生成了一个 jar,然后用 JSmooth 包装它。
(请注意,我想要单个文件的免安装分发,如果需要,它可以提示安装 JRE)。
效果很好,我以为没人在用它:)
【讨论】:
除了用户界面中的小怪癖之外,我对 JSmooth 的主要希望是它能够生成也是有效 JAR 文件的 EXE 文件。 info-zip 自解压器会执行此操作。【参考方案15】:您可能想试试我们的工具BitRock InstallBuilder。虽然它是一个原生应用程序,但我们的很多客户都使用它来打包桌面 Java 应用程序。如果您捆绑 JRE 并创建启动器等,用户甚至不需要知道他们正在安装 Java 应用程序。它是跨平台的,因此您可以为 Windows 和 Mac(以及 Linux、Solaris 等)生成安装程序。就像另一篇文章中提到的 install4j 工具一样,它是一个商业工具,但是我们有免费许可证对于开源项目和 microISV / 小型企业等的特别折扣,只需给我们发送电子邮件。还想强调这是一个安装工具,因此如果您只寻找单个文件可执行文件,它将无法满足您的需求。
【讨论】:
【参考方案16】:在我的公司中,我们将 launch4J 和 NSIS 用于 windows 发行版,将 jdeb 用于 Debian 发行版,并将 Java Web Start 用于一般操作系统。这很好用。
【讨论】:
【参考方案17】:请尝试InstallJammer。我用过的最好的。免费且功能强大。足以供个人和商业使用。
【讨论】:
【参考方案18】:您是否考虑过高级安装程序? 我已经多次使用它,特别是在 Windows 和 Mac 上。不需要脚本或 Ant。所有图形用户界面。非常简单易懂。不是免费的,但值得每一分钱。 - 以管理员身份运行 - 文件关联 - 自定义安装主题 + 内置主题 - 带有 JRE 的软件包 - 安装位置 - 原生启动画面实现 - 您可以事件创建服务和安装事件 - 先决条件 - JRE 最低版本和最高版本
还有更多。别搞砸了,我和这些家伙没有任何关系......他们的应用程序很棒。
【讨论】:
以上是关于为 Windows/Linux 桌面打包 Java 应用程序的主要内容,如果未能解决你的问题,请参考以下文章