java jar包 常用来运行java程序的压缩包。今天就来看看内幕。

简介

维基百科

在软件领域,JAR文件(Java归档,英语:Java ARchive)是一种软件包文件格式,通常用于聚合大量的Java类文件、相关的元数据和资源(文本、图片等)文件到一个文件,以便分发Java平台应用软件或库。
JAR文件是一种归档文件,以ZIP格式构建,以.jar为文件扩展名。用户可以使用JDK自带的jar命令创建或提取JAR文件。也可以使用其他zip压缩工具,不过压缩时zip文件头里的条目顺序很重要,因为Manifest资源配置文件常需放在首位。JAR文件内的文件名是Unicode文本。

JAR 文件可以用于:

  • 用于发布和使用类库
  • 作为应用程序和扩展的构建单元
  • 作为组件、applet或者插件程序的部署单位
  • 用于打包与组件有关联的辅助资源

JAR 文件格式的优势和功能:

  • 安全性:可以对 JAR 文件内容加上数字化签名。这样,能够识别签名的工具就可以有选择地为您授予软件安全特权,这是其他文件做不到的,它还可以检测代码是否被篡改过。
  • 减少下载时间:如果一个 applet 捆绑到一个 JAR 文件中,那么浏览器就可以在一个 HTTP 事务中下载这个 applet 的类文件和相关的资源,而不是对每一个文件打开一个新连接。
  • 压缩:JAR 格式允许您压缩文件以提高存储效率。
  • 传输平台扩展:Java 扩展框架 (Java Extensions Framework) 提供了向 Java 核心平台添加功能的方法,这些扩展是用 JAR 文件打包的 (Java 3D 和 JavaMail 就是由 Sun 开发的扩展例子 )。
  • 包密封:存储在 JAR 文件中的包可以选择进行 密封,以增强版本一致性和安全性。密封一个包意味着包中的所有类都必须在同一 JAR 文件中找到。
  • 包版本控制:一个 JAR 文件可以包含有关它所包含的文件的数据,如厂商和版本信息。
  • 可移植性:处理 JAR 文件的机制是 Java 平台核心 API 的标准部分。

JAR包结构

解压JAR包之后除了编译后.class文件以外,还有META-INF 文件夹。该文件夹下面包含了MANFEST.MF文件。

MANIFET.MF 属性

一般属性:

  • Manifest-Version : 用来定义Manifest文件的版本。
  • Created-By :该文件的生成者,由jar命令行工具生成。
  • Signature-Version : jar文件签名版本。
  • Class-Path : 应用程序或者类装载器使用该值来构建内部的类搜索路径。

应用程序相关:

  • Main-Class : jar文件的入口类,该文件必须是一个可执行的类,包含main方法。

小程序(Applet)相关属性:
现在还有用applet的情况吗?没有了吧!?用不到,不记了。

扩展标识属性:

  • Extension-Name : 该文件定义了jar文件的标识。

包扩展属性:

  • Implementation-Title :扩展实现的标题
  • Implementation-Version :扩展实现的版本
  • Implementation-Vendor :扩展实现的组织
  • Implementation-Vendor-Id :扩展实现的组织的标识
  • Implementation-URL : 该扩展包的下载地址(URL)
  • Specification-Title :扩展规范的标题
  • Specification-Version :扩展规范的版本
  • Specification-Vendor :声明了维护该规范的组织
  • Sealed :jar文件是否封存,值可以是true或者false

签名相关属性:
一般eclipse导出的可执行jar包默认不包含签名属性。

JAR包命令

jar命令格式:jar {c t x u f}[v m e 0 m i][-C 目录]文件名

其中{ctvu}这四个参数必须选其一,[v m e 0 m i] 是可选参数,文件名也必须。

-c 创建一个jar包
-t 显示jar中的内容列表
-x 解压jar包
-u 添加文件到jar包中
-f 指定jar包的文件名

-v 生成详细的报造,并输出至标准设备
-m 指定manifest.mf文件.(manifest.mf文件中可以对jar包及其中的内容作一些一设置)
-0 产生jar包时不对其中的内容进行压缩处理
-M 不产生所有文件的清单文件(Manifest.mf)。这个参数与忽略掉-m参数的设置
-i 为指定的jar文件创建索引文件
-C 表示转到相应的目录下执行jar命令,相当于cd到那个目录,然后不带-C执行jar命令

可执行JAR文件

一个可执行Java程序以及其使用的库文件可以打包在一个JAR文件中。

可执行的JAR文件中的Manifest文件用代码Main-Class: myPrograms.MyClass指定了入口点类,注意要指明该类的路径(-cp参数将被忽略)。有些操作系统可以在点击后直接运行可执行JAR文件。而更典型的调用则是通过命令行执行“java -jar foo.jar”。

在多数平台上可以使用封装器封装可执行JAR文件。例如,对于更喜欢使用Windows EXE的Microsoft Windows用户而言,可以使用工具(如JSmooth、Launch4J、WinRun4J、Nullsoft脚本安装系统等),将单个JAR文件转换为可执行文件。

JAR包使用案例

创建jar包

jar cf hello.jar hello

创建并显示打包过程

jar cvf hello.jar hello 利用hello目录创建hello.jar包,并显示创建过程

显示jar包

jar tvf hello.jar 查看hello.jar包的内容

解压jar包

jar xvf hello.jar 解压hello.jar至当前目录

jar中添加文件

jar uf hello.jar HelloWorld.java 将HelloWorld.java添加到hello.jar包中

创建不压缩内容jar包

jar cvf0 hello.jar *.class 利用当前目录中所有的.class文件生成一个不压缩jar包

创建带manifest.mf文件的jar包

jar cvfm hello.jar manifest.mf hello
创建的jar包多了一个META-INF目录,META-INF止录下多了一个manifest.mf文件,至于manifest.mf的作用,后面会提到.

忽略manifest.mf文件

jar cvfm hello.jar mymanifest.mf -C hello/
表示在切换到hello目录下然后再执行jar命令

加-C应用

jar cvfm hello.jar mymanifest.mf -C hello/
表示在切换到hello目录下然后再执行jar命令

-i为jar文件生成索引列表

当一个jar包中的内容很好的时候,你可以给它生成一个索引文件,这样看起来很省事。
jar i hello.jar 执行完这条命令后,它会在hello.jar包的META-INF文件夹下生成一个名为INDEX.LIST的索引文件,它会生成一个列表,最上边为jar包名。

tar包 和 jar包 和 war包 的区别?

某乎上的回答https://www.zhihu.com/question/22129866/answer/101446363。

tar:tar是*nix下的打包工具,生成的包通常也用tar作为扩展名,其实tar只是负责打包,不一定有压缩,事实上可以压缩,也可以不压缩,通常你看到xxxx.tar.gz,就表示这个tar包是压缩的,并且使用的压缩算法是GNU ZIP,而xxxx.tar.bz2就表示这个包使用了bzip2算法进行压缩,当然这样的命名只是一种惯例,并非强制。简单地说,tar就仅是打包。

jar:即Java Archive,Java的包,Java编译好之后生成class文件,但如果直接发布这些class文件的话会很不方便,所以就把许多的class文件打包成一个jar,jar中除了class文件还可以包括一些资源和配置文件,通常一个jar包就是一个java程序或者一个java库。

war:Web application Archive,与jar基本相同,但它通常表示这是一个Java的Web应用程序的包,tomcat这种Servlet容器会认出war包并自动部署。

完结,对你有用!