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内容是否正确。

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pytest之测试用例执行顺序

前言 在unittest框架中,默认按照ACSII码的顺序加载测试用例并执行,顺序为:09、AZ、a~z,测试目录、测试模块、测试类、测试方法/测试函数都按照这个规则来加载测试用例。 而 pytest 中的用例执行顺序与unittest 是不一样的&#…

日常BUG ——乱码

😜作 者:是江迪呀✒️本文关键词:日常BUG、BUG、问题分析☀️每日 一言 :存在错误说明你在进步! 一、问题描述 A系统使用Feign调用B系统时,传递的String字符串,到了B系统中变为了乱…

算法基础之插入排序

1、插入排序基本思想 插入排序的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序)&a…

模拟实现消息队列项目(系列5) -- 服务器模块(虚拟主机)

目录 前言 1. 创建VirtualHost 1.1 定义虚拟主机的相关属性 1.2 VirtualHost 构造方法 1.3 交换机和队列的创建和删除 1.3.1 交换机操作 1.3.2 队列操作 1.4 绑定的创建和删除 1.5 发送消息到指定的队列/交换机 2. 实现路由规则Router 2.1 checkBindingKey() 2.2 checkRoutin…

23款奔驰AMG GT50升级原厂香氛负离子系统,清香宜人,久闻不腻

奔驰原厂香氛合理性可通过车内空气调节组件营造芳香四溢的怡人氛围。通过更换手套箱内香氛喷雾发生器所用的香水瓶,可轻松选择其他香氛。香氛的浓度和持续时间可调。淡雅的香氛缓缓喷出,并且在关闭后能够立刻散去。车内气味不会永久改变,香氛…

蓝桥杯-统计子矩阵

统计子矩阵 题目链接 思路: 使用前缀和滑动窗口 ,可以先计算出纵向或横向的前缀和,matrix[i][j]表示前i行第j列之和 然后遍历上边界top和下边界buttom,再这个上下边界内使用滑动窗口,由于前面维护了纵向前缀和&…

Linux网络协议和管理

Linux网络协议和管理 一.网络设备基本知识 图1-网络设备基本知识 二.TCP/IP协议栈简介 1.概述 网络协议通常工作在不同的层中,每一层分别负责不同的通信功能。一个协议族, 比如T C P / I P,是一组不同层次上的多个协议的组合。T C P / I P通…

什么是Netty

介绍 第一:Netty 是一个 基于 NIO 模型的高性能网络通信框架,其实可以认为它是 对 NIO 网络模型的封装,提供了简单易用的 API,我们可以利用这些封装好的 API 快速开发自己的网络程序。 第二:Netty 在 NIO 的基础上做了…

安卓13不再支持PPTP怎么办?新的连接解决方案分享

随着Android 13的发布,我们迎来了一个令人兴奋的新品时刻。然而,对于一些用户而言,这也意味着必须面对一个重要的问题:Android 13不再支持PPTP协议。如果你是一个习惯使用PPTP协议来连接换地址的用户,那么你可能需要重…

微信小程序中键盘弹起输入框自动跳到键盘上方处理

效果展示 键盘未弹起时 键盘弹起后: 实现方式 话就不多说了 我直接贴代码了 原理就是用你点击的输入框的底部 距离顶部的位置 减去屏幕高度除以2,然后设成负值,再将这个值给到最外层相对定位的盒子的top属性,这样就不会出现顶…

【Hystrix技术指南】(7)故障切换的运作流程原理分析(含源码)

背景介绍 目前对于一些非核心操作,如增减库存后保存操作日志发送异步消息时(具体业务流程),一旦出现MQ服务异常时,会导致接口响应超时,因此可以考虑对非核心操作引入服务降级、服务隔离。 Hystrix说明 官方…

使用 Python 和 Flask 构建简单的 Restful API 第 1 部分

一、说明 我将把这个系列分成 3 或 4 篇文章。在本系列的最后,您将了解使用flask构建 restful API 是多么容易。在本文中,我们将设置环境并创建将显示“Hello World”的终结点。 我假设你的电脑上安装了python 2.7和pip。我已经在python 2.7上测试了本文…