疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Java Archive中规格和使用清单


 

  得益于Ant、Maven等构建工具的强大功能,我们无需每天冗繁的手动通过jar命令来打包Java class和资源文件,软件的日常打包部署通常都交给它们处理了。不过最近遇到点构建的问题,查了JAR相关的一些文章。在此做一个总结,对JAR有兴趣的朋友可以一看。

  什么是JAR

  JAR全称为Java Archive,zip格式的Java打包文件。目的是用来把class文件,资源文件打包成一个文件,利于部署,发布,以及传输。除了打包功能,它被用来构建应用组件(Application Blocks),构建Java扩展(Extension)。此外还包含一个可选的META-INFO目录 ,可以用来存储版本(Version),安全(Security, signer),索引(Index),服务(Services)等信息。JAR可以通过的jar命令或者java.util.jar API生成。

  JAR的常用命令 打包一个或者多个文件

  jar cvf example.jar class1.class class2.class打包文件夹

  jar cvf example.jar -C build/ .查看JAR的目录(内容)

  jar tf example.jar解压JAR文件

  jar xf example.jar运行可执行的JAR文件

  jar -jar example.jar为JAR文件添加索引

  jar i exaple.jar指定MANIFEST.MF打包

  jar cvfm example.jar MyMANIFEST.MF -C build/ .

  可选META-INFO文件夹的格式说明

  JAR包含一个可选的META-INF,不过JAR与ZIP的区别正在于此。所有的配置信息都存于该目录。主要包括以下一些文件以及文件夹:

  MANIFEST.MF

  最重要的的配置文件,存储版本,创建者,包等信息。INDEX.LIST

  JAR的索引信息,加快JVM搜索和加载class的速度,可选,通过i可选项产生。key.SF 和key.DSA

  key.SF为签名文件,key.DSA为key.SF对应的加密数据块(二进制数据,以base64编码存储),key为keytool生成的key的名称。services 文件夹

  存储Service Provider的配置信息

  了解MANIFEST.MF

  由一个主区以及不限数目的个性化区(Section)组成。个性化区可以覆盖主区的值。所有的配置信息都是键值对(Key:Value),区之间用空行隔开。

  主区(Main Section)属性: Manifest-Version

  版本号,如1.0.0Create-By

  创建者,如 1.6.0_35 (Sun Microsystems Inc.)Class-Path

  JVM搜索class的路径,值得强调的是默认为相对路径,并且环境变量以及命令行参数传入的class-path无效了,被覆盖(Override)了。多个 lib之间用空格隔开。如lib/slf4j-api-1.6.4.jar lib/log4j-1.2.16.jarMain-Class

  可执行JAR包的入口类名,含包名。如 com.example.Start

  个性化区(Individual Section)属性:

  个性化区域都以Name:开始 ,标记配置的时哪一个文件或者文件夹。比如: Name: com.example.Start。除了主区的属性外还包括:

  Sealed

  Sealed: true表示所有package内的class都需要在当前JAR包找到。Content-Type

  文件类型,格式为type/subtype,如image/bmpJava-Bean

  标识某个class是否是Java Bean,值为true或者false。

  签名的JAR文件

  通过给JAR文件签名,可以验证JAR文件是否被篡改过。一个被签名的JAR与签名之前相比,MANIFEST.MF文件会新增一些记录,另外还会新增两个文件,加密清单文件key.SF和加密数据块文件key.DSA。加密的步骤如下:

  在Java的keystore里面生成key,testkey为key的名称,testpass为key的密码,teststore为keystore的名称,teststorepass为keystore的密码。 如果keystore不存在,会自动生成。-validity 360表示有效期为365天。

  keytool -genkey -alias testkey -keypass testpass -validity 365 -keystore teststore -storepass teststorepass给一个已经存在的JAR文件example.jar签名,用上一个步骤中的testkey作为密码。签名之后的JAR文件为Sexample.jar。

  jarsigner -keystore teststore -storepass teststorepass -keypass testpass -signedjar Sexample.jar example.jar testkey验证签名JAR文件

  jarsigner -verify Sexample.jar