这篇内容部分来自官网及维基的翻译,大部分的代码都亲自做了测试,如果遇到问题可以联系我,高手们可以大略读一下初级篇或直接略过读高级篇。
学过c++的同学都知道,编译过后的程序是可以直接点击运行的,.exe文件是windows里的可执行文件,那么我们在java中如何产生这种可执行文件呢?解决这个问题,我们要知道java程序的打包发布。
Java程序的打包发布也就是打包成jar压缩包的过程,jar压缩包是可以直接点击运行的,类似.exe文件,所以我们要做的就是把java源文件编译后,打包成jar文件,那么我们的用户就可以直接双击运行了。是不是很爽。
其实,我们还可以作很多,比如我们也可以用工具把java程序做成.exe文件,我们也可以做成linux下可以运行的程序。
下面我们详细介绍步骤,并说明每个步骤的原因,知其然也得知其所以然。
一、Java程序的打包基本上分两部分,一部分是一般程序的打包,另一部分就是特殊的插件打包了,我们只注重一般程序的打包,插件的打包方法我们不研究,毕竟没几个人搞插件开发。
二、jar运行的时候,它在怎么工作呢?
了解这个是很重要的,知道这个以后,你就明白为什么我们需要这个文件、需要哪个文件,所以要仔细看这部分。
简单的说:
双击jar文件->jar会读取manifest.mf(或者以mf为后缀的)这个打包清单->清单里有主类名和运行需要的库->根据这些信息jar就可以开始运行里面的java程序了->当有和系统进行交互的时候(比如swt需要系统的界面窗口信息,如果没有和系统进行信息交互则不必包含系统的库文件,其实那个时候你也没有需要的库文件),我们就要读取系统的库文件,调用系统的东西,所以我们要把系统的库函数连接文件(***.dll)包括进来。
这些就是jar的工作内部过程,那么下面我们就满足它的要求,创建它。
三、立即开工
1、第一步,创建好你的swt程序,我们以这个为例,我们不避讳任何为题,因为这个包含的比较全面,基本问题都遇到了,所以你要先创建一个简单的swt程序,例如一个简单的对话框Swttest.java。
2、下面要做第二步,写好你的配置文件,取名为manifest.mf(名字随便,后缀为mf即可)具体格式:
Manifest-Version: 1.0
Main-Class: Swttest
Class-Path: ./lib/swt.jar ./lib/runtime.jar
说明:
第一行的意思是指定清单文件的版本号,不同版本的清单文件格式是稍有不同的,所以为了让jar读取正确的数据,我们必须指定它的格式,当然你也可以换取其他版本,比如2.0等,但是格式要稍微变化一下,这里不详细介绍了。
第二行的意思是指定主程序的类的入口,主类都明白吧,就是包含主函数的类,把这个类写上,jar就会从这个类开始执行。
第三行的意思是由于我们要独立运行,所以我们要把程序执行所需要的环境模拟出来,而这些包就是需要的函数和同文件等,runtime.jar时必须写的,swt.jar不一定,如果你是一般的程序,没有swt的事儿,那么这个就不用。
3、第三步用jar生成结果,jar是一个生成jar包的命令,在命令行下输入jar或jar –help 会出现:
用法:jar {ctxu}[vfm0Mi] [jar-文件] [manifest-文件] [-C 目录] 文件名 ...
选项:
-c 创建新的存档
-t 列出存档内容的列表
-x 展开存档中的命名的(或所有的〕文件
-u 更新已存在的存档
-v 生成详细输出到标准输出上
-f 指定存档文件名
-m 包含来自标明文件的标明信息
-0 只存储方式;未用ZIP压缩格式
-M 不产生所有项的清单(manifest〕文件
-i 为指定的jar文件产生索引信息
-C 改变到指定的目录,并且包含下列文件:
如果一个文件名是一个目录,它将被递归处理。
清单(manifest〕文件名和存档文件名都需要被指定,按'm' 和 'f'标志指定的相同顺序。
示例1:将两个class文件存档到一个名为 'classes.jar' 的存档文件中:
jar cvf classes.jar Foo.class Bar.class
示例2:用一个存在的清单(manifest)文件 'mymanifest' 将 foo/ 目录下的所有
文件存档到一个名为 'classes.jar' 的存档文件中:
jar cvfm classes.jar mymanifest -C foo/ .
知道了jar命令的用法,我们开始打包我们的文件,我们不用其他工具,就用jdk自带的jar打包我们的东西,这样我们可以更加独立的进行工作。
假设我现在有一个简单的helloworld程序,主类是hello。
方法一:让程序自动生成manifest.mf文件
jar cvf test.jar hello.class
执行语句后生成一个包,然后我们改动一下里面的文件。
加一句:Main-Class:(空格)hello
然后压缩回jar文件,执行即可。
方法二:用我们自己写的manifest.mf
先写出我们自己的manifest.mf文件
jar cfm test.jar manifest.mf hello.class
注意:
如果有内部类,不用写内部类,java会自己根据主类找出你的其他类,只要把他们的class文件全部打包进来就可以了。
如果有绝对路径的东西,
例如javax.swing.ImageIcon icon = new javax.swing.ImageIcon("1.gif");
那么打包后的程序将不能找到这个图片, 因为它引用了一个物理路径的图片, 它应该改成这样:
javax.swing.ImageIcon icon = new javax.swing.ImageIcon(getClass().getResource("1.gif"));
根据这两个方法,基本上我们日常大部分的操作都可以进行了。
好了,我们初级的课程就到这里,后续还有更加深入的Java打包jar内幕(高级篇)。
转载:http://blog.csdn.net/z2care/archive/2007/08/18/1749344.aspx