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

为Windows/Linux桌面打包Java应用程序,java,windows,swt,executable,software-distribution,Java,Windows,Swt,Executable,Software Distribution,我正在用Java为桌面编写一个应用程序,使用EclipseSWT库进行GUI呈现。我认为SWT有助于Java克服在桌面上被接受的最大障碍:即为Java应用程序提供一个一致、响应迅速的界面,该界面看起来像是桌面上任何其他应用程序的界面。但是,我觉得打包应用程序仍然是一个问题 OSX本机提供了一种简单的机制,可以在本机应用程序捆绑包中包装Java应用程序,但是为Windows/Linux生成一个应用程序,而不需要用户运行一个难看的批处理文件或单击.jar仍然是一个难题。在Linux上,这可能不是一个

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

OSX本机提供了一种简单的机制,可以在本机应用程序捆绑包中包装Java应用程序,但是为Windows/Linux生成一个应用程序,而不需要用户运行一个难看的批处理文件或单击.jar仍然是一个难题。在Linux上,这可能不是一个问题,因为用户可能更精通技术,但在Windows上,我希望有一个常规的.exe供他/她运行

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


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

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

我也经历了同样的过程,发现所有的免费选项都不是很好。看来你要自己写了。我很想知道是否有人有一个免费/便宜的选项可以使用

你考虑过吗?是一个专门用于使用Java Web Start部署SWT应用程序的教程。

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

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


你可以很容易地得到并完成启动程序。这将使添加友好图标变得更容易。

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

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

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

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

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


我们已经在几个商业应用程序中使用了多年,这两个应用程序运行良好。

又一次投票支持Launch4J,今天早上刚刚编写了一个ant任务,以便与我的一个项目集成。似乎工作得很好

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

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

launch4j和NSIS的项目副本 在我的项目中,我有一个“供应商”目录,在它下面我有一个“launch4j”和“nsis”目录。每个应用程序中都有一份安装副本。我发现在项目中有一个本地副本比强迫其他人安装这两个产品并设置某种环境变量来指向每个产品更容易

脚本文件 我的项目中还有一个“scripts”目录,其中保存了项目的各种配置/脚本文件。首先是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>
蚂蚁集成 我在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>


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

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


JSmooth有什么问题吗?

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

(请注意,我想要一个单一文件的无安装发行版,如果需要的话,它可以促进JRE的安装)


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

您可能想试试我们的工具。尽管它是一个本机应用程序,但我们的许多客户都使用它来打包桌面Java应用程序。如果捆绑JRE和创建启动器等,用户甚至不需要知道他们正在安装Java应用程序。它是跨平台的,因此您可以为Windows和Mac(以及Linux、Solaris等)生成安装程序,就像另一篇文章中提到的install4j工具一样,它是一个商业工具,但我们为开源项目提供免费许可证,为MicroISV/小型企业等提供特别折扣。请给我们发电子邮件。A.
<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>