標籤:
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.0Ant-Version: Apache Ant 1.8.2Created-By: 1.5.0_22-b03 (Sun Microsystems Inc.)Built-By: pb2userBundle-Vendor: Oracle CorporationBundle-Classpath: .Bundle-Version: 5.1.31Bundle-Name: Oracle Corporation‘ JDBC Driver for MySQLBundle-ManifestVersion: 2Bundle-SymbolicName: com.mysql.jdbcExport-Package: com.mysql.jdbc;version="5.1.31";uses:="com.mysql.jdbc. log,javax.naming,javax.net.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: javax.net,javax.net.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:=optionalName: commonSpecification-Title: JDBCSpecification-Version: 4.0Specification-Vendor: Oracle CorporationImplementation-Title: MySQL Connector JavaImplementation-Version: 5.1.31Implementation-Vendor-Id: com.mysqlImplementation-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.0Ant-Version: Apache Ant 1.9.4Created-By: 1.5.0_22-b03 (Sun Microsystems Inc.)X-Compile-Source-JDK: 1.5X-Compile-Target-JDK: 1.5Name: javax/servlet/Specification-Title: Java API for ServletsSpecification-Version: 2.5Specification-Vendor: Sun Microsystems, Inc.Implementation-Title: javax.servletImplementation-Version: 2.5.MR2Implementation-Vendor: Apache Software Foundation
意思就是:由ASF實現的servlet-api.jar是對java標準中的Servlets的實現。
另外,還有一個主要的屬性Sealed:這個表示jar檔案中的pacakage是否是密封的。
下面是兩個資訊清單檔:
清單一:整個jar是密封的。
Manifest-Version: 1.0Sealed: true
清單二:指定的package是密封的:
Manifest-Version: 1.0Name: com/fjn/java/util/jar/Sealed: true
Jar包中,只有com/fjn/java/util/jar包是密封的。
清單三:
Manifest-Version: 1.0Sealed: trueName: com/fjn/java/util/jar/Sealed: false
整個jar包中,只有com/fjn/java/util/jar包不是密封的,其餘的都是密封的。
Java Jar :Manifest