​​JAR包文件目录解析教程​

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)​

  1. ​编译Java代码​​:
    javac -d target/classes src/main/java/com/example/MyApp.java
  2. ​创建JAR包​​:
    jar cfe my-app.jar com.example.MyApp -C target/classes .
    • c:创建JAR
    • f:指定文件名
    • 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. 总结​

内容普通JARSpring 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 应用

​关键点​

  1. MANIFEST.MF 是JAR包的核心配置文件​​,定义主类、依赖等。
  2. ​普通JAR​​ 不包含依赖,而 ​​Spring Boot JAR​​ 是 ​​Fat JAR​​,包含所有依赖。
  3. ​查看JAR内容​​ 可以用 jar tfunzip 或 IDE。
  4. ​创建JAR​​ 可以用 jar 命令、Maven 或 Spring Boot 插件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值