视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
制作可执行的JAR文件包及JAR命令详解ZT
2025-10-05 10:05:06 责编:小OO
文档
制作可执行的JAR文件包及jar命令详解zt

常常在网上看到有人询问:如何把java程序编译成.exe文件。通常回答只有两种,一种是制作一个可执行的JAR文件包,然后就可以像.chm文档一样双击运行了;而另一种是使用JET来进行编译。但是JET是要用钱买的,而且据说JET也不是能把所有的Java 程序都编译成执行文件,性能也要打些折扣。所以,使用制作可执行JAR文件包的方法就是最佳选择了,何况它还能保持Java的跨平台特性。

下面就来看看什么是JAR文件包吧:

1.JAR文件包

JAR文件就是Java Archive File,顾名思意,它的应用是与Java息息相关的,是Java的一种文档格式。JAR文件非常类似ZIP文件——准确的说,它就是ZIP文件,所以叫它文件包。JAR文件与ZIP文件唯一的区别就是在JAR文件的内容中,包含了一个META-INF/MANIFEST.MF文件,这个文件是在生成JAR文件的时候自动创建的。举个例子,如果我们具有如下目录结构的一些文件:

==

`--test

`--Test.class

把它压缩成ZIP文件test.zip,则这个ZIP文件的内部目录结构为:

test.zip

`--test

`--Test.class

如果我们使用JDK的jar命令把它打成JAR文件包test.jar,则这个JAR文件的内部目录结构为:

test.jar

|--META-INF

|`--MANIFEST.MF

`--test

