1. 引言
JAR(Java Archive)是Java平台的标准打包格式,用于将多个Java类文件、资源文件(如图片、配置文件)和元数据(如MANIFEST.MF
)打包成一个单一的压缩文件(.jar
)。JAR包广泛应用于Java应用程序、库和框架(如Spring Boot)中。
本教程将详细解析JAR包的文件目录结构,帮助开发者理解其组成、如何查看JAR包内容,以及如何正确使用JAR包。
2. JAR包的基本概念
2.1 什么是JAR包?
JAR(Java Archive)是Java的标准压缩格式,基于ZIP文件格式,但额外包含一个META-INF/MANIFEST.MF
文件,用于描述JAR包的元数据(如主类、依赖等)。
JAR包通常用于:
- 打包Java应用程序(可执行JAR)
- 分发Java库(供其他项目依赖)
- 存储资源文件(如配置文件、图片等)
2.2 JAR包 vs. WAR包 vs. EAR包
类型 | 用途 | 运行方式 |
---|---|---|
JAR | Java应用程序或库 | java -jar xxx.jar 或 作为依赖 |
WAR | Web应用程序(部署到Servlet容器如Tomcat) | 部署到Web服务器 |
EAR | 企业级应用(包含多个模块) | 部署到Java EE服务器(如WildFly) |
3. JAR包的目录结构
一个标准的JAR包解压后,通常包含以下目录和文件:
3.1 标准JAR包结构
my-app.jar
├── META-INF/ # 元数据目录(必须)
│ └── MANIFEST.MF # JAR包的元数据文件(必须)
├── com/ # 你的Java类文件(编译后的.class文件)
│ └── example/
│ └── MyApp.class
├── resources/ # 资源文件(如配置文件、图片等)
│ └── config.properties
└── lib/ # 依赖库(可选,普通JAR通常不包含)
(1) META-INF/
目录
- 必须存在,用于存储JAR包的元数据。
- 最重要的文件是
MANIFEST.MF
(见下文)。
(2) MANIFEST.MF
文件
- 位于
META-INF/MANIFEST.MF
,是JAR包的核心配置文件。 - 定义JAR包的主类(可执行JAR)、版本信息、依赖库等。
- 示例:
Manifest-Version: 1.0 Created-By: 17.0.1 (Oracle Corporation) Main-Class: com.example.MyApp # 可执行JAR的主类
-
Main-Class
:如果JAR是可执行的,必须指定主类(如com.example.Main
)。 -
Class-Path
:指定依赖的JAR包路径(如lib/dependency1.jar lib/dependency2.jar
)。
-
(3) 你的Java类文件
- 编译后的
.class
文件通常放在包路径下,如:com/example/MyApp.class
- 如果JAR包包含资源文件(如
config.properties
),它们通常放在:resources/config.properties
(4) 依赖库(可选)
- 普通JAR包通常不包含依赖,而是通过
Class-Path
引用外部JAR。 - Spring Boot JAR(Fat JAR)会把所有依赖放在
BOOT-INF/lib/
(见下文)。
4. Spring Boot JAR包的特殊结构
Spring Boot 的 JAR 包(Fat JAR / Executable JAR)与普通 JAR 不同,它采用 嵌套结构,包含:
- 你的代码(
BOOT-INF/classes/
) - 所有依赖(
BOOT-INF/lib/
) - Spring Boot 启动器(
org/springframework/boot/loader/
)
4.1 解压后的目录结构
spring-boot-app.jar
├── META-INF/ # 元数据
│ └── MANIFEST.MF # 指定启动类
├── BOOT-INF/ # Spring Boot 特有目录
│ ├── classes/ # 你的代码(编译后的.class)
│ │ └── com/example/MyApp.class
│ └── lib/ # 所有依赖的JAR包
│ ├── spring-core-5.3.0.jar
│ ├── tomcat-embed-core-9.0.0.jar
│ └── ...
└── org/springframework/boot/loader/ # Spring Boot 启动器
├── JarLauncher.class
├── LaunchedURLClassLoader.class
└── ...
4.2 MANIFEST.MF
关键字段
Spring Boot 的 MANIFEST.MF
包含:
Manifest-Version: 1.0
Main-Class: org.springframework.boot.loader.JarLauncher # Spring Boot 启动器
Start-Class: com.example.MyApp # 你的主类
Spring-Boot-Classes: BOOT-INF/classes/ # 你的代码路径
Spring-Boot-Lib: BOOT-INF/lib/ # 依赖库路径
-
Main-Class
:Spring Boot 的JarLauncher
,负责启动应用。 -
Start-Class
:你的主类(如com.example.MyApp
)。 -
Spring-Boot-Classes
:你的代码路径(BOOT-INF/classes/
)。 -
Spring-Boot-Lib
:依赖库路径(BOOT-INF/lib/
)。
5. 如何查看JAR包内容?
5.1 使用 jar
命令(JDK自带)
# 查看JAR包内容(不解压)
jar tf my-app.jar
# 解压JAR包
jar xf my-app.jar
# 查看MANIFEST.MF
unzip -p my-app.jar META-INF/MANIFEST.MF
5.2 使用 unzip
命令
# 解压JAR包
unzip my-app.jar -d my-app-extracted/
# 查看MANIFEST.MF
cat my-app-extracted/META-INF/MANIFEST.MF
5.3 使用IDE(如IntelliJ IDEA)
- 直接双击JAR包(部分IDE支持)。
- 使用 "Extract Here" 解压后查看。
6. 如何创建JAR包?
6.1 普通JAR(使用 javac
+ jar
)
- 编译Java代码:
javac -d target/classes src/main/java/com/example/MyApp.java
- 创建JAR包:
jar cfe my-app.jar com.example.MyApp -C target/classes .
c
:创建JARf
:指定文件名e
:指定主类-C
:切换到目录并添加文件
6.2 Maven 项目(生成JAR)
在 pom.xml
中配置:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<archive>
<manifest>
<mainClass>com.example.MyApp</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
然后运行:
mvn clean package
生成的JAR在 target/
目录下。
6.3 Spring Boot 项目(生成Fat JAR)
使用 spring-boot-maven-plugin
:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
运行:
mvn clean package
生成的Fat JAR在 target/
目录下,可直接运行:
java -jar target/my-spring-boot-app.jar
7. 总结
内容 | 普通JAR | Spring Boot JAR(Fat JAR) |
---|---|---|
结构 | META-INF/MANIFEST.MF + 你的代码 | META-INF/MANIFEST.MF + BOOT-INF/classes/ + BOOT-INF/lib/ + org/springframework/boot/loader/ |
可执行 | 需要 Main-Class | 自带 JarLauncher ,直接 java -jar |
依赖 | 通过 Class-Path 引用 | 所有依赖打包在 BOOT-INF/lib/ |
适用场景 | 库、简单应用 | Spring Boot 应用 |
关键点
-
MANIFEST.MF
是JAR包的核心配置文件,定义主类、依赖等。 - 普通JAR 不包含依赖,而 Spring Boot JAR 是 Fat JAR,包含所有依赖。
- 查看JAR内容 可以用
jar tf
、unzip
或 IDE。 - 创建JAR 可以用
jar
命令、Maven 或 Spring Boot 插件。