SpringBoot,IDEA下打包成可执行JAR,启动原理
liuian 2025-01-07 14:15 67 浏览
前言:
项目开发完成,总是需要打包部署的,IDEA直接运行打包失败了(不是你想要的样子),经过尝试,pom.xml中需要做出配置。
配置内容(pom.xml):
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
<finalName>system</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
</plugins>
</build>或者
<build>
<finalName>health-system</finalName>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml </include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>插件功能解释:
spring-boot-maven-plugin
Spring Boot的Maven插件,能够以Maven的方式为应用提供Spring Boot的支持,即为Spring Boot应用提供了执行Maven操作的可能,能够将Spring Boot应用打包为可执行的jar或war文件,然后以通常的方式运行Spring Boot应用。
Spring Boot Maven plugin的5个Goals
spring-boot:repackage,默认goal,在mvnpackage之后,再次打包可执行的jar/war,同时保留mvn package生成的jar/war为.origin
spring-boot:run,运行Spring Boot应用;
spring-boot:start,在mvn integration-test阶段,进行Spring Boot应用生命周期的管理;
spring-boot:stop,在mvn integration-test阶段,进行Spring Boot应用生命周期的管理;
spring-boot:build-info,生成Actuator使用的构建信息文件build-info.properties;
maven-compiler-plugin
该插件对Java代码进行编译,如果不指定JDK版本,会自动使用一个默认的版本,具体配置内容参考如下:
<plugin>
<!-- 指定maven编译的jdk版本,如果不指定,maven3默认用jdk 1.5 maven2默认用jdk1.3 -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<!--
一般而言,target与source是保持一致的,但是,有时候为了让程序能在其他版本的jdk中
运行(对于低版本目标jdk,源代码中不能使用低版本jdk中不支持的语法),会存在target
不同于source的情况
-->
<!-- 源代码使用的JDK版本 -->
<source>1.8</source>
<!-- 需要生成的目标class文件的编译版本 -->
<target>1.8</target>
<!-- 字符集编码 -->
<encoding>UTF-8</encoding>
<!-- 跳过测试 -->
<skipTests>true</skipTests>
<verbose>true</verbose>
<showWarnings>true</showWarnings>
<!-- 要使compilerVersion标签生效,还需要将fork设为true,用于明确表示编译版本配置的可用 -->
<fork>true</fork>
<!-- 使用指定的javac命令,例如:<executable>${JAVA_1_4_HOME}/bin/javac</executable> -->
<executable><!-- path-to-javac --></executable>
<!-- 指定插件将使用的编译器的版本 -->
<compilerVersion>1.3</compilerVersion>
<!-- 编译器使用的初始内存 -->
<meminitial>128m</meminitial>
<!-- 编译器使用的最大内存 -->
<maxmem>512m</maxmem>
<!-- 这个选项用来传递编译器自身不包含但是却支持的参数选项 -->
<compilerArgument>-verbose -bootclasspath ${java.home}\lib\rt.jar</compilerArgument>
</configuration>
</plugin>打包后的jar包内容说明:
JAR包目录结构说明:
BOOT-INF/classes:目录存放应用编译后的class文件。
BOOT-INF/lib:目录存放应用依赖的第三方JAR包文件。
META-INF:目录存放应用打包信息(Maven坐标、pom文件)和MANIFEST.MF文件。
org:目录存放SpringBoot相关class文件。
JAR中META-INF/MANIFEST.MF的文件内容:
Manifest-Version: 1.0
Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx
Implementation-Title: 系统入口
Implementation-Version: 1.0
Start-Class: com.xxxx.xxxxx.Application
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Build-Jdk-Spec: 1.8
Spring-Boot-Version: 2.3.3.RELEASE
Created-By: Maven Jar Plugin 3.2.0
Main-Class: org.springframework.boot.loader.JarLauncher
启动原理
从上面可以看出,可执行jar包启动器:JarLauncher
1、当使用java -jar命令执行Spring Boot应用的可执行jar文件时,该命令引导标准可执行的jar文件,读取在jar中META-INF/MANIFEST.MF文件的Main-Class属性值,该值代表应用程序执行入口类也就是包含main方法的类。
2、从MANIFEST.MF文件内容,项目的启动类MainApplication定义在Start-Class属性中。
3、JarLauncher会将BOOT-INF/classes下的类文件和BOOT-INF/lib下依赖的jar加入到classpath下,然后调用META-INF/MANIFEST.MF文件Start-Class属性完成应用程序的启动。
启动原理说明:
1、命令行启动JAR之时,先执行JarLauncher类中的main方法。
2、先读取META-INF/MANIFEST.MF文件,解析出启动规则。
3、根据规则使用LaunchedURLClassLoader(应用程序类加载器)将lib和classes的内容加载。
4、反射调用:Start-Class: com.xxxx.xxxxx.Application,并将JarLauncher类中的main方法接收参数全部传递到Appplication类中的main方法。
5、启动应用程序和正常运行一样。
相关推荐
- cad2025永久激活密钥(cad2016激活密钥)
-
CAD2021的序列号和密钥激活步骤如下:1.首先,确保您已经购买了CAD2021的许可证。您可以在Autodesk官网上购买或联系您的Autodesk代理购买。2.下载并安装CAD2021软件。...
- window7下载lr2019(window7下载一键重装如何恢复网络)
-
手机上要下载软件的话就到手机上应用商店里面去下载是最安全的
-
- 在线装机软件哪个好(线上装机软件)
-
极客狗装机大师、极速系统装机大师都不错。1、极客狗装机大师采用了精美简洁的UI设计界面,让小白用户也可以轻松上手操作,可一键重装xp/win7/win8/win10操作系统,非常方便,有了它不用再担心自己不会重装系统啦,同时软件还提供了备份...
-
2026-01-08 23:05 liuian
- wifi防蹭网神器手机版下载(wifi防蹭网软件哪个好用)
-
以目前的路由器品牌来说,解决这个问题是非常简单的,根本不需要使用第三方的APP客户端,几乎所有的品牌都有自己的APP客户端1、360路由器360路由器直接在手机应用市场下载“360家庭防火墙”APP...
- 为什么硬盘插到电脑没有显示
-
1、驱动程序的问题。 硬盘不显示和驱动程序有很大关系,如果程序不匹配或者是有问题,硬盘无法被正常读取,需要先卸载掉之前的驱动,并重新安装新的驱动一般就能恢复。2、USB设...
- 电脑显卡天梯图2025(笔记本电脑显卡天梯图2025)
-
2024年奥运会排名预测,第一名美国,第二名中国。结合21年东京奥运会成绩和今年各奥运项目比赛成绩,美国在田径游泳金牌大项目是收获大量奖牌,中国会在跳水,乒乓球,羽毛球等强行收获满满,预测第一美国,第...
- 固态硬盘的作用是什么(固态硬盘有什么功能)
-
固态硬盘作用 固态硬盘最大的作用就是快防震抗摔性:传统硬盘都是磁碟型的,数据储存在磁碟扇区里。而固态硬盘是使用闪存颗粒(即mp3、U盘等存储介质)制固态硬盘作而成,所以SSD固态硬盘内部不存在任何机械...
- 笔记本电脑蓝屏进不去系统怎么办
-
当笔记本电脑开机出现蓝屏时,可以尝试以下步骤来恢复系统:1.重启电脑:按住电源按钮长按几秒钟,让电脑完全关机,然后再按下电源按钮重新启动电脑。有时候蓝屏问题可能只是暂时的,重启电脑后可能会解决问题。...
- windows7开机无法启动怎么办
-
电脑windows7无法启动解决方法如下1、进不了系统,首先关闭电源,开机之后立刻按F8键,进入系统模式选择界面;2、在这里有几种模式需要大家注意,安全模式、最后一次正确配置和正常启动模式,当然其他模...
- 无线路由器登录入口官网(lte无线路由器登录入口)
-
路由器最为常用的登录地址是192.168.1.1,有很多的网友把192.168.1.1称之为路由器登录官网跟路由器官网登录入口,这个叫法并不准确;因为不同品牌型号的路由器,它的登录地址可能是不一样的。...
- 怎么设置电脑自动关机win10(如何设置电脑自动关机win10)
-
windows10自动关机设置方法如下1、打开电脑管家主界面,点击右下角的“工具箱”;2、在工具箱的其他分类中选择打开“健康小助手”;3、健康小助手中有三项功能,护眼配色、定时休息和定时关机,点击定时...
- 如何在macbook上安装windows
-
1、网上自行下载需要安装的Windows系统,假设安装win10系统,那么你就把win10原版镜像直接下载到苹果电脑就可以了2、依次点击打开苹果电脑端的“应用程序/其他/bootcamp助理”3、然...
- 百度下载正版下载安装(百度下载并安装最新版官方下载)
-
下载方法:1.打开百度产品:桌面百度,点击立即下载2.下载成功后,打开安装包,选择安装路径后,点击立即安装3.等待安装成功后,回到桌面,查看左下角搜索框,输入你想要搜索的内容进行测试,点击右侧搜索即可...
- 一周热门
-
-
飞牛OS入门安装遇到问题,如何解决?
-
如何在 iPhone 和 Android 上恢复已删除的抖音消息
-
Boost高性能并发无锁队列指南:boost::lockfree::queue
-
大模型手册: 保姆级用CherryStudio知识库
-
用什么工具在Win中查看8G大的log文件?
-
如何在 Windows 10 或 11 上通过命令行安装 Node.js 和 NPM
-
威联通NAS安装阿里云盘WebDAV服务并添加到Infuse
-
Trae IDE 如何与 GitHub 无缝对接?
-
idea插件之maven search(工欲善其事,必先利其器)
-
如何修改图片拍摄日期?快速修改图片拍摄日期的6种方法
-
- 最近发表
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- vscode切换git分支 (35)
- python bytes转16进制 (35)
- grep前后几行 (34)
- hashmap转list (35)
- c++ 字符串查找 (35)
- mysql刷新权限 (34)