`--Test.class2.创建可执行的JAR文件包

制作一个可执行的JAR文件包来发布你的程序是JAR文件包最典型的用法。

Java程序是由若干个.class文件组成的。这些.class文件必须根据它们所属的包不同而分级分目录存放;运行前需要把所有用到的包的根目录指定给CLASSPATH环境变量或者java命令的-cp参数;运行时还要到控制台下去使用java命令来运行,如果需要直接双击运行必须写Windows的批处理文件(.bat)或者Linux的Shell程序。因此,许多人说,Java是一种方便开发者苦了用户的程序设计语言。

其实不然,如果开发者能够制作一个可执行的JAR文件包交给用户,那么用户使用起来就方便了。在Windows下安装JRE(Java Runtime Environment)的时候,安装文件会将.jar 文件映射给javaw.exe打开。那么,对于一个可执行的JAR文件包,用户只需要双击它就可以运行程序了,和阅读.chm文档一样方便(.chm文档默认是由hh.exe打开的)。那么,现在的关键,就是如何来创建这个可执行的JAR文件包。

创建可执行的JAR文件包,需要使用带cvfm参数的jar命令,同样以上述test目录为例,命令如下:

jar cvfm test.jar manifest.mf test

这里test.jar和manifest.mf两个文件,分别是对应的参数f和m,其重头戏在manifest.mf。因为要创建可执行的JAR文件包,光靠指定一个manifest.mf文件是不够的,因为MANIFEST是JAR文件包的特征,可执行的JAR文件包和不可执行的JAR文件包都包含MANIFEST。关键在于可执行JAR文件包的MANIFEST,其内容包含了Main-Class一项。这在MANIFEST中书写格式如下:

Main-Class:可执行主类全名(包含包名)

例如,假设上例中的Test.class是属于test包的,而且是可执行的类(定义了public static void main(String[])方法),那么这个manifest.mf可以编辑如下:

Main-Class:test.Test<回车>;

这个manifest.mf可以放在任何位置,也可以是其它的文件名,只需要有Main-Class: test.Test一行,且该行以一个回车符结束即可。创建了manifest.mf文件之后,我们的目录结构变为:

==

|--test

|`--Test.class`--manifest.mf

这时候,需要到test目录的上级目录中去使用jar命令来创建JAR文件包。也就是在目录树中使用“==”表示的那个目录中,使用如下命令:

jar cvfm test.jar manifest.mf test

之后在“==”目录中创建了test.jar,这个test.jar就是执行的JAR文件包。运行时只需要使用java-jar test.jar命令即可。

需要注意的是,创建的JAR文件包中需要包含完整的、与Java程序的包结构对应的目录结构,就像上例一样。而Main-Class指定的类,也必须是完整的、包含包路径的类名,如上例的test.Test;而且在没有打成JAR文件包之前可以使用java<类名>;来运行这个类,即在上例中java test.Test是可以正确运行的(当然要在CLASSPATH正确的情况下)。

3.jar命令详解

jar是随JDK安装的,在JDK安装目录下的bin目录中,Windows下文件名为jar.exe,Linux下文件名为jar。它的运行需要用到JDK安装目录下lib目录中的tools.jar文件。不过我们除了安装JDK什么也不需要做,因为SUN已经帮我们做好了。我们甚至不需要将tools.jar放到CLASSPATH中。

使用不带任何的jar命令我们可以看到jar命令的用法如下:

jar{ctxu}[vfm0M][jar-文件][manifest-文件][-C目录]文件名...

其中{ctxu}是jar命令的子命令,每次jar命令只能包含ctxu中的一个,它们分别表示:

-c创建新的JAR文件包

-t列出JAR文件包的内容列表

-x展开JAR文件包的指定文件或者所有文件

-u更新已存在的JAR文件包(添加文件到JAR文件包中)

[vfm0M]中的选项可以任选,也可以不选,它们是jar命令的选项参数

-v生成详细报告并打印到标准输出

-f指定JAR文件名,通常这个参数是必须的

-m指定需要包含的MANIFEST清单文件-0只存储,不压缩,这样产生的JAR文件包会比不用该参数产生的体积大,但速度更快-M不产生所有项的清单(MANIFEST〕文件,此参数会忽略-m参数

[jar-文件]即需要生成、查看、更新或者解开的JAR文件包,它是-f参数的附属参数[manifest-文件]即MANIFEST清单文件,它是-m参数的附属参数

[-C目录]表示转到指定目录下去执行这个jar命令的操作。它相当于先使用cd命令转该目录下再执行不带-C参数的jar命令,它只能在创建和更新JAR文件包的时候可用。

文件名...指定一个文件/目录列表,这些文件/目录就是要添加到JAR文件包中的文件/目录。如果指定了目录,那么jar命令打包的时候会自动把该目录中的所有文件和子目录打入包中。

下面举一些例子来说明jar命令的用法:

1)jar cf test.jar test

该命令没有执行过程的显示,执行结果是在当前目录生成了test.jar文件。如果当前目录已经存在test.jar,那么该文件将被覆盖。

2)jar cvf test.jar test

该命令与上例中的结果相同,但是由于v参数的作用,显示出了打包过程,如下:

标明清单(manifest)

增加:test/(读入=0)(写出=0)(存储了0%)

增加:test/Test.class(读入=7)(写出=6)(压缩了14%)

3)jar cvfM test.jar test

该命令与2)结果类似,但在生成的test.jar中没有包含META-INF/MANIFEST文件,打包过程的信息也略有差别:

增加:test/(读入=0)(写出=0)(存储了0%)

增加:test/Test.class(读入=7)(写出=6)(压缩了14%)

4)jar cvfm test.jar manifest.mf test运行结果与2)相似,显示信息也相同,只是生成JAR包中的META-INF/MANIFEST内容不同,是包含了manifest.mf的内容

5)jar tf test.jar

在test.jar已经存在的情况下,可以查看test.jar中的内容,如对于2)和3)生成的test.jar 分别应该此命令,结果如下;

对于2)

META-INF/

META-INF/MANIFEST.MF

test/

test/Test.class

对于3)

test/

test/Test.class

6)jar tvf test.jar

除显示5)中显示的内容外,还包括包内文件的详细信息,如:

0Wed Jun1915:39:06GMT2002META-INF/

86Wed Jun1915:39:06GMT2002META-INF/MANIFEST.MF

0Wed Jun1915:33:04GMT2002test/

7Wed Jun1915:33:04GMT2002test/Test.class

7)jar xf test.jar

解开test.jar到当前目录,不显示任何信息,对于2)生成的test.jar,解开后的目录结构如下:

==

|--META-INF|`--MANIFEST

`--test

`--Test.class

jar xvf test.jar

运行结果与7)相同,对于解压过程有详细信息显示,如:

创建:META-INF/

展开:META-INF/MANIFEST.MF

