类库与 JAR 文件

593 阅读2分钟

这是我参与更文挑战的第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 文件: image.png

使用 JDK 自带的 jar 命令创建 JAR 文件: ​

jar cvf ab.jar A.class B.class

JAR 文件生成成功! ​

image.png

我们去一个新的目录提取下 JAR 文件! ​

mkdir xvf
cd xvf
jar xvf ../ab.jar

解压会得到以下内容: image.png

我们看下 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

image.png

我们看到编译没通过,它找不到 A 这个类,为什么呢? ​

因为我们没有把 A 这个类加入到 CLASSPATH 里! ​

既然我们学习了 JAR,我们就不像以前把单个类往类路径里加了,我们以 JAR 的形式添加,看下能不能正常使用! ​

打开环境配置文件(我的是 macOS 系统),使用命令 vi ~/.bash_profileCLASSPATH 后边追加 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