最近因项目需要,我需要给自己用Javafx2.1开发的桌面软件SmartHome制作Windows安装包,由于过程还蛮复杂,于是记录下来留给以后看。
一.制作工具
1.Fatjar:Eclipse 的插件,它的插件更新网址:http://kurucz-grafika.de/fatjar
2.Install4j:一个使用Eclipse RCP开发的收费的用于为java程序制作安装包的软件,提供90天的试用期,官方下载网址:http://www.ej-technologies.com/products/install4j/overview.html
3.JRE:需要的是JDK7u6,下载地址:http://jdk7.java.net/download.html 这个是目前(截止2012-7-17)最新的JRE,因为它已经将Javafx2.2包括其中了
详细信息网址(开源中国):http://www.oschina.net/news/30075/javafx-2-2
诚然,信息中提到该JDK中提供了两种用于打包Javafx应用程序的工具,一种是使用jdk自带的工具javafxpackager,一种是使用ant,个人感觉两种方式都不好用,特麻烦...囧
官网上的帮助文档地址:
Native packaging for JavaFX : https://blogs.oracle.com/talkingjavadeployment/entry/native_packaging_for_javafx
Deploying JavaFX Applications : http://docs.oracle.com/javafx/2/deployment/jfxpub-deployment.htm
本教程的主要内容就是使用上面的工具Javafx应用程序制作windows安装包
二.制作步骤
1.安装JDK7u6,安装时我指定JRE安装在和jdk的同一个目录下,文件夹的名称是jre7u6,我安装之后的目录是 D:\Java\jdk1.7.0_06 相应的jre目录是 D:\Java\jre7u6
将SmartHome项目的java环境换成刚才安装的jdk,方法很多,我习惯新建User Libarary,取名为jre7u6-javafx2.2(随便命名)
删除以前的分开来的jre和javafx的rt,添加这个jre一个即可!
2.安装Farjar,Eclipse插件的在线安装方式,安装完成之后重启Eclipse,点击项目,选择build Fat Jar,配置一些基本信息,例如MainClass,ClassPath
第二页要选中项目所需要的第三方jar包
3.经过前两步得到了Jar包 smarthome0.0.7_fat.jar,在项目的根目录下,然后新建一个文件夹SmartHome,存放一些制作安装包所需要的内容,大致内容其实也就是几个:
(1)项目打包好的Jar包 smarthome0.0.7_fat.jar
(2)软件的图片资源,也就是logo图标,Splash图片等等,可以没有
(3)第三方jar包,因为上面的fatjar已经将所需要的第三方jar打包好了,所以这里可以不用了 ......
4. 安装Install4j,我下载了试用版,只能试用90天,不过够我用了,不过,试用版本得到的软件会有一些烦人的提示哟,不喜欢的话就去下破解版吧或者buy it!
安装好了之后,新建一个project,取名smarthome,保存到哪里都行,这里我还是保存到了SmartHome目录下,因为install4j这个软件经常需要添加文件或者文件夹
它默认是进入的是该project所在的目录
5.接下来是最关键的一步:制作JRE Bundle,这是为了后面的media file的制作做准备
原因是这样子的:install4j的server上没有最新的jdk7u6,而客户机一般是没有安装java环境的,即使有,也不可能是最新的jre7u6,所以,要让软件绑定这个特定的jre!
为了绑定这个特定的jre,首先就是要制作一个JRE Bundle,然后在后面的media file的配置中可以选择这个jre bundle
详细内容可以查看install4j的安装目录下的帮助文档:jreBundle.html,写的很好很详细
在install4j的主菜单中选择 Project->Create a JRE Bundle,开始制作。
在 Select the JRE中选择第一步中安装的jre7u6目录
在Output Directory中,这里是指定生成的jre bundle文件的导出路径,默认是放在install4j的安装目录下的jres文件夹中,因为我之前已经制作过了一次,
所以jres目录下已经有了这个jre bundle,所以我重新指定导出到前面创建的SmartHome目录下,因为我通过一次制作错误发现其实查找路径包含了当前的install4j project的根目录!
但是帮助文档中并没有提到!
在帮助文档 Media File Wizard: Bundled JRE 中说到JRE Bundle文件的查找路径是 $INSTALL4J_HOME/jres and {user home directory}/.install4j5/jres
“If you choose to bundle a JRE by selecting the "bundle the following JRE" radio button, you have to choose a JRE from the drop down list below it. If you select "manual entry" in the drop down list, a text field will appear where you can enter a file name with compiler variables. Please note that you cannot enter a path here, but only a bundle filename that will be searched in $INSTALL4J_HOME/jres and {user home directory}/.install4j5/jres. The existence of this bundle file will be checked only at compile time, not by the wizard.”
在Bundle file name是用于指定budle文件的名称,指定Java version和Custom ID,不指定的话install4j自己能够检测出来的
其他的步骤默认即可,最后生成bundle windows-x86-1.7.0.6_jre7u6-javafx2.2.tar.gz 是一个压缩文件,至于为什么是Linux下常见的压缩文件我也不知道,软件开发者喜欢?也未必。。。
生成的budle文件的名称 {platform}-{Java version}-{Custom ID} 后面两个可以自己指定,如果不指定使用默认,那么生成的bundle文件是 windows-x86-1.7.0_06-ea.tar.gz
6.开始真正的制作安装包!我只介绍我需要配置的步骤,不详细描述Install4j的具体使用!
使用教程参考网址:
Install4j使用指南: http://wenku.baidu.com/view/f8abc62ded630b1c59eeb544.html###
用install4j为Java打包exe教程: http://wenku.baidu.com/view/d0fb8e0716fc700abb68fcc2.html###
系统安装包设计开发说明(By Install4j): http://wenku.baidu.com/view/20f86306bed5b9f3f90f1ced.html###
(1)General Setting
在Application Info中设置软件的Full Name和Short Name以及版本信息
在Java Version中设置最小的版本号是1.7,并删除JRE Search Sequence中的所有项---这不是一般的常见的配置方式,因为打包Javafx本身就不常见!它的JRE是必须要随着安装包一起走的!
一般情况是这样子的,按照搜索的顺序选择有合适的满足最大最小条件的JRE来运行程序,这里我们不需要搜索,而是绑定前面制作好了的JRE!
在Language中选择第一项:简体中文
在Media File Options中设置生成的安装文件的保存路径,为了方便,我还是保存到SmartHome文件夹中,文件的名称使用默认的pattern来生成
其他的部分保持默认即可
(2)Files
在Define Distribution Tree中点击 Installation Directory,然后选择添加文件或者文件夹,选中使用Fatjar导出的jar包和软件的logo图片,其他的默认即可
最终结果:一个jar,一张图片
(3)Launchers
新建一个launch,选择 Generated launcher
在Executable info中设置启动程序exe文件的名称:SmartHome,如果只允许一个实例运行,那么选中Allow Only a single running instance of the application
在Icon中设置软件的icon,选中前面导入的logo
在Java Invocation中的Class Path中导入前面的jar包,并指定Main Class
其他部分保持默认即可
(4)Installer
全部保持默认
(5)Media
新建Media File,选择Installer,并且type是windows
在Configure installer options中设置安装到客户机子上的文件夹的名称,默认是shortname,我改为了编译时的变量fullName的值
重点在Bundle JRE(绑定JRE)中,选择Bundle the following JRE,并且选择Manual entry,在后面的文本框中输入前面制作的JRE Bundle的文件名 windows-x86-1.7.0.6_jre7u6-javafx2.2
注意,不包含 .tar.gz, 还要注意的是这个文件是在SmartHome目录下的,也是可以找到的!详情看前面的制作介绍!
(6)Build
点击Start Build,报错了,一定要在Application Info中设置一个JRE的搜索路径,由于这个JRE是静态绑定的,所以选择环境变量 sys.withJre
它的描述中提到了如果JRE是静态绑定到media file中的,那么这个变量就是一个包含“_with_jre”的变量,否则就是空字符串
配置好了之后就重新Start Build,最终结果:
三.安装过程
双击生成的 smarthome_windows_1_0_0.exe 由于使用的是试用版本的install4j,所以会有一个提示窗体弹出,确定即可
然后进入安装向导:
(1)
(2)
(3)
(4)
(5)
(6)
至此就安装好了,开始菜单可以看到,点击运行即可,一开始也会有一个install4j的提示,确定即可
登陆界面:
主界面:
至此,就结束啦!O(∩_∩)O哈哈哈~ Enjoy the world of JavaFx !