2019年08月19日(星期一)  农历:己亥年七月十九
  • 首页
  • JAVA
  • Java Archive中规格和使用清单

作者:三年。分类: JAVA

得益于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.SFkey.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

温馨提示如有转载或引用以上内容之必要,敬请将本文链接作为出处标注,谢谢合作!

已有 0/1360 人参与

发表评论:



手Q扫描加入Java初学者群