可执行 jar 和普通 jar 区别

面试官:Spring Boot 打成的 jar 和普通的 jar 有什么区别 Spring Boot 打成的 JAR 文件与普通的 JAR 的区别主要体现在两个方面:依赖管理、可执行性。 阅读详情

可执行 jar 和普通 jar 区别

在我们的项目中使用IDEA可以将项目打包,可以打成可执行jar和普通的jar包,那么这两种jar有什么区别呢?

1.打包插件

Spring Boot 中默认打包成的 jar 叫做 可执行 jar,这种 jar 不同于普通的 jar,普通的 jar 不可以通过 java -jar xxx.jar 命令执行,普通的 jar 主要是被其他应用依赖,Spring Boot 打成的 jar 可以执行,但是不可以被其他的应用所依赖,即使强制依赖,也无法获取里边的类。但是可执行 jar 并不是 Spring Boot 独有的,Java 工程本身就可以打包成可执行 jar 。

既然同样是执行 mvn package 命令进行项目打包,为什么 Spring Boot 项目就打成了可执行 jar ,而普通项目则打包成了不可执行 jar 呢?原因就是两种jar目录结构不同。

这我们就不得不提 Spring Boot 项目中一个默认的插件配置 spring-boot-maven-plugin ,这个打包插件存在 5 个方面的功能,从插件命令就可以看出:
在这里插入图片描述

  • build-info:生成项目的构建信息文件 build-info.properties
  • repackage:这个是默认 goal,在 mvn package 执行之后,这个命令再次打包生成可执行的 jar,同时将 mvn package 生成的 jar 重命名为 *.origin
  • run:这个可以用来运行 Spring Boot 应用
  • start:这个在 mvn integration-test 阶段,进行 Spring Boot 应用生命周期的管理
  • stop:这个在 mvn integration-test 阶段,进行 Spring Boot 应用生命周期的管理

这里功能,默认情况下使用就是 repackage 功能,其他功能要使用,则需要开发者显式配置。

2.打包

repackage 功能的 作用,就是在打包的时候,多做一点额外的事情:

1.首先 mvn package 命令 对项目进行打包,打成一个 jar,这个 jar 就是一个普通的 jar,可以被其他项目依赖,但是不可以被执行。

2.repackage 命令,对第一步 打包成的 jar 进行再次打包,将之打成一个 可执行 jar ,通过将第一步打成的 jar 重命名为 *.original 文件。

对任意一个 Spring Boot 项目进行打包,可以执行 mvn package 命令,也可以直接在 IDEA 中点击 package ,如下 :
在这里插入图片描述
打包成功之后, target 中的文件如下:
在这里插入图片描述
这里有两个文件,第一个 springapplication-0.0.1-SNAPSHOT.jar 表示打包成的可执行 jar ,第二个 springapplication-0.0.1-SNAPSHOT.jar.original 则是在打包过程中 ,被重命名的 jar,这是一个不可执行 jar,但是可以被其他项目依赖的 jar。

通过对这两个文件的解压,我们可以看出这两者之间的差异。

3.两种 jar 的比较

3.1 可执行 jar 解压之后,目录如下:

在这里插入图片描述
可以看到,可执行 jar 中,我们自己的代码是存在 于 BOOT-INF/classes/ 目录下,另外,还有一个 META-INF 的目录,该目录下有一个 MANIFEST.MF 文件,打开该文件,内容如下:

Manifest-Version: 1.0
Implementation-Title: demo
Implementation-Version: 0.0.1-SNAPSHOT
Start-Class: com.allan.demo.DemoApplication
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Build-Jdk-Spec: 1.8
Spring-Boot-Version: 2.1.8.RELEASE
Created-By: Maven Archiver 3.4.0
Main-Class: org.springframework.boot.loader.JarLauncher

可以看到,这里定义了一个 Start-Class,这就是可执行 jar 的入口类,Spring-Boot-Classes 表示我们自己代码编译后的位置,Spring-Boot-Lib 则表示项目依赖的 jar 的位置。

换句话说,如果自己要打一个可执行 jar 包的话,除了添加相关依赖之外,还需要配置 META-INF/MANIFEST.MF 文件。

3.2 不可执行 jar 解压之后

