IDEA Run SpringBoot程序步骤原理

这个文章不是高深的原理文章,仅仅是接手一个外部提供的阉割版代码遇到过的一个坑,后来解决了,记录一下。

1、IDEA Run 一个SpringBoot一直失败,提示找不到类,但是maven install成功,并且java -jar能成功run install出来的jar。这就说明maven依赖没有问题。

2、先了解IDEA的Run原理,选择SpringBoot启动类点Run之后,会生成一个临时jar文件classpath+随机数.jar在目录C:\Users\{登录用户}\AppData\Local\Temp。

3、打开这个jar发现里面只有META-INF/MANIFEST.MF,这个Manifest文件被用来定义扩展或档案打包相关数据,是一个元数据文件,它包含了不同部分中的名/值对数据。如果一个JAR文件被用来作为可执行文件,那么其中的Manifest文件需要指出该程序的主类文件(具体作用这里不解析)。

4、这个文件只定义了三个key,Manifest-Version,Created-By,Class-Path,前面两个只是定义版本和创建者。核心是Class-Path,这个key后面跟了一大串目录文件,包含jdk,spring等等的所有jar路径和启动类路径。其实这个Class-Path后面的引用文件就是IDEA这个启动module的全部dependency。

5、在看IDEA输出控制台的第一行启动命令(去掉了JAVA_OPT参数):

"C:\Program Files\Java\jdk1.8.0_202\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2022.3.2\lib\idea_rt.jar=62208:C:\Program Files\JetBrains\IntelliJ IDEA 2022.3.2\bin" -Dfile.encoding=UTF-8 -classpath C:\Users\administrator\AppData\Local\Temp\classpath1789558052.jar com.xxx.xxx.TestApplication

从这里可以看出IDEA的启动命令其实就是java命令+临时jar+启动主类。java -classpath classpath1789558052.jar  com.xxx.xxx.TestApplication,其中这个临时jar就是上面IDEA生成的临时jar。通过这个Class-Path引入了所有的依赖jar,从而Run起来这一个应用。

6、再看jar -jar 启动的jar包,把instal的jar包打开看,里面META-INF/MANIFEST.MF文件内容则简单很多,这个配置文件的内容是SpringBoot特性自有的。里面指定了Start-Class类,和Main-Class先启动SpringBoot加载类,再执行TestApplication中的main(具体可以搜索网上其他解析文章),关键是这个文件不可能再指定Class-Path,因为install后的jar需要处处可运行,所有所有依赖的jar都包含在了这个jar下面的BOOT-INF/lib目录下。

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: XXXXX
Start-Class: com.xxx.xxx.TestApplication
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Spring-Boot-Version: 2.1.0.RELEASE
Created-By: Apache Maven 3.3.1
Build-Jdk: 1.8.0_202
Main-Class: org.springframework.boot.loader.JarLauncher

7、java -jar 能启动成功说明项目install依赖的所有jar都没有问题,IDEA启动失败,IDEA里面Class-Path指定的外部jar肯定也是和install 安装后的jar同一个地方出来的。后来对比搜索了一遍IDEA临时jar里面META-INF/MANIFEST.MF 的Class-Path 发现多依赖了一个目录,没错是一个目录,这个目录指向的是这个IDEA工程下另外一个module,这个module的启动其实不需要依赖其他module的。所以回到上面截图里面的dependency 删除调这个依赖即可顺利运行。

结论:当出现install的jar能跑,IDEA不能跑得情况,就去对比IDEA里面dependency内容是否正确。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/63826.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uniapp 微信小程序 分包

