Spring Boot 打成的 jar 和普通的 jar

devtools/2024/12/22 13:47:27/

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 应用:

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 应用,内嵌服务器自动运行

总结

  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等。


http://www.ppmy.cn/devtools/97639.html

相关文章

6、JUC并发同步工具类应用与实战

JUC并发同步工具类应用与实战 常用并发同步工具类应用场景ReentrantLockReentrantLock常用APILock接口基本语法工作原理 ReentrantLock使用独占锁:模拟抢票场景公平锁和非公平锁可重入锁Condition详解结合Condition实现生产者消费者模式 ReentrantLock应用场景总结 …

【数据结构】队列

一、介绍 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端…

【STM32 Blue Pill编程】-定时器与中断

定时器与中断 文章目录 定时器与中断1、硬件准备及接线2、GPIO配置3、代码实现STM32F103C8 配有四个定时器,分别为 TIM1、TIM2、TIM3 和 TIM4。 它们充当时钟并用于跟踪基于时间的事件。 我们将展示如何使用 HAL 库在 STM32Cube IDE 中对这些定时器进行编程。 本文将涉及如下内…

C++:模拟实现string

前言&#xff1a; 为了更好的理解string底层的原理&#xff0c;我们将模拟实现string类中常用的函数接口。为了与std里的string进行区分&#xff0c;所以用命名空间来封装一个自己的strin类。 string.h #pragma once #define _CRT_SECURE_NO_WARNINGS 1#include<iostream&…

EmguCV学习笔记 VB.Net 4.4 图像形态学

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 教程VB.net版本请访问&#xff1a;EmguCV学习笔记 VB.Net 目录-CSDN博客 教程C#版本请访问&#xff1a;EmguCV学习笔记 C# 目录-CSD…

Java Web —— 第七天(Mybatis案例1)

环境搭建 准备数据库表(dept、emp) -- 部门管理 create table dept(id int unsigned primary key auto_increment comment 主键ID,name varchar(10) not null unique comment 部门名称,create_time datetime not null comment 创建时间,update_time datetime not null commen…

day30(8/16)——ansible

目录 一、回顾 1、mysql和python 1. mysql5.7 2. 可以使用pymysql非交互的管理mysql 2、mycat中间件 1. 独属于mysql主从的负载均衡策略 2.配置写主读从 3. 步骤 3.1 安装jdk 3.2 mycat 3.3 配置 3.4 启动和调试 二、运维自动化&#xff08;ansible&#xff09; 1、任务背…

QT emit关键字

QT的emit关键字 emit 是 Qt 框架中的一个关键字&#xff0c;用于显式地触发信号&#xff08;signals&#xff09;。信号是 Qt 中用于对象间通信的一种机制&#xff0c;通过 emit 关键字&#xff0c;程序员可以在代码中明确地触发信号&#xff0c;从而通知连接的槽&#xff08;…