以下是原创作品,转载请标明出处http://lvjava.com/?p=42
在网上看到有不少关于Java应用程序打包发布的帖子,总感觉不是很好用。以前的公司打包Java应用软件用的是Install AnyWhere,功能相当强大,Windows系列、Linux、Mac系统都支持,不过好东西是收费的。
总之今天先整理一套使用Advanced Installer将Java程序打包msi安装包的方案。虽然只支持Windows系列系统,不过包括Vista、Windows7在内,32位,64位系统都能很好的支持,而且是免费的,可以很方便的做到免安装JRE,也可以很干净的卸载。RCP项目也可以通过这种方式打包发布。
1. 为什么打包安装包发布
Java的优势之一就是跨平台,编译好的class文件或者可运行的Jar包可以在所有装有虚拟机的PC上运行,所以Java其实可以很方便的作为绿色软件发布,但是除了提供给技术人员的开源框架以外,很少有人会以这样的方式将软件发给客户。
对于不懂软件客户来说用命令行启动软件是一个很不友好的事情,并且运行命令行的窗口有可能会显示很多不需要给客户看到的System.out.println语句输出的调试语句。甚至对于不少的老外客户来说安装一个软件之前需要先安装JRE也是一件很困惑的事情(…市场部的同事有反馈过,然后……软件升版)。
另外你可能也希望通过安装的过程做一些额外的操作,比如你需要在安装的时候写注册表让软件能够开机自动运行,或者注册一个服务,以及自动提供桌面快捷方式。
2. 普通Java程序打包可运行的jar
首先,我们需要将Java代码打包成一个可运行的jar包。假定你的程序有一个带main函数的Java类,且通过Run As Java Application的方式运行正常,如下:
右键点击要打包的项目名(HelloWorld),选择Export,在弹出的对话框中选择Java – Runnable JAR File,点击Next,出现如下对话框:
Launch configuration: 选择打包后的可运行Jar包默认运行的带main函数的类,即你项目的启动类。
Library handing: Extract required libraries into generated JAR 和 package equired libraries into generated JAR这两个选项前者是把你用到的.class文件提取出来,后者则是把你所需要的所有jar包都打进一个包里。两者最终都只生成一个jar包。重点说一下第三个选项,这个选项会将项目用到的其他jar包单独放在一个HelloWorld_lib的文件夹里,这样会导致软件升版的时候如果用到的其他jar包有变动的话打包软件中的配置也需要做相应的改动。
打包完毕以后通过命令行在对应文件夹执行指令java –jar HelloWorld.jar测试软件是否运行正常,容易出现的错误是原来项目中用到的一些文件比如图片或者xml配置文件找不到了的异常。
如果是原来项目根目录下的icons之类的文件无法找到,可以将相应缺少的文件拷贝到HelloWorld.jar一个文件夹中。
如果是其他格式的文件被打包进jar包以后无法访问的话,请尝试使用Class.getResourceAsStream(String filename)的方式访问文件。
3. 创建对应的exe文件
之前很多网上的文章都会使用一些比较复杂的软件直接将编译后的代码或者jar文件转换成exe文件,总觉得比较麻烦,相对而言下面的方法比较简单且可控:
创建一个HelloWorld.bat文件,右键点击,打开编辑文本框输入java –jar HelloWorld.jar保存关闭。然后使用Bat To Exe Converter之类的工具将HelloWorld.bat文件转换成exe文。转换的过程参考文章bat转exe小工具 – Bat To Exe Converter,转换完成以后双击生成的exe测试是否运行正常。
测试一切运行正常以后,就可以使用打包软件打包了。
这个方法的另外一个优点是整个打包的过程很清晰,运行的步骤可控,不存在打包软件中黑箱操作的问题。用java代码运行的时候可以自己添加其他的控制参数。
如果希望打包免安装JRE版本的软件,可以复制一个jre文件夹在同一路径下,然后将bat中的内容修改为 jre\bin\java -jar HelloWorld.jar 即可。
详细打包的步骤请参考Advanced Installer打包Java应用程序教程