1、manifest.json内添加如图所示: "optimization" : {"subPackages" : true },2、在与pages同级上创建各个分包的文件夹 把需要分包的文件对应移入分包文件夹内 3、page.json内修改分包文件的路径 比如: {"path" : &qu…

Zebec 创始人 Sam 对话社区,“Zebec 生态发展”主题 AMA 回顾总结

近日,Zebec Protocol 创始人 Sam 作为嘉宾,与社区进行了以“Zebec 生态发展”为主题的 AMA 对话。Sam 在线上访谈上对 Zebec 路线图、Zebec 质押、NautChain通证进行了解读,并对 Zebec 的进展、生态建设的愿景进行了展望。本文将对本次 AMA 进…

windows环境下如何更改pip安装的默认位置

1.查看配置信息 python -m site2.查看配置文件位置 python -m site -help3.修改配置文件 USER_SITE "D:\\soft\\Anaconda\\Lib\\site-packages" USER_BASE "D:\\soft\\Anaconda\\Scripts"如果遇到文件无法保存情况,请给用户增加权限。 4.…

设计模式行为型——观察者模式

目录 什么是观察者模式 观察者模式的实现 观察者模式角色 观察者模式类图 观察者模式举例 观察者模式代码实现 观察者模式的特点 优点 缺点 使用场景 注意事项 实际应用 什么是观察者模式 观察者模式(Observer Pattern)是一种行为型设计模式…

安全作业-Race竞争型漏洞、原型链污染

1.race漏洞一直卡在虚拟机安装上(待研究) 2.原型链污染 一、第一题js代码 const express require(express) var hbs require(hbs); var bodyParser require(body-parser); const md5 require(md5); var morganBody require(morgan-body); const app express(); var use…

谈谈对Android音视频开发的探究

在日常生活中,视频类应用占据了我们越来越多的时间,各大公司也纷纷杀入这个战场,不管是抖音、快手等短视频类型,虎牙、斗鱼等直播类型,腾讯视频、爱奇艺、优酷等长视频类型,还是Vue、美拍等视频编辑美颜类型…

《Zookeeper》从零开始学Zookeeper源码(二)之数据序列化与通信协议

目录 序列化与反序列化通信协议请求头的数据结构响应头的数据结构 序列化与反序列化 zookeeper的客户端与服务端、服务端与服务端之间会进行一系列的网络通信,在进行数据的传输过程中就涉及到序列化与反序列化,zookeeper使用Jute作为它的序列化组件&…

红队钓鱼技术之自解压钓鱼木马

简介 对于使用自解压文件的场景,攻击者可以创建一个自解压的exe文件,该文件解压后自动执行解压出来的文件。然后,通过插入RLO字符,将这个exe文件伪装成另一种看似安全的文件类型,比如文本文件或图片文件。当用户打开这…

decimal类型在MySQL中的正确使用 (长度和小数点)

1. MySQL(decimal) 对应 Java(BigDecimal) 2. decimal(16,2) MySQL中类型的设置, 长度16, 保留2位小数 3. 如果长度小于14, 则会出现没小数位的情况

Mybatis异常Invalid bound statement (not found)原因之Mapper文件配置不匹配

模拟登录操作 $.post("/admin/login", {aname, pwd }, rt > {if (rt.code 200) {location.href "manager/index.html";return;}alert(rt.msg)});网页提示服务器代码错误 POST http://localhost:8888/admin/login 500后端显示无法找到Mapper中对应的…

基于EIoT能源物联网的工厂智能照明系统应用改造-安科瑞黄安南

【摘要】:随着物联网技术的发展,许多场所针对照明合理应用物联网照明系统,照明作为工厂的重要能耗之一,工厂的照明智能化控制,如何优化控制、提高能源的利用率,达到节约能源的目的。将互联网的技术应用到工…

手机便签内容不见了怎么恢复正常?

在日常生活和工作中,很多人都需要随手记录事情,例如家庭琐事、孩子相关的事情、指定时间需要完成的工作任务、会议安排等。当我们需要随时随地记录事情的时候,手机便签应用就是非常不多的选择,我们直接打开手机上的便签APP就可以新…

爬虫009_字符串高级_替换_去空格_分割_取长度_统计字符_间隔插入---python工作笔记028

然后再来看字符串的高级操作 取长度 查找字符串下标位置 判断是否以某个字符,开头结尾 计算字符出现次数 替换

一、Webpack相关(包括webpack-dev-server用以热更新和html-webpack-plugin)

概念与功能: webpack是前端项目工程化的具体解决方案。它提供了友好的前端模块化开发支持,以及代码压缩混淆、处理浏览器端JavaScript的兼容性、性能优化等强大的功能。 快速上手:隔行变色 -S实际是--save的简写,表示安装的第三方…

0基础学习VR全景平台篇 第79篇:全景相机-泰科易如何直播推流

泰科易科技是中国的一家研发全景相机的高科技公司,前不久,在2020世界VR产业大会上发布了新一代5G VR直播影像采集终端--360starlight。以其出色的夜景成像效果和一“部”到位的直播方案重新定义了VR慢直播相机,对行业具有高度借鉴意义。 本文…

嵌入式开发学习(STC51-18-LCD液晶显示)

内容 在LCD1602液晶上显示字符信息; LCD1602介绍 简介 1602液晶也叫1602字符型液晶,它能显示2行字符信息,每行又能显示16个字符; 它是一种专门用来显示字母、数字、符号的点阵型液晶模块; 它是由若干个5x7或者5x…

嵌入式学习之震动喇叭项目

震动喇叭项目所用到的元器件有振动传感器模块、继电器模块、高功率喇叭、433M无线发射接收模块,通过这些模块,能够实现做出一个智能报警系统的项目出来,非常的有趣,特别是喇叭声音想起来,那个声音挺大的。 继电器的学…

【Java从0到1学习】06 Java 面向对象

1. 面向对象思想 面向对象是一种符合人类思维习惯的编程思想。现实生活中存在各种形态不同的事物,这些事物之间存在着各种各样的联系。在程序中使用对象来映射现实中的事物,使用对象的关系来描述事物之间的联系,这种思想就是面向对象。 提到…

RocketMQ 主备自动切换模式部署

目录 主备自动切换模式部署 Controller 部署​ Controller 嵌入 NameServer 部署​ Controller 独立部署​ Broker 部署​ 兼容性​ 升级注意事项​ 主备自动切换模式部署 该文档主要介绍如何部署支持自动主从切换的 RocketMQ 集群,其架构如上图所示&#xff…

Spring Boot数据访问基础知识与JDBC简单实现

目录 Spring Boot数据访问基础知识 Spring Data ORM JDBC JPA JDBC简单实现 步骤1:新建Maven项目,添加依赖 步骤2:配置数据源—让程序可以访问到 步骤3:配置数据源—让IDEA可以访问到 步骤4:添加数据库和表 …