Jar

Published: by Creative Commons Licence

  • Tags:

jar介绍

jar文件时java文件的压缩文档。为了提供存档的信息,jar文件指定了一个特定目录来存放标签信息:META-INF目录,其中该目录下的MANIFEST.MF文件包含了对JAR文件的内容描述,并在运行时向JVM提供应用程序的信息。

manifest文件的格式非常简单,每一行都是name:value的形式的键值对,每行最多72个字符,如果一行无法完整表示可以在第二行继续,但是第二行开始必须带缩进,比如:

User-name: daling
 tao

manifest有一些比较有意义的属性:

Main-Class

我们无法直接执行jar文件,我们必须要指定类名:

java -classpath myapplication.jar com.example.myapp.MyAppMain

这也很不方便,因为使用者不一定能记住复杂的类名和其完整路径。但是如果我们在jar文件中的Manifest文件中写入Main-Class属性,比如

Main-Class:com.example.myapp.MyAppMain

那么我们可以直接利用下面的命令来执行MyAppMain这个类:

java -jar myapplication.jar

Class-Path

一个jar包一般无法直接运行,需要依赖其他包的内容,因此我们执行App时必须指定classpath属性。

java -classpath mail.jar:activation.jar com.example.myapp.MyAppMain

其中:是UNIX系统使用分隔符,而在window中则使用;

使用-jar模式执行jar包时,要简单的多。我们执行的在-jar执行模式下-cp和-classpath以及环境变量中指定的classpath都会无效化。但是在jar包的manifest文件中中我们可以指定类路径,无论是什么系统,均使用空格作为分隔符,而路径分隔符则为/

Main-Class:com.example.myapp.MyAppMain
Class-Path:mail.jar lib/activation.jar

这也我们可以直接执行jar文件而无需提供classpath。

注意在命令行指定classpath的情况下,我们可以使用通配符*匹配多个jar包,其规则如下:/lib/*匹配dir目录下所有的jar文件(仅含一级)。该命令不包含class文件,如果要包含dir下的所有class文件,应该如此写:/classes(直接写目录)。但是在Manifest中的Main-Class不能指定通配符。