`

Jar文件及MANIFEST.MF 文件入门

阅读更多

 

前言
     在看Btrace相关源代码的时,才认识到MANIFEST.MF是有很大用途的,以前对jar文件没多大了解,现在有空也整理下相关的资料。
 
Jar文件简介    
     Jar文件的本质是zip 文件,其中包含了META-INFO文件夹。Jar文件可以用jar工具或者java.util.jar API 来创建。Jar的文件名没有任何限制。
     Jar文件不单仅仅用来压缩class文件或者资源文件,还可以用来限制或者扩展应用程序。如果jar文件中含有META-INFO文件夹,它常常用来存储包或者配置文件,包括安全、版本、扩展、组件。
     Java2平台能够识别并解析META-INFO 文件夹下的下面文件,以便于配置应用程序、扩展和类装载器: 
MANIEFEST.MF:用来定义扩展和包相关的数据。
INDEX.LIST:这个文件由jar工具的选项 -i 生成的,它包含在应用程序或者扩展中定义的包的位置信息。它是JarIndex实现的一部分,并由类装载器用于加速类装载的过程。
x.SF:jar的签名文件。x表示文件名称
x.DSA:签名块文件,和签名文件关联,文件名和签名文件一样。该文件主要用于储存类似数字签名文件。
services/:储存所有服务提供者的配置文件。
     配置文件时由键值对组成的(name: value),遵循RFC822标准。二进制的数据要求是base64的。如果出现两个相同的键,则最后一个才能被识别。
 
常见的MANIFEST.MF 键值对
Manifest-Version: manifest的版本
Created-By: java 实现版本,一般由jar工具生成。
Class-Path : 扩展包的路径,主要为绝对路径或者相对路径,当指定该参数时,可以不设置classpath也能找到该扩展包
Main-Class : main方法类 
 
安全相关
Sealed : 指定jar是否封闭,如果为true,则不能jar包中的类不能访问其他包的类。可以指定特定的包
 
例如:
Manifest-Version: 1.0
Created-By: 1.2 (Sun Microsystems Inc.)
Sealed: true 
Name: foo/bar/
Sealed: false
这样指的是除了foo.bar包以外的类,都被封闭。
 
agent相关
Premain-Class : 如果 JVM 启动时指定了代理,那么此属性指定代理类,即包含 premain 方法的类。如果 JVM 启动时指定了代理,那么此属性是必需的。如果该属性不存在,那么 JVM 将中止。注:此属性是类名,不是文件名或路径。 
Agent-Class : 如果实现支持 VM 启动之后某一时刻启动代理的机制,那么此属性指定代理类。 即包含 agentmain 方法的类。 此属性是必需的,如果不存在,代理将无法启动。 注:这是类名,而不是文件名或路径。 
Boot-Class-Path:  由引导类加载器搜索的路径列表。路径表示目录或库(在许多平台上通常作为 JAR 或 zip 库被引用)。查找类的特定于平台的机制失败后,引导类加载器会搜索这些路径。按列出的顺序搜索路径。列表中的路径由一个或多个空格分开。路径使用分层 URI 的路径组件语法。如果该路径以斜杠字符(“/”)开头,则为绝对路径,否则为相对路径。相对路径根据代理 JAR 文件的绝对路径解析。忽略格式不正确的路径和不存在的路径。如果代理是在 VM 启动之后某一时刻启动的,则忽略不表示 JAR 文件的路径。此属性是可选的。 
Can-Redefine-Classes : 布尔值(true 或 false,与大小写无关)。是否能重定义此代理所需的类。true 以外的值均被视为 false。此属性是可选的,默认值为 false。 
Can-Retransform-Classes: 布尔值(true 或 false,与大小写无关)。是否能重转换此代理所需的类。true 以外的值均被视为 false。此属性是可选的,默认值为 false。 
Can-Set-Native-Method-Prefix: 布尔值(true 或 false,与大小写无关)。是否能设置此代理所需的本机方法前缀。true 以外的值均被视为 false。此属性是可选的,默认值为 false。  
 
     代理 JAR 文件在清单中可以同时出现 Premain-Class 和 Agent-Class 属性。如果代理是使用 -javaagent 选项在命令行上启动的,那么 Premain-Class 属性指定代理类的名称,Agent-Class 属性将被忽略。类似地,如果代理是在 VM 启动后某一时刻启动的,那么 Agent-Class 属性指定代理类的名称(Premain-Class 属性的值将被忽略)。 
 
参考文档:
具体代理jar文档可参考:http://docs.oracle.com/javase/6/docs/api/index.html (或者Java API文档java.lang.instrument包说明)
关于签名和services,可以参考jar 规范:http://docs.oracle.com/javase/1.4.2/docs/guide/jar/jar.html
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics