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"));
根据这两个方法,基本上我们日常大部分的操作都可以进行了。
导入第三方JAR包
用myeclipse 生成好JAR文件之后,进入META-INF文件夹找到MANIFEST.MF文件
修改
<!--EndFragment-->