1. 关于java可执行文件
通常情况下,我们开发java的程序都是以class文件或jar文件包的形式存在,而不做成单个的可执行文件。这些class或jar通过java命令或批处理方式来运行(前提是需要安装JRE)。有些机器上可以直接双击jar运行,那是由于在安装过JRE之后windows默认把*.jar使用javaw -jar打开。
不过,对大多数非技术用户来说,直接运行class或jar文件的方式确实不太友好,而且还需要在计算机上先安装JRE,这更会使他们感到麻烦。因此,对于一些面向普通用户的小型桌面应用程序来说,有时也很需要将其制作成类似exe的可执行文件。
2. 各种解决方案、工具和优缺点
(1) 使用InstallAnywhere等工具,将应用程序和JRE一起打包,制作一个exe的安装包。
在安装过程中,用户可以选择使用他机器上的JRE或是这个安装包内的JRE来运行程序。这是很常见的一种做法,显得比较专业,而且原来的程序不需要作任何改动,安装后的程序即在JVM上运行,可以获得原本的效果。如JBuilder就是这么做的。InstallAnywhere中一个压缩的JRE大概是8M,它可以针对linux、win、mac等多个操作系统打包。
(2) 使用JET、gcj等工具,将应用程序制作成一个真正的exe文件。
采用这种方式做成的exe文件可以直接在没有安装JRE的计算机上运行。Java类库全部被编译成dll,变为本地调用。
JET是收费的(从http://www.excelsior-usa.com/jetdlevala.html可以下载3.6试用版)。JET安装好以后,它要把系统上安装的JDK编译一下,要等很久。如果JDK是1.4.2_05版还需要打一个补丁。
gcj有windows和Linux版,直接下载zip包,不需要安装。里面有不少例子,一些build的批处理文件。从原理来说,gcj自己实现了JVM规范,当运行用gcj制作的exe(大约2M)时会启动里面的一个小型jvm,在上面跑应用程序。不过,gcj目前还不能完整地支持Swing。
但不管怎样,把Java做成纯exe实在是吃力不讨好,有很多限制,文件又大。
(3) 使用exe4j制作伪exe文件。
原理:可执行的jar包文件可以通过命令行java -jar jarfile.jar来执行。制作伪exe其实做法一样,只不过做成exe,调用系统中的java.exe来运行它。
一般情况下,exe4j做成的可执行文件仍需JRE支持,也就是说只能在安装了JRE的计算机上运行。不过有一种方法可制作伪exe文件,在没有安装JVM的机器上也能运行:虽然exe4j并不提供将JRE打包的功能,但是它提供如何搜索JRE的方法。在第六项设定[JRE]中有一步[Search sequence],添加一个Directory方式的搜索入口,指定是相对目录“.” ,然后把JRE目录中的bin和lib两个目录复制到你的发布目录中就可以了。(当然你可以不用当前目录“.”,任何当前目录下的其他目录也可以,比方“./JRE”之类的)。此时发布目录中生成的exe文件就在运行时就会调用当前目录中的JRE,而不是通过系统注册表及环境变量寻找JRE了,所以只要把整个发布目录(含exe及JRE的bin和lib)复制到其他计算机上,也就实现了“目标机即便没有安装过JRE也可以执行”。当然,这种发布方式无法得到一个内含JRE的单独的exe文件。另外,JRE的完整目录有50M,但是我们的程序只可能调用其中很少的一部分,你可以手动为发布目录中的JRE减肥、去掉不使用的文件,但这需要一定的经验。减肥后的JRE根据应用程序的不同,最小可以只有10M左右。
(4) 把java应用程序最后做成applet。
将java applet编入html文件,用浏览器方式打开,可以在任何没有安装JRE的机器上运行,好比exe文件一样(当然在安装了JRE的计算机上也可以用批处理文件或java命令来运行)。Windows IE打开applet靠的是一个叫“micosoft VM”的东西,现在该软件一般都是自带的。不过,Windows IE支持的JDK最高版本只能到JDK1.1。如果别人的机器运行不了applet,无非这三个原因:
a. 程序编译时使用的JDK版本太高,Windows IE不支持。用较老板版本的编译器重新编译(v1.1之前)就可以了。比如在dos下javac -target 1.1 *.jav(强制使用JDK1.1编译源程序)。
b. 用户的Windows没有micosoft vm(这种情况比较少见,只有windows XP第一版等极少数情况)。这种情况下,当客户的IE每次load applet时候, Windows会提示“没有download micosoft VM”,他只需从网上下一个就可以了。
c. 用户计算机上装有一些保护ie的软件(比如最新的windows sp2有时就会防止java applet的loading)。暂时关闭保护功能就可以了。
(5) 使用JBuilder、exe4j等工具制作成需要JRE支持的exe文件。
方法很多,工具也很多,网上相关的介绍很容易找到,在此不详述。