《.JAR那些事儿》--当年geek

.jar文件是Java的归档格式,用于打包Java应用或库,具有跨平台、执行简便和部署方便的特点。文章介绍了.jar的构成、创建方法、区别于.zip文件之处,以及打包的原因和示例。
摘要由CSDN通过智能技术生成

一、What's  ".jar"?

1.1 introduction 

.jar,is the abbr. of Java Archive,即“Java归档”。a type of 压缩文件格式基于ZIP文件,使用ZIP压缩算法压缩和解压文件)--用于打包Java应用程序或库。

“ARchive” (noun.)中通常指存档文件或者档案文件的意思。(牛津词典)

在计算机领域中,“archive” 通常描述一组文件或目录的集合,经过压缩和打包处理后形成的单个文件。

1.2 features:

特殊要求:每个.jar文件都必须包含一个名为META-INF的目录,其包含了一个或多个元数据文件,如MANIFEST.MF,它描述了.jar文件的内容和属性。

一次编写,到处运行:.jar文件支持跨平台部署--平台无关性

执行“易如反掌”:.jar文件中的Java类文件在被提取后可以由Java虚拟机直接执行,用户无需安装额外的编译器或运行环境

部署“简单如喝水”:所有组件打包在一起,形成一个.jar文件(标准分发单元)。只需下载一个文件即可运行应用程序,无需担心依系/其他组件的位置。

二、What's the component?

.jar文件通常包含:

  • Java类文件(包含了应用程序的逻辑和功能)
    • .jar文件包含大量【.class】--Java类文件 ( Java应用程序的核心 )。
  • 资源(如图像、声音、文本文件等)
  • 可执行的Java代码
  • META-INF目录
    • jar 与 zip 唯一的区别就是jar 文件包含了一个 META-INF 
    • META-INF 目录: 是Java jar文件中的一个【存储与 JAR 文件本身相关的元数据信息】的特殊目录。
      • 位置: jar文件的根目录下;
      • 内容:一些标准和自定义的【描述 JAR 文件的属性/配置/其他信息】元数据文件;  
      • MANIFEST.MF(此目录下最重要文件--清单文件【即“说明书”】)。
        • 包含了关于.jar文件中的元数据,例如主类(Main-Class)、依赖库(Class-Path)和其他一些声明。
        • 包含与 .jar文件相关的【包含类和资源】的元数据信息,e.g.版本号/创建者信息/依赖关系。其中最重要的属性是 Main-Class,
          • Main-class:用于指定可执行 jar文件的入口类。
          • 可执行的Jar包(Executable JAR): 
            • 可执行的jar包中肯定是有某个.class文件(在manifest里查看)提供了main函数才使得其可执行
            • 包含了一个Java应用程序的所有必要组件(且包含main方法/必要依赖);
            • 这样的Jar包可以通过命令行或双击图标的方式直接运行;
            • 会在MANIFEST.MF文件中指定主类和入口点;
            • 并且可以直接由Java虚拟机(JVM)执行;
          • 不可执行的Jar包: 

            • 不包含可直接运行程序的Jar文件,可能只包含了一些库/工具类/其他资源文件;
            • without明确定义的入口点;
            • 通常被用作库文件,供其他Java程序调用和引用;
          • 可/不可执行jar包的区别:是否被配置为可以直接运行,包含的元数据是否指定了主类(Main Class);

三、how to make a ".jar"?

创建.jar文件的几种常见方式:

  • 命令行:在命令行中使用jar命令【Java开发工具包(JDK)的一部分】
    • 基本用法jar cvf选项,其中:
      • c--创建新的.JAR文件。
      • v--在创建.JAR文件时显示详细的过程输出。
      • f--指定输出文件的名称。
      • jar cvf myapp.jar myapp/com/example/MainClass
        解释:将myapp/com/example/MainClass作为主类,并将指定目录下的所有内容打包到名为myapp.jar的.JAR文件中。
  • 集成开发环境(IDE):IntelliJ IDEA、Eclipse,提供直接创建.JAR文件的功能。通过构建(Build)菜单来打包应用程序。
  • 第三方工具:Apache Ant、Gradle。
  • Java库:Java NIO库/Apache Commons Compress库,可手动打包.JAR文件
    • 手动打包:(手动创建一个包含所需文件的目录结构,然后使用压缩工具(如WinRAR、7-Zip等)将该目录打包成.jar文件)。

