Java里面的Jar打包工具专题整理

刚刚整理完了python里面的egg专题。了解想在python中整理工具集我们可以用egg工具。现在转来想一下在java里面如何打包自己的工具集呢。

JAR文件:类似于ZIP文件将东西重新组织压缩到一块。

输入(主要包括class文件、还有图片、JSP文件或HTML代码等)

用法:
用法: jar
{ctxui}[vfm0Me] [jar-file] [manifest-file] [entry-point] [-C dir] files ...
选项包括:
-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/ .
测试的示例
1、创建一个测试类我们的目录是在
E:\webservice\domxml\src\sys\utils>javac
-d D:\classes HelloWorld.java
表示我们将我们编译生成的class文件放在D:\classes目录下面了。
2、进入到D:\classes\sys\utils目录发现确实是存在一个HelloWorld.class文件
通过DOS进入到这个目录
D:\classes\sys\utils>jar cvf hello.jar
HelloWorld.class
标明清单(manifest)
增加:HelloWorld.class(读入= 519) (写出= 350)(压缩了32%)
发现确实输出了一个hello.jar包进来了!
3、如何让这个JAR包正常运行起来!
利用ZIP工具来解压缩这个JAR包。打开文件发现我了一个META-INF目录。
里面有一个MANIFEST.MF文件。
文件内容:
Manifest-Version: 1.0
Created-By: 1.6.0_07
(Sun Microsystems Inc.)
就是这样。这里我们对它进行修改,加一句:Main-Class: HelloWorld (在第三行)。这个就是我们之前写的那个类,也就是我们的入口类。也即,
Manifest-Version: 1.0  Created-By: 1.4.2
(Sun Microsystems Inc.)  Main-Class: HelloWorld
修改之后的MF文件内容如下所示了~
但是我这样配置会有如下的错误:
D:\classes\sys\utils>jar umf MANIFEST.MF
hello.jar
java.io.FileNotFoundException: MANIFEST.MF
(系统找不到指定的文件。)
看来网上的很多文章还是应该要自己轻身去试验一下才知道是否正常的!
重新上GOOGLE一下找到了一篇IBM工程师的写文章应该不错先看看顺便整理一下相关的其他内容:
功能
命令
用一个单独的文件创建一个JAR文件
jar cf jar-file input-file...
用一个目录创建一个JAR文件
jar cf jar-file dir-name
创建一个未压缩的JAR文件
jar cf0 jar-file dir-name
更新一个JAR文件
jar uf jar-file input-file...
查看一个JAR文件的内容
jar tf jar-file
提取一个JAR文件的内容
jar xf jar-file
从一个JAR文件中提取特定的文件
jar xf jar-file archived-file...
运行一个打包为可执行JAR文件的应用程序
java -jar app.jar
以下我整理了三种情况分别是:一个类、两个类(同包)、两个类(不同包)
以下是我的整理:相比这篇文章有一个地方提高。
至少我的没有报IO异常。希望看到这篇文章有问题的GGMM们能够有所帮助。
第一步:写好JAVA类之后编译成CLASS文件
E:\webservice\domxml\src\sys\utils>javac
-d D:\classes HelloWorld.java
其中我的项目类包文件目录是在 E:\webservice\domxml\src\sys\utils下面
第二步:切换到D:\classes
编写一个文件 manifest.MF文件内容如下:
Main-Class: sys.utils.HelloWorld
能够指定好入口的主类文件
第三步:D:\classes>jar
cmf manifest.MF hello.jar sys/utils/HelloWorld.class
指定好相应的MF文件,打包编译输出一个JAR包
第四步:执行JAR包
D:\classes>java -jar hello.jar
进一步:如果这个包sys.utils里面有两个文件一个是HelloWorld它调用了另一个类Test这样的情况如何生成JAR归档文件呢?
第一步:编写完两上类文件,编译生成CLASS文件
E:\webservice\domxml\src\sys\utils>javac
-d D:\classes HelloWorld.java Test.java
同时编译两上CLASS文件。
第二步:切换到D盘的CLASS文件
直接生成JAR包
D:\classes>jar cmf manifest.MF hello.jar
sys/utils后面跟一个文件目录进来
第三步:执行JAR文件
D:\classes>java -jar hello.jar
更进一步:如果这个包的类调用外部包的一个类。如何实现
主类目录:E:\webservice\domxml\src\sys\utils
依赖目录:E:\webservice\domxml\src\sys\xml
第一步:写好代码。开始编译生成CLASS文件
第二步:编译依赖的类即 先编译E:\webservice\domxml\src\sys\xml里面的类
E:\webservice\domxml\src\sys\xml>javac
-d D:\classes Test.java
第三步:配置依赖包的环境变量。将这个类文件定义到环境变量里面去
set CLASSPATH = .;D:\classes
第四步:编译我们的主类
E:\webservice\domxml\src\sys\utils>javac
-d D:\classes HelloWorld.java
第五步:生成JAR文件
D:\classes>jar cmf manifest.MF hello.jar
sys/utils sys/xml
注意:这里面要将全部相依赖的包都一次性存档输出来。不要少了后面的sys/xml包
否则就会报错!
第六步:执行JAR文件
D:\classes>java -jar hello.jar
Out
补充其他内容:
1、扩展打包
表示当前的这个JAR文件能够使用其扩展的JAR文件。
Class-Path:
extension2.jar
这个头表明extension2.jar中的类是extension1.jar中的类的 扩展类。extension1.jar中的类可以调用extension2.jar中的类,并且不要求extension2.jar处在类路径中。
扩展JAR路径被解释为相对路径,所以一般来说,扩展JAR必须存储在引用它的JAR所在的同一目录中。(切记是相对路径)
我的整理:
第一步:编写完两个包中的两个类之后开始编译。
我的CLASS文件目录分别是:
主类:D:\classes\sys\utils
依赖:D:\classes\sys\xml
第二步:先生成依赖的JAR文件
D:\classes>jar cvftest.jar sys/xml得到了一个test.jar文件
第三步:编写一个清单配置文件内容如下
D:\classes>more manifest.MF
Manifest-Version: 1.0
Class-Path: test.jar指定了所依赖的这个JAR文件。此处配置的是相对路径
Main-Class: sys.utils.HelloWorld
第四步:生成我们的主JAR文件
D:\classes>jar cmf manifest.MF hello.jar
sys/utils
第五步:运行
总结:不需要设置CLASSPATH。只需要将所依赖的其他JAR包配置进来就Ok
其他的一些常用命令
1、察看jar文件
D:\classes>jar tf hello.jar带上参数就能够实现查看JAR包里面的文件
META-INF/
META-INF/MANIFEST.MF
sys/utils/
sys/utils/HelloWorld.class
2、提取JAR文件
D:\classes>jar xf hello.jar
D:\classes>dir
驱动器D中的卷没有标签。
卷的序列号是56B6-84E7
D:\classes的目录
2009-12-1416:20.
2009-12-1416:20..
2009-12-1416:02928 hello.jar
2009-12-1416:0179
manifest.MF
2009-12-1416:02META-INF
2009-12-1415:46sys
2009-12-1416:00836 test.jar
2009-12-1414:47xml
3个文件1,843字节
5个目录26,403,553,280可用字节
有关JAVA中的JAR工具整理到此!将来有更好的文章可以补充进来!
[补充2010-1-5]
一、编写自己的JAR工具包让C/S与B/S架构应用篇整理
1.1编写C/S结构的JAR包
编写自己的工具类
E:\javatools\JavaUtils\src\xml\utils\XMLUtils.java目录在此
其中代码如下:
packagexml.utils;
publicclassXMLUtils {
publicString test() {
return"hello";
}
publicintmax(inta,intb) {
return(a>b)?a:b;
}
}
第二步:将此JAVA源文件打包成一个JAR
我们是借助于Eclipse工具进行的。操作如下:
右键项目名称-àexpore-àjava-àjar包。就可以将自己的一些常用代码导出来成一些JAR文件了。我是放在F:/TEST.JAR
第三步:在应用中应用此jar包。方法就是只需要配置一下JAR的环境变量就行了!
linux中的jar命令
时间:2010-6-17
打包命令:
jar cvfm mailty.jar manifest.mf
SendMail.class PopupAuthenticator.class
注意了这里面的重头戏是要注意manifest.mf的编写。
Main-Class: SendMail
要注意这里面的要有空隔符的。如果没有空格符的话就会报IO异常!
Main-Class: test.Test ;
如何运行?
java -jar mailty.jar
结果报:Exception
in thread "main" java.lang.NoClassDefFoundError:
javax/mail/Authenticator
难道是说我们在打包的时候还需要指定JAVA的环境变量吗?它找不到类了?
整理我的实战经验
1、打包
我的代码没有封装到package里面的。还比较简单一点了!
编写MF文件内容如下
Manifest-Version:
1.0
Created-By: hkebao
Main-Class: SendMail
Class-Path:
/usr/java/jre/activation.jar /usr/java/jre/mail.jar
说明:如果你的jar文件依赖于第三方包如我的依赖于mail.jar包。所以我们要在这里面配置好这两个jar包。
打包:jar cvfm
mailty.jar manifest.mf SendMail.class PopupAuthenticator.class

生成了一个jar文件了。

2、执行

java -jar mailty.jar这样就可以收到邮件了!

后面我还会补充一些使用规则的。