Spring Boot 打包的 JAR 文件与普通的 JAR 文件有几个关键区别。Spring Boot 的 JAR 文件是“可执行 JAR 文件”(也称为 fat JAR 或 uber JAR),它包含了应用运行所需的所有依赖、资源以及内嵌的服务器(如 Tomcat 或 Jetty),因此可以直接执行。而普通的 JAR 文件通常只包含编译后的应用代码和资源文件,不包括运行时所需的依赖或服务器。
主要区别
-
依赖打包:
- 普通 JAR:普通 JAR 仅包含应用的编译代码和资源文件,不包含项目依赖。需要手动将依赖添加到类路径中才能运行。
- Spring Boot JAR:Spring Boot JAR 包含了所有的项目依赖。这意味着它可以独立运行,而不需要额外的类路径设置。
-
内嵌服务器:
- 普通 JAR:普通 JAR 不包含任何服务器配置或内嵌服务器。如果是 Web 应用,需要将其部署到外部的应用服务器(如 Tomcat)。
- Spring Boot JAR:Spring Boot JAR 通常内嵌了一个服务器(如 Tomcat、Jetty),使得应用可以直接通过命令
java -jar
运行,而无需外部服务器。
-
启动类:
- 普通 JAR:启动类通常是一个带有
main
方法的类,手动指定应用入口。 - Spring Boot JAR:Spring Boot 自动管理启动过程,包含了一个特定的
SpringApplication.run
方法,负责启动应用上下文和内嵌服务器。
- 普通 JAR:启动类通常是一个带有
-
目录结构:
- 普通 JAR:通常只有
META-INF
目录和classes
目录,类文件和资源文件直接位于这些目录下。 - Spring Boot JAR:包含一个
BOOT-INF
目录,其中BOOT-INF/classes/
包含应用的类文件,BOOT-INF/lib/
包含所有依赖库,META-INF
目录包含启动信息。
- 普通 JAR:通常只有
代码示例
普通 JAR 文件示例
一个普通的 Java 项目,编写一个简单的 HelloWorld
应用:
public class HelloWorld {public static void main(String[] args) {System.out.println("Hello, World!");}
}
编译并创建 JAR 文件:
javac HelloWorld.java
jar cf hello-world.jar HelloWorld.class
运行普通 JAR 文件:
java -jar hello-world.jar
# 错误提示:No main manifest attribute, in hello-world.jar
由于没有指定 Main-Class
,必须指定类路径和主类:
java -cp hello-world.jar HelloWorld
# 输出:Hello, World!
Spring Boot JAR 文件示例
Spring Boot 应用的启动类如下:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class MySpringBootApplication {public static void main(String[] args) {SpringApplication.run(MySpringBootApplication.class, args);}
}
使用 Maven 打包:
mvn clean package
生成的 JAR 文件结构类似于:
my-spring-boot-app-1.0.0.jar
├── BOOT-INF/
│ ├── classes/ # 应用的编译类文件
│ ├── lib/ # 所有依赖库
│ └── ...
└── META-INF/└── MANIFEST.MF # 包含 Main-Class 等信息
运行 Spring Boot JAR 文件:
java -jar target/my-spring-boot-app-1.0.0.jar
# 启动 Spring Boot 应用,内嵌服务器自动运行
总结
-
启动方式:普通的jar文件需要通过命令行或者其他方式手动启动,而Spring Boot打成的jar文件可以直接使用 java -jar 命令来启动,简化了启动过程。
-
内嵌服务器:Spring Boot打成的jar文件内置了Tomcat或者其他的Web容器,可以直接作为独立的应用程序运行,而普通的jar文件需要依赖外部的服务器进行部署。
-
配置文件:Spring Boot打成的jar文件可以使用application.properties或者application.yml文件来配置应用程序的属性,简化了配置过程。而普通的jar文件没有这种默认的配置方式。
-
依赖管理:Spring Boot通过自动化的依赖管理,可以简化项目中的依赖管理过程。它会根据项目中使用的功能自动添加必要的依赖,减少了手动维护依赖的工作。
-
版本管理:Spring Boot通过统一的版本管理,可以确保项目中使用的各个依赖的版本兼容。这样可以避免因为依赖版本冲突而导致的问题。
-
自动化配置:Spring Boot通过自动化配置可以根据应用程序的需要,自动配置数据库、缓存等各种组件。这样可以减少开发者的配置工作。
-
模块化设计:Spring Boot将应用程序按照功能拆分成多个模块,使得代码结构更加清晰,易于维护和扩展。
-
监控和管理:Spring Boot提供了丰富的监控和管理功能,可以通过Actuator模块来监控应用程序的运行状况,并提供了一些常用的管理功能,如shutdown等。