阅读 268

(JDK)[创建和构建应用程序的主要工具] 之 jar

官方文档

1. 简述

JAR代表Java ARchive。它是基于流行的ZIP文件格式的文件格式,用于将许多文件聚合为一个。尽管JAR可以用作通用归档工具,但其开发的主要动机是Java applet及其必需组件(.class文件,图像和声音)可以在单个HTTP事务中下载到浏览器,而不是打开每件作品的新连接。这大大提高了applet加载到网页上并开始运行的速度。JAR格式还支持压缩,这可以减小文件的大小并进一步缩短下载时间。此外,小程序作者可以对JAR文件中的各个条目进行数字签名,以验证其来源。

2. 特点

  • 唯一的跨平台归档格式
  • 处理音频和图像文件以及类文件的唯一格式
  • 向后兼容现有的applet代码
  • 开放标准,完全可扩展,用java编写
  • 捆绑java applet的首选方法

3. META-INF目录

  • MANIFEST.MF: 清单文件,用于定义扩展和包相关的数据。
  • INDEX.LIST: 此文件由jar工具的新“ -i”选项生成,该选项包含应用程序或扩展中定义的包的位置信息。它是JarIndex实现的一部分,并由类加载器用于加速其类加载过程。
  • x.SF: JAR文件的签名文件。'x'代表基本文件名。
  • x.DSA: 与签名文件关联的签名块文件具有相同的基本文件名。该文件存储相应签名文件的数字签名。
  • services/ : 此目录存储所有服务提供程序配置文件。

4. MANIFEST.MF

Manifest-Version: 1.0
Implementation-Title: web
Implementation-Version: 0.0.1
Built-By: catalpaflat
Start-Class: cn.catalpaflat.Application
Implementation-Vendor-Id: cn.catalpaflat
Spring-Boot-Version: 1.3.3.RELEASE
Created-By: Apache Maven 3.5.2
Build-Jdk: 1.8.0_161
Implementation-URL: https://platform.spring.io/platform/javaee-catalpaflat/web/
Implementation-Vendor: Pivotal Software, Inc.
Main-Class: org.springframework.boot.loader.JarLauncher
复制代码

在上面的规范中,可以出现在主要部分中的属性被称为主要属性,而可以出现在各个部分中的属性被称为每个条目属性。某些属性可以出现在主要部分和各个部分中,在这种情况下,每个条目属性值将覆盖指定条目的主要属性值。两种类型的属性定义如下。

4.1 Main Attributes

主要属性是清单主要部分中存在的属性。他们属于以下不同的群体:

  • 一般主要属性
    • Manifest-Version:定义清单文件版本。该值是合法的版本号,如上面的规范中所述。
    • Created-By:定义生成此清单文件的java实现的版本和供应商。该属性由jar工具生成。
    • Signature-Version:定义jar文件的签名版本。该值应为有效的版本号 字符串。
    • Class-Path:此属性的值指定此应用程序或扩展所需的扩展或库的相对URL。URL由一个或多个空格分隔。应用程序或扩展类加载器使用此属性的值来构造其内部搜索路径。
  • 为独立应用程序定义的属性:此属性由捆绑到可执行jar文件的独立应用程序使用,可由java运行时直接通过运行“ java -jar x.jar ” 来调用。
    • Main-Class:此属性的值是启动时启动程序将加载的主应用程序类的类名。该值不得将.class 扩展名附加到类名。
  • 为扩展标识定义的属性:扩展使用此属性来定义其唯一标识。
    • Extension-Name:此属性指定Jar文件中包含的扩展名。名称应该是唯一标识符,例如包含扩展名的主程序包的名称。
  • 为扩展和包版本控制 和密封信息定义的属性:这些属性定义JAR文件所属的扩展的功能。这些属性的值适用于JAR文件中的所有包,但可以由每个条目属性覆盖。
    • Implementation-Title:值是一个字符串,用于定义扩展实现的标题。
    • Implementation-Version:该值是一个字符串,用于定义扩展实现的版本。
    • Implementation-Vendor:该值是一个字符串,用于定义维护扩展实现的组织。
    • Implementation-Vendor-Id:不推荐使用:在将来的版本中可能会忽略此属性。 该值是一个字符串ID,它唯一地定义维护扩展实现的组织。
    • Implementation-URL:不推荐使用:在将来的版本中可能会忽略此属性。 此属性定义可从中下载扩展实现的URL。
    • Specification-Title:该值是一个字符串,用于定义扩展规范的标题。
    • Specification-Version:该值是一个字符串,用于定义扩展规范的版本。
    • Specification-Vendor - 供应商:该值是一个字符串,用于定义维护扩展规范的组织。
    • Sealed:此属性定义此JAR文件是否已密封。值可以是“true”或“false”,忽略大小写。如果设置为“true”,则JAR文件中的所有包都默认为密封,除非它们是单独定义的。

4.2 Per-Entry Attributes

每个条目属性仅适用于与清单条目关联的单个JAR文件条目。如果主要部分中也出现相同的属性,则per-entry属性的值将覆盖主要属性的值。例如,如果JAR文件a.jar具有以下清单内容

    Manifest-Version: 1.0
    Created-By: 1.2 (Sun Microsystems Inc.)
    Sealed: true
    Name: foo/bar/
    Sealed: false
复制代码

这意味着在a.jar中存档的所有包都是密封的,除了包foo.bar不是。

  • 为文件内容定义的属性:
    • Content-Type:此属性可用于为JAR文件中的特定文件条目指定MIME类型和数据子类型。该值应为type / subtype形式的字符串 。例如,“image / bmp”是具有bmp子类型(表示位图)的图像类型。这将指示文件条目作为图像,其中数据存储为位图。RFC 1521和1522讨论并定义了MIME类型定义。
  • 为包版本控制和密封信息定义的属性:这些属性是上面定义的相同属性集,用于定义扩展包版本控制和密封信息的主要属性。当用作每个条目属性时,这些属性会覆盖主要属性,但仅适用于清单条目指定的单个文件。
  • 为bean对象定义的属性:
    • Java-Bean:定义特定的jar文件条目是否是Java Beans对象。该值应为“true”或“false”,大小写将被忽略。
  • 为签名定义的属性:这些属性用于签名和验证目的。更多细节在这里。
    • x-Digest-y:此属性的名称指定用于计算相应jar文件条目的摘要值的摘要算法的名称。此属性的值存储实际摘要值。前缀“x”指定算法名称,可选后缀“y”指示应该针对哪种语言验证摘要值。
    • Magic:这是一个可选属性,应用程序可以使用它来指示验证程序应如何计算清单条目中包含的摘要值。此属性的值是一组逗号分隔的上下文特定字符串。详细说明如下。

4.2.1 Signed JAR File

可以使用命令行jarsigner工具或直接通过java.securityAPI 对JAR文件进行签名。META-INF如果JAR文件由jarsigner工具签名,则将对每个文件条目(包括目录中的非签名相关文件) 进行签名。签名相关文件是:

    META-INF/MANIFEST.MF
    META-INF/*.SF
    META-INF/*.DSA
    META-INF/*.RSA
    META-INF/SIG-*
复制代码
文章分类
阅读
文章标签