【运维篇】一、SpringBoot应用的打包和运行

文章目录

  • 1、工程打包与运行-Windows版
  • 2、SpringBoot打包插件
  • 3、踩坑点
  • 4、工程打包与运行-Linux版

【运维篇】一、SpringBoot应用的打包和运行_第1张图片

1、工程打包与运行-Windows版

功能开发完成后,服务肯定不能跑在我们本地的IDEA中,需要将代码打包并放在一台服务器上运行:

【运维篇】一、SpringBoot应用的打包和运行_第2张图片
对SpringBoot项目打包(执行Maven构建指令package)

# 清除之前的target
# mvn clean  
mvn package

也可在IDEA中双击Lifecycle.package:

【运维篇】一、SpringBoot应用的打包和运行_第3张图片

生成一个可运行的SpringBoot的jar包:

【运维篇】一、SpringBoot应用的打包和运行_第4张图片

Open In -> Explorer后打开cmd窗口,运行项目(执行启动指令)

java –jar springboot-xxx.jar

可能出现的情况:xx.jar中没有主清单属性,这和打的包有关 => SpringBoot的打包插件

【运维篇】一、SpringBoot应用的打包和运行_第5张图片

2、SpringBoot打包插件

使用SpringBoot提供的maven插件可以将工程打包成可执行jar包

<build>
	<plugins>
		<plugin>
			<groupId>org.springframework.bootgroupId>
			<artifactId>spring-boot-maven-pluginartifactId>
		plugin>
	plugins>
build>

SpringBoot为了让这个jar能独立运行,它要将工程中所使用的所有jar包都打到这一个工程包下,因此也叫Fat Jar:

【运维篇】一、SpringBoot应用的打包和运行_第6张图片

再看 jar包描述文件(MANIFEST.MF),普通的jar的内容是:

Manifest-Version: 1.0
Implementation-Title: springboot_08_ssmp
Implementation-Version: 0.0.1-SNAPSHOT
Build-Jdk-Spec: 1.8
Created-By: Maven Jar Plugin 3.2.0

基于spring-boot-maven-plugin打包的工程:

Manifest-Version: 1.0
Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx
Implementation-Title: springboot_08_ssmp
Implementation-Version: 0.0.1-SNAPSHOT
Spring-Boot-Layers-Index: BOOT-INF/layers.idx
Start-Class: com.demo.SSMPApplication   # 我的启动引导类
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Build-Jdk-Spec: 1.8
Spring-Boot-Version: 2.5.4
Created-By: Maven Jar Plugin 3.2.0
Main-Class: org.springframework.boot.loader.JarLauncher # jar的启动器类

Fat jar的启动Main方法是JarLauncher:

【运维篇】一、SpringBoot应用的打包和运行_第7张图片

它负责创建一个LaunchedURLClassLoader来加载boot-lib下面所依赖的那些jar:

【运维篇】一、SpringBoot应用的打包和运行_第8张图片

并以一个新线程启动应用的Main方法(找到manifest文件中的Start-Class):

【运维篇】一、SpringBoot应用的打包和运行_第9张图片

createMainMethodRunner方法中则传入了我主程序的引导类:

【运维篇】一、SpringBoot应用的打包和运行_第10张图片

3、踩坑点

引入maven-plugin打包插件后,mvn package仍得到一个普通jar包

【运维篇】一、SpringBoot应用的打包和运行_第11张图片

阿里云网址下创建的SpringBoot工程,skip为true时,只会生产本项目代码相关的包,而不会加入引入和启动类加载器等包,该jar包自然也不能运行,需要改为false才能打出可运行的jar包。

mvn clean package -D spring-boot.repackage.skip=false

这样,以后打包就很灵活,两种jar包都能打,而不用刻意注释掉打包插件。

Windows下解除端口占用

以下指令的端口号、PID可以不用加双引号。

# 查询所有端口
netstat -ano

# 查询指定端口,得到占用这个端口的PID
netstat -ano |findstr "端口号"

# 根据进程PID查询进程名称
tasklist |findstr "进程PID号"

# 根据PID杀死任务
taskkill /f /pid "进程PID号"

# 根据进程名称杀死任务(波及范围太大,一般不用)
taskkill -f -t -im "进程名称"

4、工程打包与运行-Linux版

在Linux下安装Java环境:

yum install java-1.8.0-openjdk.x86_64

查看版本:

java -version

将jar包拷贝到Linux后开始运行:

java -jar springboot-xx.jar

【运维篇】一、SpringBoot应用的打包和运行_第12张图片

但当前shell中Ctrl +C 会中止程序运行,因此需要使用nohup命令:

nohup java -jar springboot-xxx.jar > server.log 2>&1 &

在这里插入图片描述

【运维篇】一、SpringBoot应用的打包和运行_第13张图片

此时想中止服务运行,可:

ps -ef |grep -i "java -jar"
kill -9 PID

你可能感兴趣的:(SpringBoot,运维,spring,boot,后端)