JAR全名Java Archive,直译为Java归档文件。它是一种文件格式,以zip文件为基础(经过压缩),主要用途是发布Java程序,部署和封装库、组件等。
在Android、J2EE等平台下,jar包用来做库和组件的用途比较多。
尤其在项目中有框架的情况,把框架以jar包的形式发布,好处多多。下面我就如何做成上述两种jar包分别说明。
在JDK环境中提供jar工具,它的主要功能就是可以完成将一系列相关的程序文件压缩为一个jar包。用法还是很简单的,下面是它的所有指令:
C:\Documents and Settings\Administrator>jar -help 非法选项:h 用法: jar {ctxui}[vfm0Me] [jar-file] [manifest-file] [entry-point] [-C dir] file s ... 选项包括: -c 创建新的归档文件 -t 列出归档目录 -x 解压缩已归档的指定(或所有)文件 -u 更新现有的归档文件 -v 在标准输出中生成详细输出 -f 指定归档文件名 -m 包含指定清单文件中的清单信息 -e 为捆绑到可执行 jar 文件的独立应用程序 指定应用程序入口点 -0 仅存储;不使用任何 ZIP 压缩 -M 不创建条目的清单文件 -i 为指定的 jar 文件生成索引信息 -C 更改为指定的目录并包含其中的文件 如果有任何目录文件,则对其进行递归处理。 清单文件名、归档文件名和入口点名的指定顺序 与 "m"、"f" 和 "e" 标志的指定顺序相同。 示例 1:将两个类文件归档到一个名为 classes.jar 的归档文件中: jar cvf classes.jar Foo.class Bar.class 示例 2:使用现有的清单文件 "mymanifest" 并 将 foo/ 目录中的所有文件归档到 "classes.jar" 中: jar cvfm classes.jar mymanifest -C foo/ .
package linc.util; public class Log { public void debug(String msg) { System.out.println("Debug:" + msg); } public void info(String msg) { System.out.println("Info:" + msg); } }
package linc.util; public class Print { public void printOnce(String msg) { System.out.println("linc:" + msg); } public void printTwice(String msg) { for(int i =0;i<2;i++) { printOnce(msg); } } }好,下面就把这两个类打成jar包供自己调用。(不要纠结这两个类能干什么,主要是演示嘛)
D:\workspace\Java\test-jar2\src>javac -d . Print.java Log.java第二步,打成jar包。
D:\workspace\Java\test-jar2\src>jar -cvf Util.jar linc/util/*.class 标明清单(manifest) 增加:linc/util/Log.class(读入= 640) (写出= 375)(压缩了 41%) 增加:linc/util/Print.class(读入= 684) (写出= 435)(压缩了 36%)O K !
import linc.util.*; public class Test { public static void main(String args[]) { Log log = new Log(); log.info("Hello world!"); Print print = new Print(); print.printTwice("I am Linc!"); } }让这个类和jar包一起编译(我把它们放在了一个路径下),
D:\workspace\Java\test-jar2\src>javac -cp Util.jar Test.java好了,可以运行了。
D:\workspace\Java\test-jar2\src>java Test Info:Hello world! linc:I am Linc! linc:I am Linc!
package linc.test; import javax.swing.JFrame; import linc.util.*; public class Test { public static void main(String args[]) { Log log = new Log(); log.info("Hello world!"); Print print = new Print(); print.printTwice("I am Linc!"); JFrame jf = new JFrame(); jf.setSize(250,250); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jf.setVisible(true); } }把它们打包在一起,然后双击jar包能够运行程序。
D:\workspace\Java\test-jar\src>javac -d . *.java下一步,打包:
D:\workspace\Java\test-jar\src>jar -cvf hi.jar linc/test/*.class linc/util/*.cla ss 标明清单(manifest) 增加:linc/test/A.class(读入= 189) (写出= 161)(压缩了 14%) 增加:linc/test/B.class(读入= 189) (写出= 161)(压缩了 14%) 增加:linc/test/C.class(读入= 189) (写出= 162)(压缩了 14%) 增加:linc/test/D.class(读入= 189) (写出= 162)(压缩了 14%) 增加:linc/test/Test.class(读入= 630) (写出= 456)(压缩了 27%) 增加:linc/util/Log.class(读入= 640) (写出= 375)(压缩了 41%) 增加:linc/util/Print.class(读入= 684) (写出= 435)(压缩了 36%)可以看到,这次打包与做框架时的jar包是一样,那么运行一下:
D:\workspace\Java\test-jar\src>java -jar hi.jar Failed to load Main-Class manifest attribute from hi.jar运行失败了,原因是我们没有指定Main-Class在MANIFEST.MF中。
Main-Class: linc.test.Test冒号后面有空格,结尾要回车。
D:\workspace\Java\test-jar\src>jar -cvfm hi2.jar list linc/test/*.class linc/uti l/*.class 标明清单(manifest) 增加:linc/test/A.class(读入= 189) (写出= 161)(压缩了 14%) 增加:linc/test/B.class(读入= 189) (写出= 161)(压缩了 14%) 增加:linc/test/C.class(读入= 189) (写出= 162)(压缩了 14%) 增加:linc/test/D.class(读入= 189) (写出= 162)(压缩了 14%) 增加:linc/test/Test.class(读入= 630) (写出= 456)(压缩了 27%) 增加:linc/util/Log.class(读入= 640) (写出= 375)(压缩了 41%) 增加:linc/util/Print.class(读入= 684) (写出= 435)(压缩了 36%)先用命令行运行测试:
D:\workspace\Java\test-jar\src>java -jar hi2.jar Info:Hello world! linc:I am Linc! linc:I am Linc!成功,窗口也弹出。
java -jar hi2.jar双击run.bat后,程序顺利运行。