创建:test/

展开:test/Test.class

9)jar uf test.jar manifest.mf

在test.jar中添加了文件manifest.mf,此使用jar tf来查看test.jar可以发现test.jar中比原来多了一个manifest。这里顺便提一下,如果使用-m参数并指定manifest.mf文件,那么manifest.mf是作为清单文件MANIFEST来使用的,它的内容会被添加到MANIFEST 中;但是,如果作为一般文件添加到JAR文件包中,它跟一般文件无异。

10)jar uvf test.jar manifest.mf

与9)结果相同,同时有详细信息显示,如:

增加:manifest.mf(读入=17)(写出=19)(压缩了-11%)

4.关于JAR文件包的一些技巧

1)使用unzip来解压JAR文件

在介绍JAR文件的时候就已经说过了,JAR文件实际上就是ZIP文件,所以可以使用常见的一些解压ZIP文件的工具来解压JAR文件,如Windows下的WinZip、WinRAR等和Linux下的unzip等。使用WinZip和WinRAR等来解压是因为它们解压比较直观,方便。而使用unzip,则是因为它解压时可以使用-d参数指定目标目录。

在解压一个JAR文件的时候是不能使用jar的-C参数来指定解压的目标的,因为-C参数只在创建或者更新包的时候可用。那么需要将文件解压到某个指定目录下的时候就需要先将这具JAR文件拷贝到目标目录下,再进行解压,比较麻烦。如果使用unzip,就不需要

这么麻烦了,只需要指定一个-d参数即可。如:

unzip test.jar-d dest/

2)使用WinZip或者WinRAR等工具创建JAR文件

上面提到JAR文件就是包含了META-INF/MANIFEST的ZIP文件,所以,只需要使用WinZip、WinRAR等工具创建所需要ZIP压缩包,再往这个ZIP压缩包中添加一个包含MANIFEST文件的META-INF目录即可。对于使用jar命令的-m参数指定清单文件的情况,只需要将这个MANIFEST按需要修改即可。

3)使用jar命令创建ZIP文件

有些Linux下提供了unzip命令,但没有zip命令,所以需要可以对ZIP文件进行解压,即不能创建ZIP文件。如要创建一个ZIP文件,使用带-M参数的jar命令即可,因为-M 参数表示制作JAR包的时候不添加MANIFEST清单,那么只需要在指定目标JAR文件的地方将.jar扩展名改为.zip扩展名,创建的就是一个不折不扣的ZIP文件了,如将上一节的第3)个例子略作改动:

jar cvfM test.zip test

【分享】我想JAVA的爱好者,尤其是初学者大都有过这样的经历,就是喜欢JAVA编程语言(这个人的情况可能不一样),但是有时候总会觉得JAV A的优点便是她的“致命”的缺点。大家的信念依旧是“一次编译,到处运行”但是就是因为至一点JAVA失去了好多,我们也失去了好多。也许大家都知道,现在业界最推崇的还是微软的技术微软的产品。.net/c#/.vb/vb.net还是最流行的语言,最受欢迎的软件开发语言。因为这些语言都太好学太好用了。不像JAVA语言那么难懂难用。在软件开发提出高效的组件开发的时候,人们都很难想象用JAV A的EJB就行开发,因为不成熟的技术和不健全的API,让程序员很难入手。虽然有JBuilder这样优秀的开发工具,但是有时还是很难着手的(因为他们的体系太复杂,对于一般人来说会有一点的难度,当想开发应用程序的时候)。JAV A 的体系够复杂了。因为“跨平台=性”所以JAV A语言或者说JDK不支持产生.exe文件的相应的API(应为生成.exe文件总要和系统的硬件相关,这是JAV A语言所不用许的)。不过你也没有必要失望,你但可以使用JBuilder或者IBM和软软的支持JAVA语言开开的工具就行程序开发与设计,或者采用JAVA的.jar技术进行相关的操作,即生成“双击就可以运行的.jar文件”,这不失一件很好的事情。(据我了解JBuilder是不能运行在256内存的机器上的,可见实在太耗内存)。好了,现在咱们言归正传。总之。jar文件还是很管用的。下让面咱们开始进入主题。

一、制作jar文件

