Java打包jar内幕(初级篇)

来源:互联网 发布:贤良 知乎 编辑:程序博客网 时间:2024/04/28 22:55

Java打包jar内幕(初级篇)

河南大学 计算机与信息工程学院 05 张志

这篇内容部分来自官网及维基的翻译,大部分的代码都亲自做了测试,如果遇到问题可以联系我,高手们可以大略读一下初级篇或直接略过读高级篇。

 

学过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包的命令,在命令行下输入jarjar –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内幕(高级篇)。

 

 
原创粉丝点击