Chinaunix首页 | 论坛 | 博客
  • 博客访问: 26266956
  • 博文数量: 2065
  • 博客积分: 10377
  • 博客等级: 上将
  • 技术积分: 21525
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-04 17:50
文章分类

全部博文(2065)

文章存档

2012年(2)

2011年(19)

2010年(1160)

2009年(969)

2008年(153)

分类: 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: 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 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   

          META-INF

2009-12-14  15:46   

          sys

2009-12-14  16:00               836 test.jar

2009-12-14  14:47   

          xml

               3 个文件          1,843 字节

               5 个目录 26,403,553,280 可用字节

 

 

有关JAVA中的JAR工具整理到此!将来有更好的文章可以补充进来!



[补充2010-1-5]

一、编写自己的JAR工具包让C/SB/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命令

时间: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            这样就可以收到邮件了!

 

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


阅读(1980) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~