在制作.jar文件之前你必须先编译好你的.java文件。假设我们的文件目录是c:\\java\\myJava\\hello\\Hello.java

现在假设Hello.java的文件内容为:/*

*

*Hello.java

*

*/

public class Hello{

public static void mian(String[]args){

System.out.println("Hello,World!");

}

}

在进行.jar制作的时候你必须把路径切换到Hello.java所在的文件目录的外一层文件夹(.jar 文件要在Dos才能创建(windows平台)),即myJava

运行如下的命令可以把当前文件夹下的所有内容都包含在.jar文件内。

c:\\java\\myJava>jar cf Hello.jar.

说明一下:命令行中jar是生成.jar文件的程序的调用接口。cf是一对可选项(options)后面的Hello.jar就是我们给文件取的名字了,最后一个点号(.)指示工具将当前目录下的所有文件都放进jar文件,jar工具进行地归操作,当文件夹中含有不止一个文件时。

二、察看jar文件

其实,jar文件是采用WinZip的格式进行文件压缩的,所以你可采用WinZip解压缩文件的,还可以利用如下的命令行察看:

c:\\java\\myJava>jar tf Hello.jar

你会看到本地机子里的jvm的版本以及其生产厂家信息

还有Main-Class:Hello.Hello等信息。

三、把文件移到你喜欢的目录

假设你想把jar文件移到目录:d:\\Java2\\myFirst下面,请运行如下的命令:

d:\\Java2\\myFirst>jar xf c:\\java\\Hello.jar

说明一下:jar文件可以封闭,就意味着指定的包中的每一个类必须包含在同一个目录下。

四:内容清单manifest.fm

manifest.fm文件是由键值对组成的。其中包含前面所说的jvm的版本号/创建他的厂商等。

五、增加清单的内容

当若我们编辑了如下的一个addContents.txt文件

Name:myJava\\Hello\

Sealed:true

则可以通过如下命令把其加入到我们的清单文件中:

c:\\java\\myJava>jar umf addContents.txt Hello.jar

六、运行jar文件

你可以通过以下的方式来运行jar文件:

c:\\java\\myJava>java-classpath.-jar Hello.jar

说明:需要命令的-classpath.部分是因为类的路径环境变量中没有(.)路径。

也可以

c:\\java\\myJava\\Hello>java-jar Hello.jar

如果你的电脑是windows xp版本你还可以直接到你的c:\\java\\myJava\\Hello下双击Hello.jar文件但是你看不到运行的结果

(图形界面程序可以这样运行),在windows2000上面,jar文件被视作.zip文件所以你一双击他就会把你的文件解压,而不是运行文件。所以你只有采用命令行的方式了。

运行命令之后,你会看到在你的屏幕上显示的

Hello,World!

字样。

结束语:

到这里我们jar文件的创建和运行等相关的介绍算结束了。你可以试着去验证一下。然后创建复杂的程序,比如具有界面的高级程序。

如果你对jar文件很感兴趣或者想对她有更深刻的了解那么你可以在dos低下敲入jar 察看更多的帮助信息和许多options的解释。

jar帮组文档内容:

C:\\>jar

用法:jar{ctxu}[vfm0Mi][jar-文件][manifest-文件][-C目录]文件名...

选项:

-c创建新的存档

-t列出存档内容的列表

-x展开存档中的命名的(或所有的〕文件

-u更新已存在的存档

-v生成详细输出到标准输出上

-f指定存档文件名

-m包含来自标明文件的标明信息

-0只存储方式;未用ZIP压缩格式

-M不产生所有项的清单(manifest〕文件

-i为指定的jar文件产生索引信息

-C改变到指定的目录,并且包含下列文件:

如果一个文件名是一个目录,它将被递归处理。

清单(manifest〕文件名和存档文件名都需要被指定,按'm'和'f'标志指定的相同顺序。示例1:将两个class文件存档到一个名为'classes.jar'的存档文件中:

jar cvf classes.jar Foo.class Bar.class

示例2:用一个存在的清单(manifest)文件'mymanifest'将foo/目录下的所有

文件存档到一个名为'classes.jar'的存档文件中:

jar cvfm classes.jar mymanifest-C foo/.下载本文

显示全文
专题