Spring Boot 打成的 jar 和普通的 jar

Spring Boot 打包的 JAR 文件与普通的 JAR 文件有几个关键区别。Spring Boot 的 JAR 文件是"可执行 JAR 文件"(也称为 fat JAR 或 uber JAR),它包含了应用运行所需的所有依赖、资源以及内嵌的服务器(如 Tomcat 或 Jetty),因此可以直接执行。而普通的 JAR 文件通常只包含编译后的应用代码和资源文件,不包括运行时所需的依赖或服务器。

主要区别

  1. 依赖打包

    • 普通 JAR:普通 JAR 仅包含应用的编译代码和资源文件,不包含项目依赖。需要手动将依赖添加到类路径中才能运行。
    • Spring Boot JAR:Spring Boot JAR 包含了所有的项目依赖。这意味着它可以独立运行,而不需要额外的类路径设置。
  2. 内嵌服务器

    • 普通 JAR:普通 JAR 不包含任何服务器配置或内嵌服务器。如果是 Web 应用,需要将其部署到外部的应用服务器(如 Tomcat)。
    • Spring Boot JAR :Spring Boot JAR 通常内嵌了一个服务器(如 Tomcat、Jetty),使得应用可以直接通过命令 java -jar 运行,而无需外部服务器。
  3. 启动类

    • 普通 JAR :启动类通常是一个带有 main 方法的类,手动指定应用入口。
    • Spring Boot JAR :Spring Boot 自动管理启动过程,包含了一个特定的 SpringApplication.run 方法,负责启动应用上下文和内嵌服务器。
  4. 目录结构

    • 普通 JAR :通常只有 META-INF 目录和 classes 目录,类文件和资源文件直接位于这些目录下。
    • Spring Boot JAR :包含一个 BOOT-INF 目录,其中 BOOT-INF/classes/ 包含应用的类文件,BOOT-INF/lib/ 包含所有依赖库,META-INF 目录包含启动信息。

代码示例

普通 JAR 文件示例

一个普通的 Java 项目,编写一个简单的 HelloWorld 应用:

java 复制代码
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}

编译并创建 JAR 文件:

bash 复制代码
javac HelloWorld.java
jar cf hello-world.jar HelloWorld.class

运行普通 JAR 文件:

bash 复制代码
java -jar hello-world.jar
# 错误提示:No main manifest attribute, in hello-world.jar

由于没有指定 Main-Class,必须指定类路径和主类:

bash 复制代码
java -cp hello-world.jar HelloWorld
# 输出:Hello, World!
Spring Boot JAR 文件示例

Spring Boot 应用的启动类如下:

java 复制代码
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 打包:

bash 复制代码
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 文件:

bash 复制代码
java -jar target/my-spring-boot-app-1.0.0.jar
# 启动 Spring Boot 应用,内嵌服务器自动运行

总结

  1. 启动方式:普通的jar文件需要通过命令行或者其他方式手动启动,而Spring Boot打成的jar文件可以直接使用 java -jar 命令来启动,简化了启动过程。

  2. 内嵌服务器:Spring Boot打成的jar文件内置了Tomcat或者其他的Web容器,可以直接作为独立的应用程序运行,而普通的jar文件需要依赖外部的服务器进行部署。

  3. 配置文件:Spring Boot打成的jar文件可以使用application.properties或者application.yml文件来配置应用程序的属性,简化了配置过程。而普通的jar文件没有这种默认的配置方式。

  4. 依赖管理:Spring Boot通过自动化的依赖管理,可以简化项目中的依赖管理过程。它会根据项目中使用的功能自动添加必要的依赖,减少了手动维护依赖的工作。

  5. 版本管理:Spring Boot通过统一的版本管理,可以确保项目中使用的各个依赖的版本兼容。这样可以避免因为依赖版本冲突而导致的问题。

  6. 自动化配置:Spring Boot通过自动化配置可以根据应用程序的需要,自动配置数据库、缓存等各种组件。这样可以减少开发者的配置工作。

  7. 模块化设计:Spring Boot将应用程序按照功能拆分成多个模块,使得代码结构更加清晰,易于维护和扩展。

  8. 监控和管理:Spring Boot提供了丰富的监控和管理功能,可以通过Actuator模块来监控应用程序的运行状况,并提供了一些常用的管理功能,如shutdown等。

相关推荐
用户908324602732 天前
Spring AI 1.1.2 + Neo4j:用知识图谱增强 RAG 检索(上篇:图谱构建)
java·spring boot
用户8307196840823 天前
Spring Boot 集成 RabbitMQ :8 个最佳实践,杜绝消息丢失与队列阻塞
spring boot·后端·rabbitmq
Java水解3 天前
Spring Boot 视图层与模板引擎
spring boot·后端
Java水解3 天前
一文搞懂 Spring Boot 默认数据库连接池 HikariCP
spring boot·后端
洋洋技术笔记3 天前
Spring Boot Web MVC配置详解
spring boot·后端
初次攀爬者4 天前
Kafka 基础介绍
spring boot·kafka·消息队列
用户8307196840824 天前
spring ai alibaba + nacos +mcp 实现mcp服务负载均衡调用实战
spring boot·spring·mcp
Java水解4 天前
SpringBoot3全栈开发实战:从入门到精通的完整指南
spring boot·后端
初次攀爬者5 天前
RocketMQ在Spring Boot上的基础使用
java·spring boot·rocketmq
花花无缺5 天前
搞懂@Autowired 与@Resuorce
java·spring boot·后端