首先将默认的后缀 .original 除去,进行解压,目录如下:
在这里插入图片描述
解压后可以看到,不可执行 jar 根目录就相当于我们的 classpath,解压之后,直接就能看到我们的代码,它也有 META-INF/MANIFEST.MF 文件,但是文件中没有定义启动类等。打开该文件,内容如下:

Manifest-Version: 1.0
Implementation-Title: demo
Implementation-Version: 0.0.1-SNAPSHOT
Build-Jdk-Spec: 1.8
Created-By: Maven Archiver 3.4.0

注意:这个不可以执行 jar 也没有将项目的依赖打包进来。

从这里我们就可以看出,两个 jar ,虽然都是 jar 包,但是内部结构是完全不同的,因此一个可以直接执行,另一个则可以被其他项目依赖。

4.一次打包两个 jar

一般来说,Spring Boot 直接打包成可执行 jar 就可以了,不建议将 Spring Boot 作为普通的 jar 被其他的项目所依赖。如果有这种需求,建议将被依赖的部分,单独抽出来做一个普通的 Maven 项目,然后在 Spring Boot 中引用这个 Maven 项目。

如果非要将 Spring Boot 打包成一个普通 jar 被其他项目依赖,技术上来说,也是可以的,给 spring-boot-maven-plugin 插件添加如下配置:

	<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <classifier>exec</classifier>
            </configuration>
        </plugin>
    </plugins>
</build>

配置的 classifier 表示可执行 jar 的名字,配置了这个之后,在插件执行 repackage 命令时,就不会给 mvn package 所打成的 jar 重命名了,所以,打包后的 jar 如下:
在这里插入图片描述
第一个 jar 表示可以被其他项目依赖的 jar ,第二个 jar 则表示一个可执行 jar。

zipkin-server-2.11.1-exec.jar 使用JAVA命令启动该JAR,zipkin-server.jar是一个打包好的springBoot应用,springBoot自带tomcat因此只要启动JAR包就可以访问了。 java -jar zipkin-server-xxx.jar 启动完后访问localhost:9411可以查看统计界面。 立即下载

相关推荐

hive-exec-*.jar包

Missing Hive Execution Jar: /hive/hive1.2.1/lib/hive-exec-*.jar

【mvn打包】.jar 和 .jar.original的区别

.jar.original 是普通jar包,不包含依赖 .jar 是可执行jar包,包含了pom中的所有依赖,可以直接用java -jar 命令执行 ———————————————————————————————————— 如果是部署,就用.jar 如果是给别的项目用,就要给.jar.original这个包 ...

Macrohua的博客 3496

SWIFT报文格式解析:从MT103到MT760,这些金融电文你了解多少?

本文深入解析SWIFT报文格式中的MT103与MT760,详细介绍了这两种金融电文的结构、应用场景及实操技巧。MT103用于国际汇款业务,MT760则适用于银行保函开立,两者在国际金融交易中扮演关键角色。文章还提供了常见问题解决方案和自动化处理建议,帮助金融从业者高效处理跨境业务。

h9j8k7l6m5n的博客 1138

Java中original怎么用_springboot项目用maven打包,为什么在生成jar包的同时还生产.original文件?...

.jar.original是上一次打包的备份文件您还应该在target目录中看到一个更小的文件xxx-0.0.1-SNAPSHOT.jar.original。这是Maven在Spring Boot重新打包之前创建的原始jar文件。可以用jar tvf target/xxx-0.0.1-SNAPSHOT.jar.original查看文件内容。可以看出original文件只包含少量用户的类,不包含依赖...

weixin_36150355的博客 3710

本地部署DeepSeek连接MATLAB:打造私有化AI编程助手全攻略

大型语言模型(LLM)通过理解自然语言生成代码、解释技术概念,其核心原理是基于海量数据训练的Transformer架构。这项技术为工程计算和数据分析带来了效率革命,尤其在代码生成、调试辅助和文档自动化等场景价值显著。开源模型如DeepSeek-coder凭借优秀的代码理解能力,结合Ollama提供的本地化部署方案,实现了完全离线、低延迟的私有化部署。通过配置国内镜像加速下载,并利用MATLAB内置的HTTP通信函数构造API请求,工程师可以在熟悉的MATLAB环境中直接调用本地模型,处理数据清洗、算法验证等

weixin_30239339的博客 516

UDS 诊断 - CommunicationControl(通信控制)(0x28)服务 诊断

