打包用于Windows / Linux桌面的Java应用程序
我正在使用Eclipse SWT库进行GUI渲染,用Java为桌面编写一个应用程序。我认为SWT帮助Java克服了在桌面上接受的最大障碍:即为Java应用程序提供一致的,响应式的界面,该界面看起来与桌面上其他任何应用程序的界面都一样。但是,我认为打包应用程序仍然是一个问题。
OS X本机提供了一种将Java应用程序包装在本机应用程序捆绑包中的简便机制,但是为Windows / Linux生成不需要用户运行丑陋的批处理文件或者单击.jar的应用程序仍然很麻烦。在Linux上,这可能不是问题,在Linux上,用户可能更精通技术,但是在Windows上,我希望有一个常规的.exe供他/她运行。
有没有人对使用Java的.exe生成工具有任何经验?我尝试了JSmooth,但是遇到了各种各样的问题。在我推出Visual Studio并推出自己的产品之前,还有更好的解决方案吗?
编辑:也许我应该提到我无法在商业解决方案上花费很多钱。
解决方案
回答
Install4J。不是免费的,但值得。试用一下
回答
我经历了同样的过程,发现所有的免费选项都不是很好。看起来我们将自己编写。我想看看有人是否有可用的免费/廉价选项
回答
我们是否考虑过Java Web Start?这是专门用于通过Java Web Start部署SWT应用程序的教程。
回答
也许我们应该看看IzPack。几年前,我创建了一个非常不错的安装程序,我敢打赌他们仍在改进它。它允许安装文档,二进制文件和可单击的链接来启动应用程序IIRC。
回答
我们是否考虑过用C / C ++编写一个小的程序,该程序仅调用CreateProcess
以使用jar(或者类)文件启动Java VM?
我们可以使用Visual C ++ Express并轻松组合启动程序。这也将使添加友好图标变得容易。
回答
我正在考虑的另一种选择:Eclipse并非从头开始编写本机启动器,而是随附了其自己的启动器的源代码,并且也许可以将其重新用于我的应用程序。
Sun从来没有在JDK中包含任何类似的东西,这是可耻的。
回答
我已经使用免费的Launch4J为Windows上的Java程序创建了一个自定义启动器。结合免费的NSIS安装程序,我们可以为Windows用户构建一个不错的软件包。
编辑:没有看到我们使用SWT。不知道它是否也适用于SWT,因为我在应用程序中仅使用了Swing。
回答
在我公司中,我们使用Launch4J来创建exe文件,并使用NSIS来创建带有SWT应用程序的安装程序。
我们已经在多种商业应用中使用了多年,并且该产品对效果很好。
回答
对Launch4J的另一票表决是,今天早晨刚刚编写了一个与我的项目集成的蚂蚁任务。看起来真的很好
回答
考虑将应用程序转换为Eclipse RCP。它是用SWT编写的,并且Eclipse IDE包含打包工具,这些工具可以为所有主要平台生成可执行文件。对于Windows,它可以生成一个包含代码的zip或者文件夹。对于一般的安装体验,我将使用NSIS。 eclipse实际上有一个软件包生成器项目,可以为eclipse支持的所有平台创建通用的安装程序。
回答
为了跟进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<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" />register ;readRegStr<target name="executable-windows" depends="jar" description="Create Windows executable (EXE)"> <launch4j configFile="scripts/launch4j.xml" outfile="${exeFile}" /> </target>HKLM "SOFTWARE\JavaSoft\Java Runtime Environment" CurrentVersion ; print the results in a popup message box ;messageBox MB_OK "version:<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>" 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任务:
##代码##然后,我有了一个用于创建包装可执行文件的简单目标:
##代码##制作安装程序的另一个目标:
##代码##上面的部分只是将安装程序所需的文件复制到一个临时位置,而下半部分执行使用所有脚本来制作安装程序的脚本。
回答
我过去曾经使用过JSmooth,但仍然很幸运。用户界面非常有问题,但是我只用它一次构建配置文件,然后在那之后从Ant进行构建。
JSmooth有什么问题?
回答
JSMooth在生产环境中为我们工作得非常好,在该环境中,我首先使用一个罐子(用于胖子的胖罐子插件)生成了一个罐子,然后用JSmooth将其包装。
(请注意,我想要一个没有文件的免安装发行版,如果需要的话,可以提示安装JRE)。
它运行良好,以至于我以为没有人使用它:)
回答
我们可能要尝试使用我们的工具BitRock InstallBuilder。尽管它是本机应用程序,但许多客户使用它来打包桌面Java应用程序。如果捆绑JRE并创建启动器等,则用户甚至不需要知道他们正在安装Java应用程序。它是跨平台的,因此我们可以为Windows和Mac(以及Linux,Solaris等)生成安装程序。就像另一篇文章中提到的install4j工具一样,它是一种商业工具,但是我们为开源项目提供免费许可证,并提供特殊折扣对于microISV /小型企业等,请给我们发送电子邮件。还想强调一下,这是一个安装程序工具,因此,如果我们仅寻找单个文件可执行文件,它将无法满足需求。
回答
在我的公司中,我们将launch4J和NSIS用于Windows发行版,将jdeb用于Debian发行版,并将Java Web Start用作常规操作系统。这工作得很好。