Jar包那些事儿

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/ .

封装库和组件
用于做示范,我写了两个类,Print和Log,源码如下:
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包供自己调用。(不要纠结这两个类能干什么,主要是演示嘛)
第一步,将其编译成class文件。如何编译,请看我的上一篇文章《 Java编译那些事儿
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 !
一个美丽的Util.jar放在你的面前了。
那么,如何使用呢?
下面我先写一个Test类来调用jar中的方法。
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!
发布程序(可执行程序)
还是使用上述的print和log类,新写了Test类:
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中。
在当前路径新建一个无后缀的文件,如list,加入下面信息:
Main-Class: linc.test.Test
冒号后面有空格,结尾要回车。
下面重新打包,加入m参数:
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!
成功,窗口也弹出。
如果双击运行后不好用,那么就写个bat文件吧。
run.bat
java -jar hi2.jar
双击run.bat后,程序顺利运行。












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值