字节参数名称字节值#1CommunicationControl(通信控制)请求SID0x28#2#3communicationType(通信类型)#4nodeIdentificationNumer(节点标识符)(高位字节)controlType 为 0x04 或 0x05 时,使用该参数#5nodeIdentificationNumer(节点标识符)(低位字节)controlType 为 0x04 或 0x05 时,使用该参数。

耳朵东金子千的博客 1819

Maven打包(瘦身打包部署),不包含第三方依赖jar包

Maven打包(瘦身打包部署),不包含第三方依赖jar包

Jaemon 7180

PLL Performance,Simulation and Design 4th学习笔记——Chapter1

Chapter1:基本PLL概述 VCO:Voltage-Controlled Oscillator压控振荡器,对于给定的一个输入电压,输出特定频率的振荡信号。 PLL:Phase-Locked Loops锁相环,输出特定频率,特定相位的振荡信号。 基本PLL操作和术语 基本模块 基本模块 输入 输出 传输函数 说明 XTAL - 参考频率ϕref\phi_{ref}ϕref​ - 稳定的晶振提供输入参考频率(这里用相位,便于理解鉴相器) R Counter ϕref\phi_{ref

张硕的博客 1551

maven中exec的应用

本文原文连接: http://blog.youkuaiyun.com/bluishglc/article/details/7622286 ,转载请注明出处!1.为什么使用exec?现在的工程往往依赖众多的jar包,不像war包工程,对于那些打包成jar包形式的本地java应用来说,通过java命令启动将会是一件极为繁琐的事情,原因很简单,太多的依赖让参数-classpath变得异常的恐怖。为此,在发布应用时,一

煎饼灬果子的博客 1452

GCJ02坐标系转WGS84坐标系(已实地测试基本无偏差)

坐标系转化,GCJ02坐标系,WGS84坐标系

Xiao_XianYu_的博客 1855

AMDGPU IH(Interrupt Handler)实现分析

AMDGPU IH环形缓冲区机制是显卡驱动中高效处理GPU硬件中断的核心架构。该机制通过环形缓冲区存储中断事件,利用读写指针(wptr/rptr)同步硬件与驱动间的数据交互。硬件写入事件后驱动遍历处理,通过指针掩码实现环形循环,并具备溢出检测和虚拟化环境下的重置保护。其优势在于批量处理降低中断开销,指针同步确保可靠性,支持多队列扩展和SR-IOV虚拟化场景,为GPU中断管理提供了高性能基础架构。

图形/计算GPU的驱动与虚拟化技术分享园地 1632

Exec Maven Plugin全面解析和使用示例

本文原文连接: http://blog.youkuaiyun.com/bluishglc/article/details/7622286 ,转载请注明出处! 1.为什么使用exec? 现在的工程往往依赖众多的jar包,不像war包工程,对于那些打包成jar包形式的本地java应用来说,通过java命令启动将会是一件极为繁琐的事情,原因很简单,太多的依赖让参数-classpath变得异常的恐怖。为此,在发布应...

tempsitegoogle 780

STM32实战开发(133):基于STM32的智能GPS定位跟踪系统开发

本文详细介绍了如何基于STM32开发一个智能GPS定位跟踪系统。系统使用NEO-6M GPS模块获取实时定位数据,并通过SIM800L GPRS模块将定位信息上传到远程服务器。通过OLED屏幕实时显示位置数据,使用SD卡存储历史轨迹,并提供蜂鸣器报警功能。项目实现了GPS定位数据的获取、解析、存储和传输,为智能定位系统提供了完整的解决方案。

2201_76125393的博客 1643

Java面试必备:SpringBoot打成的 jar和普通的 jar有什么区别?

在 Java 开发中,JAR(Java Archive)文件是一种常见的打包格式,用于将多个 Java 类文件、资源文件和元数据打包成一个文件。Spring Boot 作为一种流行的 Java 开发框架,也使用 JAR 文件来打包应用程序。然而,Spring Boot 打成的 JAR 文件与普通的 JAR 文件在结构和使用方式上有一些显著的区别。本文将详细探讨这些区别,并通过流程图帮助读者更好地理解。

qq_58299462的博客 1263

2026年数字IC设计紫光展锐笔试带答案解析

本文是一份数字IC设计工程师/芯片验证工程师的笔试样题,包含单选题和多选题两部分。单选题共20题(每题2分),涵盖数字电路、C++/Verilog编程、芯片设计基础等内容,例如D/A转换计算、面向对象编程特性、三极管工作区域、Verilog仿真时间格式等。多选题15题(每题2分),考察Hold违例修复方法、验证方法学等知识点。试卷总分100分,考试时长90分钟,题型设计兼顾基础理论与工程实践,重点测试应聘者对芯片设计核心概念和工具链的掌握程度。部分题目解析详细说明了计算过程或概念原理,如第1题通过二进制转换

Open 110

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

SpringBoot项目打成可执行jar包需要配置启动类,不写启动类可以打成普通jar包

一、简介 大家都有这样的疑惑:为什么我的 Spring Boot 项目打包成的 jar ,被其他项目依赖之后,总是报找不到类的错误? 一般来说是因为你依赖的jar包报错了,大部分是因为依赖的jar包是springBoot项目打包成的可执行jar包!不能被其他项目依赖。 SpringBoot项目打成的可执行jar包的独特之处: 1.多了一个插件 Spring Boot 中默认打包成的 j...

krismile__qh的博客 1万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Spring Boot 打成的 jar 和普通的 jar 有什么区别?

通过将应用、依赖和服务器打包成单一文件,极大简化了开发、测试和部署流程。普通 JAR 则更适合传统架构或需要精细控制依赖的场景。Spring Boot 可执行 JAR 的核心优势在于。

weixin_43521001的博客 1091

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Spring Boot 打成的 jar 和普通的 jar 有什么区别 ?

Spring Boot 打成的 jar 和普通的 jar 有什么区别 ? Spring Boot 打成的 jar Spring Boot的项目终止以jar包的形式进行打包,这种jar包可以通过可以通过命令(java -jar xxx.jar)来运行的,这种jar包不能被其他项目所依赖,即使被依赖了也不能直接使用其中的类。普通的jar包,解压后直接就是包名,包里就是我们的代码,而 Spr...

bagaopan9141的博客 346

Spring Boot 打包成的可执行 jar ,为什么不能被其他项目依赖?

前两天被人问到这样一个问题: “松哥,为什么我的 Spring Boot 项目打包成的 jar ,被其他项目依赖之后,总是报找不到类的错误?” 大伙有这样的疑问,就是因为还没搞清楚可执行 jar 和普通 jar 到底有什么区别?今天松哥就和大家来聊一聊这个问题。 多了一个插件 Spring Boot 中默认打包成的 jar 叫做 可执行 jar,这种 jar 不同于普通的 jar,普通的 jar...

江南一点雨的专栏 6696

jar包依赖冲突排查思路和解决方法,以及类加载机制排查(系统原因也导致预发布环境和本地环境的差异),可执行的jar和依赖jar的区别

包依赖冲突

usa_washington的博客 6431

关于SpringBoot 打包成的可执行jar不能被其他项目依赖的问题

Spring Boot 项目打包成的 jar ,被其他项目依赖之后,总是报找不到类的错误? 大伙有这样的疑问,就是因为还没搞清楚可执行 jar 和普通 jar 到底有什么区别? 一、Springboot 项目的默认插件配置 Spring Boot 中默认打包成的 jar 叫做 可执行 jar,这种 jar 不同于普通的 jar,普通的 jar 不可以通过 java -jar xxx.jar 命令执行, 普通的 jar 主要是被其他应用依赖,Spring Boot 打成的 jar 可以执行,但是不可以被

1039

springboot的jar包为什么可以直接运行

Spring Boot 的 包能够直接运行,主要是因为它采用了 Spring Boot Loader 作为自定义类加载器,并且使用了 可执行 JAR(fat jar) 的结构。以下是详细的技术原理:Spring Boot 生成的 JAR 包不是传统的 Java JAR,而是 fat jar(可执行 JAR),它包含:一个典型的 Spring Boot JAR 结构: 其中, 目录存放了应用依赖的所有 JAR,而 目录存放应用的代码和资源文件。Spring Boot 的核心组件 提供了一个自定义的类加载

u012534547的博客 1014
上一篇: Spring Boot 中的静态资源位置
下一篇: 25.Spring Boot异常处理
Spring的思念
博客等级 码龄7年 80粉丝 143原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值