Jar (Java Archive File, java归档文件),它其实也是一个zip文件。它包括了一个可选的META-INF目录。可以使用命令行中的jar命令来生成一个jar文件,也可以使用java.util.jar API来生成一个归档文件。
Jar文件中META-INF目录的作用:应用配置、扩展、类加载器、提供服务。在这个目录下,主要有下列几个文件(或者目录):
MANIFEST.MF
是一个清单文件,定义了扩展和与包相关的信息
INDEX.LIST
它是JarIndex实现的一部分,类加载器使用它可以提高加载速度
x.SF
签名文件
x.DSA
数字签名
service/
存放的是service provider配置文件
例如:
1)mysql-jdbc.jar
2)servlet-api.jar
3)activemq-all.jar
MANIFEST 中的主要属性
先来看看mysql-jdbc.jar中的MANIFEST.MF文件:
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.8.2
Created-By: 1.5.0_22-b03 (Sun Microsystems Inc.)
Built-By: pb2user
Bundle-Vendor: Oracle Corporation
Bundle-Classpath: .
Bundle-Version: 5.1.31
Bundle-Name: Oracle Corporation' JDBC Driver for MySQL
Bundle-ManifestVersion: 2
Bundle-SymbolicName: com.mysql.jdbc
Export-Package: com.mysql.jdbc;version="5.1.31";uses:="com.mysql.jdbc.
log,javax.naming,.ssl,javax.xml.transform,org.xml.sax",com.m
ysql.jdbc.jdbc2.optional;version="5.1.31";uses:="com.mysql.jdbc,com.m
ysql.jdbc.log,javax.naming,javax.sql,javax.transaction.xa",com.mysql.
jdbc.log;version="5.1.31",com.mysql.jdbc.profiler;version="5.1.31";us
es:="com.mysql.jdbc",com.mysql.jdbc.util;version="5.1.31";uses:="com.
mysql.jdbc.log",com.mysql.jdbc.exceptions;version="5.1.31",com.mysql.
jdbc.exceptions.jdbc4;version="5.1.31";uses:="com.mysql.jdbc",com.mys
ql.jdbc.interceptors;version="5.1.31";uses:="com.mysql.jdbc",com.mysq
l.jdbc.integration.c3p0;version="5.1.31",com.mysql.jdbc.integration.j
boss;version="5.1.31",com.mysql.jdbc.configs;version="5.1.31",org.gjt
.mm.mysql;version="5.1.31"
Import-Package: ,.ssl;version="[1.0.1, 2.0.0)";resol
ution:=optional,javax.xml.parsers, javax.xml.stream,javax.xml.transfo
rm,javax.xml.transform.dom,javax.xml.transform.sax,javax.xml.transfor
m.stax,javax.xml.transform.stream,org.w3c.dom,org.xml.sax,org.xml.sax
.helpers;resolution:=optional,javax.naming,javax.naming.spi,javax.sql
,javax.transaction.xa;version="[1.0.1, 2.0.0)";resolution:=optional,c
om.mchange.v2.c3p0;version="[0.9.1.2, 1.0.0)";resolution:=optional,or
g.jboss.resource.adapter.jdbc;resolution:=optional,org.jboss.resource
.adapter.jdbc.vendor;resolution:=optional
Name: common
Specification-Title: JDBC
Specification-Version: 4.0
Specification-Vendor: Oracle Corporation
Implementation-Title: MySQL Connector Java
Implementation-Version: 5.1.31
Implementation-Vendor-Id: com.mysql
Implementation-Vendor: Oracle
上面文件中Bundle-*是OSGi的内容,这里不作说明。
Manifest-Version: 是清单文件的版本。不是jar包的版本。
Created-By: jar包创建者。
Main-Class:jar包中的主类。是应用程序的入口,这个属性只在jar作为一个独立的java 应用时使用。
Specification-* 代表Java标准中的说明信息。
Implementation-* 代表该Jar包是某个Java标准的实现。
Mysql-jdbc.jar中的信息就可以理解为:MySql-jdbc-5.1.31.jar中是JDBC 4.0标准的实现。
同理:servlet.jar中的MANIFEST.MF如下:
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.9.4
Created-By: 1.5.0_22-b03 (Sun Microsystems Inc.)
X-Compile-Source-JDK: 1.5
X-Compile-Target-JDK: 1.5
Name: javax/servlet/
Specification-Title: Java API for Servlets
Specification-Version: 2.5
Specification-Vendor: Sun Microsystems, Inc.
Implementation-Title: javax.servlet
Implementation-Version: 2.5.MR2
Implementation-Vendor: Apache Software Foundation
意思就是:由ASF实现的servlet-api.jar是对java标准中的Servlets的实现。
另外,还有一个主要的属性Sealed:这个表示jar文件中的pacakage是否是密封的。
下面是两个清单文件:
清单一:整个jar是密封的。
Manifest-Version: 1.0
Sealed: true
清单二:指定的package是密封的:
Manifest-Version: 1.0
Name: com/fjn/java/util/jar/
Sealed: true
Jar包中,只有com/fjn/java/util/jar包是密封的。
清单三:
Manifest-Version: 1.0
Sealed: true
Name: com/fjn/java/util/jar/
Sealed: false
整个jar包中,只有com/fjn/java/util/jar包不是密封的,其余的都是密封的。