这是我参与更文挑战的第7天,活动详情查看: 更文挑战
作者:白色蜗牛
来源:蜗牛互联网
什么是类库
我们知道,在面向对象的程序设计里,一个类是可以调用另外一个类的方法,只要把被调用的那个类引入到 classpath 下就可以。
一个类当然好搞,但如果是很多类,都会被其他类重复使用到,并且可能有多个工程,其他开发者也需要,那么按类这个维度去加入 classpath 显然会很麻烦。
这种情况就需要把这些可以被重复使用的类打包,统一提供给使用方。这种打包好的类,就是类库(Class Library)。
类库是类的集合,可以被重复使用。
什么是 JAR 文件
类库只是一种概念,不同程序设计语言,表现形式不同。在 Java 中,一般以 JAR 文件的方式提供类库。
什么是 JAR 文件呢?
JAR (Java ARchive,Java 归档)是一种软件包文件格式,通常会聚合大量的 Java 类文件、相关的元数据和资源(文本、图片等)文件到一个文件,以便分发到 Java 平台应用软件或库。
JAR 文件就是 JAR 这种格式下的归档文件,以 ZIP 格式构建,以 .jar 为文件扩展名。用户可以使用 JDK 自带的 jar 命令创建或提取 JAR 文件。
JAR 文件创建和提取
我们演示下 JAR 文件的创建和提取过程。
假设你 Java 环境已经安装好,我们创建一个演示目录并进入:
mkdir jartest
cd jartest
复制代码
创建一个 Java 文件,命名为 A.java:
vi A.java
复制代码
编辑 Java 文件:
public class A {
}
复制代码
再创建一个 Java 文件,命名为 B.java:
vi B.java
复制代码
编辑 Java 文件:
public class B {
}
复制代码
编译 Java 代码:
javac A.java B.java
复制代码
我们发现已经生成了 .class 文件:

使用 JDK 自带的 jar 命令创建 JAR 文件:
jar cvf ab.jar A.class B.class
复制代码
JAR 文件生成成功!

我们去一个新的目录提取下 JAR 文件!
mkdir xvf
cd xvf
jar xvf ../ab.jar
复制代码
解压会得到以下内容:

我们看下 MANIFEST.MF 文件内容:
$ cat META-INF/MANIFEST.MF
Manifest-Version: 1.0
Created-By: 1.8.0_281 (Oracle Corporation)
复制代码
Manifest 文件看着是创建 JAR 文件自动生成的,它起什么作用呢?
在 Java 平台中, Manifest 文件是 JAR 归档中所包含的特殊文件。Manifest 文件被用来定义扩展或文件打包相关数据。Manifest 文件是一个元数据文件,它包含键 – 值对(英语:Attribute–value pair)数据。如果一个 JAR 文件被当成可执行文件,那么其中的 Manifest 文件需要指出该程序的主类文件。通常 Manifest 文件的文件名为 MANIFEST.MF。
JAR 文件的使用
假设 ab.jar 功能强大,即将提供给其他开发者使用,那怎么接入呢?
我们新建个目录,新建个使用类,尝试使用下 A 这个类:
mkdir usejar
cd usejar
vi UseJarDemo.java
复制代码
编辑 Java 文件,我们 new 一个 A,表明要使用它:
public class UseJarDemo {
public static void main(String[] args) {
A a = new A();
}
}
复制代码
保存退出,尝试编译:
javac UseJarDemo.java
复制代码

我们看到编译没通过,它找不到 A 这个类,为什么呢?
因为我们没有把 A 这个类加入到 CLASSPATH 里!
既然我们学习了 JAR,我们就不像以前把单个类往类路径里加了,我们以 JAR 的形式添加,看下能不能正常使用!
打开环境配置文件(我的是 macOS 系统),使用命令 vi ~/.bash_profile 在 CLASSPATH 后边追加 ab.jar 所在的路径,然后 source ~/.bash_profile 生效一下配置文件,
追加前
$ cat ~/.bash_profile
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$PATH
复制代码
追加后
$ cat ~/.bash_profile
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:/Users/woniu/jartest/ab.jar
export PATH=$JAVA_HOME/bin:$PATH
复制代码
此时我们再编译一下 UseJarDemo.java:
javac UseJarDemo.java
复制代码
非常顺利,没有报错!说明我们成功用到了 JAR 中的 A!
$ ls
UseJarDemo.class UseJarDemo.java
复制代码



















![[桜井宁宁]COS和泉纱雾超可爱写真福利集-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/4d3cf227a85d7e79f5d6b4efb6bde3e8.jpg)

![[桜井宁宁] 爆乳奶牛少女cos写真-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/d40483e126fcf567894e89c65eaca655.jpg)