赞
踩
闲来无事,浏览网页看到有人说jar包为什么可以独立运行,想起前端时间写的jar打包后无法正常运行处理。jar解压缩后有多个文件夹,内部存放运行所需jar包和一些配置文件,本文做一个简单介绍。
在Java开发中,JAR
(Java ARchive)包和WAR
(Web Application ARchive)包都是用来打包文件和资源的归档文件,但它们的用途和内容有所不同。
META-INF
目录,里面包含了MANIFEST.MF
文件,这个文件定义了包的版本、主类等信息。WEB-INF
文件夹,其中包含web.xml
(描述了Web应用的结构和内容)、应用程序库(/WEB-INF/lib
目录下的JAR文件)和类文件(/WEB-INF/classes
目录)。java -jar
命令运行。JAR包和WAR包都是Java环境中用于打包文件的格式,但JAR包更通用,而WAR包专门用于Web应用的分发和部署。
myapp.jar
├── META-INF
│ ├── MANIFEST.MF
│ └── ...
├── com
│ └── example
│ ├── Main.class
│ ├── utils
│ │ ├── Helper.class
│ │ └── Constants.class
│ └── services
│ ├── UserService.class
│ └── ProductService.class
└── resources
├── config.properties
└── messages.properties
Manifest-Version: 1.0
Main-Class: com.example.Main
Class-Path: lib/dependency1.jar lib/dependency2.jar
Implementation-Title: My Application
Implementation-Version: 1.0.0
Implementation-Vendor: Example Corp
Manifest-Version:
1.0
。Manifest-Version: 1.0
Main-Class:
public static void main(String[] args)
方法的类。当使用java -jar
命令运行JAR文件时,Java虚拟机(JVM)会从这个类开始执行。Main-Class: com.example.Main
Class-Path:
Class-Path: lib/dependency1.jar lib/dependency2.jar
Implementation-Title:
Implementation-Title: My Application
Implementation-Version:
Implementation-Version: 1.0.0
Implementation-Vendor:
Implementation-Vendor: Example Corp
public static void main(String[] args)
方法。Spring Boot 允许创建可独立运行的 JAR 文件,这种 JAR 文件被称为 “可执行 JAR” 或 “fat JAR”(有时也称为 “uber JAR”)。这种 JAR 文件包含了所有必要的依赖库、类文件和资源,使得应用可以通过一个简单的 java -jar
命令运行,而无需额外的类路径设置。这是通过以下几个关键的配置和技术实现的:
Spring Boot 应用通常内嵌一个 Web 服务器(如 Tomcat、Jetty 或 Undertow),这意味着不需要部署到外部服务器。应用启动时,内嵌的 Web 服务器也会被启动,从而处理 HTTP 请求。
Spring Boot 使用一系列的 “starters” 来简化依赖管理。这些 starters 负责将应用所需的依赖库自动包含在最终的 JAR 文件中。例如,spring-boot-starter-web
会添加 Tomcat 和 Spring MVC 的依赖。
这些插件负责构建过程中的重要任务,如打包应用和依赖项。特别是,它们会创建一个包含所有依赖的 JAR 文件,并且配置好 META-INF/MANIFEST.MF
文件,使其指向一个特殊的类加载器,这个类加载器能够从 JAR 文件内部加载类和资源。
Spring Boot 使用自定义的类加载器来从 JAR 文件内部的嵌套 JAR 文件中加载类。这意味着,尽管所有的库都被打包在一个单一的 JAR 文件中,Spring Boot 仍然能够从这些库中加载类。
MANIFEST.MF
配置在 META-INF/MANIFEST.MF
文件中,Spring Boot 配置了 Main-Class
属性,该属性指向了 org.springframework.boot.loader.JarLauncher
。这是一个特殊的启动器,负责初始化 Spring Boot 应用。此外,还有 Start-Class
属性,它指定了包含 main
方法的实际入口类。
MANIFEST.MF
中的关键配置Main-Class: org.springframework.boot.loader.JarLauncher
Start-Class: com.example.MyApplication
这种配置方式使得 Spring Boot 应用可以作为一个独立程序运行,而不需要任何外部依赖,除了 Java 运行时环境。这极大地简化了部署和分发过程,使得开发者可以轻松地在不同环境中部署和运行他们的应用。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。