Jar
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不能指定通配符。