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

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

OS X原生地提供了一个简单的机制来将Java应用程序包装在本地应用程序包中,但是为Windows / Linux生成一个不需要用户运行难看的batch file或者单击.jar的应用程序仍然是一件麻烦事。 可能这在Linux上不是这样的问题,用户可能会更熟悉一些技术,但是在Windows上,我希望有一个经常运行的.exe文件。

有没有人有任何经验的任何用于Java的.exe生成工具? 我试过JSmooth,但有它的各种问题。 有没有更好的解决scheme之前,我打开了Visual Studio,并推出自己的?

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

为了跟上pauxu的回答,我在一个项目上使用了launch4j和NSIS,并且认为这将有助于展示我如何使用它们。 这是我为Windows所做的。 顺便说一下,我正在为Mac创build.app和.dmg,但还没有弄清楚为Linux做什么。

launch4j和NSIS的项目副本

在我的项目中,我有一个“供应商”目录,在它下面有一个“launch4j”和“nsis”目录。 在每个应用程序中,都是安装的副本。 我发现把项目拷贝到本地是比较容易的,而不是强迫别人安装这两个产品,并设置一些环境variables来指向每个项目。

脚本文件

我的项目中还有一个“脚本”目录,其中包含我的项目的各种configuration/脚本文件。 首先是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 ABC !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文件(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" /> 

然后我有一个简单的目标来创build包装可执行文件:

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

它的顶部只是将安装程序的必要文件复制到临时位置,而后半部分则执行脚本,使用它来创build安装程序。

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

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

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

我使用免费的Launch4J为Windows上的Java程序创build自定义启动器。 结合免费的NSIS安装程序,您可以为Windows用户构build一个很好的包。

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

你有没有考虑用C / C ++编写一个小程序,调用CreateProcess来启动带有jar(或class)文件的java虚拟机?

你可以得到Visual C ++ Express,并且很容易地把启动程序放在一起。 这将使添加友好图标变得容易。

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

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

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

你现在可以通过Netbeans来做到这一点! 这很容易,完美的作品。 在Netbeans网站上查看本教程。

我也经历过,发现所有的免费选项都不是很好。 看起来你会写自己的。 我有兴趣看看是否有人有免费/便宜的选项

我正在考虑的另一个选项是:Eclipse不是从头开始编写本机启动程序,而是为自己的启动程序提供源代码,这也许可以用于我的应用程序。

太遗憾了,Sun从未在JDK中包含类似的东西。

另一个投票Launch4J,刚刚写了一个ant任务今天上午,以整合我的一个项目。 似乎工作得很好

以前我用过JSmooth,还是有运气的。 用户界面非常麻烦,但我只用它来构buildconfiguration文件一次,然后我从Ant构build。

你使用JSmooth有什么问题?

JSMooth在我们生产环境中工作得非常好,在这个环境中,我首先使用一个jar(用于eclipse的胖jar插件)生成一个jar,然后用JSmooth包装它。

(请注意,我想要一个没有安装的单个文件分发,如果需要的话可能会提示安装JRE)。

它工作得很好,我以为没有人使用它:)

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

在我的公司,我们使用的是windows4发行版的launch4J和NSIS,Debian发行版的jdeb,以及一般操作系统的Java Web Start。 这工作相当好。

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

你有没有考虑过高级安装程序?

我特别用于Windows和Mac。 不需要脚本或Ant。 所有GUI。 非常简单,可以理解。 不是免费的,而是值得每一分钱。

– 以pipe理员身份参加
– 文件关联
– 自定义安装主题+在构build主题
– 与JRE包装
– 安装位置
– 本机启动屏幕实施
– 您可以事件创build服务和安装事件
– 先决条件
– JRE最低版本和最高版本

还有更多。 不要把它扭曲,我与帅哥没有联系…他们的应用程序是真棒。

Interesting Posts