全部博文(2065)
分类: Java
2010-01-05 09:37:02
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:
就是这样。这里我们对它进行修改,加一句:Main-Class: HelloWorld (在第三行)。这个就是我们之前写的那个类,也就是我们的入口类。也即,
Manifest-Version: 1.0
Created-By:
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 cvf test.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-14
16:20
2009-12-14
16:20
2009-12-14 16:02 928 hello.jar
2009-12-14 16:01 79 manifest.MF
2009-12-14
16:02
2009-12-14
15:46
2009-12-14 16:00 836 test.jar
2009-12-14
14:47
3 个文件 1,843 字节
5 个目录 26,403,553,280 可用字节
有关JAVA中的JAR工具整理到此!将来有更好的文章可以补充进来!
[补充
一、编写自己的JAR工具包让C/S与B/S架构应用篇整理
1.1 编写C/S结构的JAR包
编写自己的工具类
E:\javatools\JavaUtils\src\xml\utils\XMLUtils.java 目录在此
其中代码如下:
package xml.utils;
public class XMLUtils {
public String test() {
return "hello";
}
public int max(int a,int b) {
return (a>b)?a:b;
}
}
第二步:将此JAVA源文件打包成一个JAR
我们是借助于Eclipse工具进行的。操作如下:
右键项目名称-àexpore-àjava-àjar 包。就可以将自己的一些常用代码导出来成一些JAR文件了。我是放在F:/TEST.JAR
第三步:在应用中应用此jar包。方法就是只需要配置一下JAR的环境变量就行了!
linux中的jar命令
时间:
打包命令:
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 这样就可以收到邮件了!
后面我还会补充一些使用规则的。