创建.jar文件时,关注三个点:

  • 主类指定:确保在META-INF/MANIFEST.MF文件中指定了主类,以便可以直接运行.JAR文件。
  • 依赖管理:在.JAR文件中包含所有必要的依赖库,或者在MANIFEST.MF文件中指定外部依赖。
  • 资源文件包含:将应用程序所需的资源文件(如图片、配置文件等)包含在.JAR文件中。

Distinguish between .jar and .zip:

在打包Java应用时,.JAR.ZIP文件格式都是可用的选项,但它们有一些关键的区别:

  • 经过Java特定扩展:.JAR文件专为Java应用程序设计,遵循ZIP格式的同时,添加了一些Java特定的元数据和规则。如【META-INF/MANIFEST.MF】
  • 【商业/开源软件】安全性:.JAR文件支持数字签名v.s. .ZIP文件不提供这种级别的安全性。
  • 作用&对象不同:.JAR文件用于分发/部署Java应用程序【尤其Android应用】。.ZIP文件用于通用文件的压缩/分发,如文档/图片/音频。

四、Why do we make a .jar?

为什么要打jar包

我们开发了一个程序以后,程序中有很多的类,如果需要提供给别人使用,发一大堆源文件是非常不好的,需要把这些类以及相关的资源文件打包成一个 jar 包;

给使用者提供.jar包(同时提供清晰的文档)即可。

建议大家在平时写代码搬砖的时候,把自己代码的通用部分抽离出来,主键积累一些通用的util类,将其逐渐模块化,最后打成jar包供自己在别的项目或者模块中使用,将其做得越来越容易理解和通用,

好处是代码重构能力+模块抽象能力+从长期来看解放重复工作量+甚至意想不到的利润(当你抽象出业内足够通用的jar)。

这也是java发展得如此之好的原因,无论出于盈利/非盈利的目的,将自己的通用工具或者框架抽取出来,打成jar包供他人调用,使得整个java生态圈变得越来越强大–几乎很多业务场景都能找到对应的jar包。

五、example 

e.g.MANIFEST.MF示例详解

MANIFEST.MF中存放的是key:value格式的配置信息,这些配置信息又可以分成两部分,第一部分是main-section信息,第二部分是individual-section

e.g.(by 一文读懂jar包的小秘密 - 知乎 (zhihu.com)):

Manifest-Version: 1.0
Created-By: 1.8 (Oracle Inc.)
Sealed: true
Name: foo/bar/
Sealed: false

Manifest-Version: 1.0
    Created-By: 1.8.0 (Oracle Inc.)

    Name: common/class1.class
    SHA-256-Digest: (base64 representation of SHA-256 digest)

    Name: common/class2.class
    SHA1-Digest: (base64 representation of SHA1 digest)
    SHA-256-Digest: (base64 representation of SHA-256 digest)

main-section的信息:

 

编译过程涉及的文件:

Java源代码文件(扩展名为.java)经过Java编译器编译后生成的字节码文件(扩展名为.class)。这些.class文件包含了Java虚拟机(JVM)可以理解和执行的指令。

流程:

  • 开发者编写 .java 源代码文件。
  • 使用编译器(如 javac)将 .java 文件编译成 .class 字节码文件。
  • 使用打包器或构建工具将 .class 文件和其他资源打包成 .JAR 文件。
  • 最终,用户可以使用 java -jar 命令来运行 .JAR 文件,或者将其部署到支持 Java 的应用服务器中。

编译后的一个或多个包的Java class文件可以打包为一个文件,Java中打包命令为jar,打包后的文件扩展名为.jar,一般称之为jar包。

六、Reference

jar包的一些事儿 - 知乎 (zhihu.com)

一文读懂jar包的小秘密 - 知乎 (zhihu.com)

jar包,程序的编译与链接 - 知乎 (zhihu.com)

一文读懂jar包的小秘密 | 程序那些事 (flydean.com)

智谱清言 (chatglm.cn)

  • 42
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值