什么是Jar?

JAR 文件是一种基于流行的 ZIP 文件格式的文件格式,用于将多个文件聚合为一个文件。 JAR 文件本质上是一个包含可选 META-INF 目录的 zip 文件。可以通过命令行 jar 工具或使用 Java 平台中的java.util.jarAPI 创建 JAR 文件。 JAR 文件的名称没有限制,可以是特定平台上的任何合法文件名。

使用较为初级的方式生成一个jar包

生成jar包的方式多种多样,我们可以选择使用Maven,使用Spring Boot等等,这次我们选择使用最纯粹的命令行的方式,来完成Java项目的打包过程。

创建一个纯粹的JAVA项目

我们先创建一个jar-demo的项目,整体项目结构如下

1
2
3
4
5
6
7
8
9
jar-demo/

├── src/
└── com/
└── btzx/
└── MainApp.java

└── manifest/
└── MANIFEST.MF

启动类代码简单输出些东西

1
2
3
4
5
6
7
8
public class MainApp {
public static void main(String[] args) {
System.out.printf("Hello and welcome!");
for (int i = 1; i <= 5; i++) {
System.out.println("i = " + i);
}
}
}

配置MANIFEST.MF文件

简单配置下版本号和指定启动类

1
2
Manifest-Version: 1.0
Main-Class: com.btzx.MainApp

生成字节码文件

使用javac命令将源文件编译成字节码文件:

1
javac -d out/classes src/com/btzx/*.java

这行代码的意思是,编译指定文件下所有的.java文件并输出到”out/classes”目录下。

执行过命令后,我们的项目结构会变成下面这种格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
jar-demo/

├── out/
└── classes/
└── com/
└── btzx/
└── MainApp.class
├── src/
└── com/
└── btzx/
└── MainApp.java

└── manifest/
└── MANIFEST.MF

通过jar命令生成jar包

接着,我们开始生成jar文件,执行如下命令来完成打包动作

1
jar cvfm JarDemo.jar manifest/MANIFEST.MF -C out/classes/ .

我们再来了解下各个参数的作用

  • c 创建一个新的jar文件
  • v 生成详细输出
  • f 指定生成的jar文件的名称,这里是指”JarDemo.jar”
  • m 将 manifest 文件添加到 JAR 文件中
  • -C 切换到指定目录并添加该目录下的文件到 JAR 文件中

这一步完了之后,项目结构会变成下面这个样子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
jar-demo/
├── JarDemo.jar

├── out/
└── classes/
└── com/
└── btzx/
└── MainApp.class
├── src/
└── com/
└── btzx/
└── MainApp.java

└── manifest/
└── MANIFEST.MF

通过jar命令查看一下jar文件是否正常

生成jar文件后先不着急启动,我们对他查验一番,执行以下命令

1
jar -tvf JarDemo.jar

这种内容意味着我们生成的jar文件是没有问题的

1
2
3
4
5
6
0 Wed Jan 08 13:52:38 CST 2024 META-INF/
96 Wed Jan 08 13:52:38 CST 2024 META-INF/MANIFEST.MF
0 Wed Jan 08 13:52:18 CST 2024 com/
0 Wed Jan 08 13:52:18 CST 2024 com/btzx/
1024 Wed Jan 08 13:52:18 CST 2024 com/btzx/MainApp.class

启动jar命令

如果上面操作都没有问题,那么这一步就可以睁开卡姿兰大眼睛来见证结果的诞生了。

还是执行命令:

1
java -jar JarDemo.jar

接着控制台会有以下输出,这也意味着我们的伟大胜利!

1
2
3
4
5
Hello and welcome!i = 1
i = 2
i = 3
i = 4
i = 5

java启动jar文件原理

当我们在命令行中输入java -jar JarDemo.jar时,Java 虚拟机(JVM)会首先读取 JAR 文件中的MANIFEST.MF文件,通过这个文件的Main-Class属性就可以定位到我们程序的主类,接着JVM就会通过类加载器将主类以及需要加载的类和资源都加载到内存中,而一旦主类被加载,JVM就会执行主类中的main方法,整个 Java 应用程序的逻辑就会按照代码的编写顺序逐步执行。