百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

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...

qq安全中心官方下载(qq安全中心官网qq安全中心手机版)
  • qq安全中心官方下载(qq安全中心官网qq安全中心手机版)
  • qq安全中心官方下载(qq安全中心官网qq安全中心手机版)
  • qq安全中心官方下载(qq安全中心官网qq安全中心手机版)
  • qq安全中心官方下载(qq安全中心官网qq安全中心手机版)
为什么硬盘插到电脑没有显示

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.等待安装成功后,回到桌面,查看左下角搜索框,输入你想要搜索的内容进行测试,点击右侧搜索即可...