从零到一在Linux服务器运行一个springboot的HelloWord案例
哈喽,大家好!想必HelloWord对学习编程的大家都不陌生,每一门编程语言学习的入门都看得到它的身影。这一次从零开始来完成一个springboot的线上可访问的HelloWord案例,分为云服务器获取 、基本环境搭建 、新建项目 、代码编写 、项目打包 、jar包启动 、项目上传运行 、防火墙配置并公网访问这几个大板块。
改文章主要针对小白,内容较为详细,涉及到的知识虽简单但不少,相信各位大佬朋友们应该都是会的,如果不嫌弃可以将其中部分Linux指令有关内容当成笔记,接下来进入正题。
一、云服务器获取
(一)选择云服务器厂商
国类几大出名的云服务器厂商,阿里云、腾讯云、华为云(ctrl点击可跳转)。这三家厂商都有学生认证 、免费试用 和新人优惠(ECS一年100左右) 、丰富的教程文档和学习资源。其中阿里云和华为云的客服与售后比较好,腾讯云的轻量级应用服务器功能较强客服不如前两者,小伙伴可以自己斟酌选择合适的厂商。除了大厂商之外,也有个别中型厂商价格合适,不过肯定不如大厂商的免费试用和新人优惠啦。
阿里云 最近新老用户同享99元一年ECS 的活动(2023年10月31日0点0分0秒至2026年3月31日23点59分59秒),作者优先选择阿里云作为云服务器获取的厂商。
(二)服务器选择
进入阿里云首页,鼠标悬浮上方一栏的权益中心,点击免费试用,如下图所示
进入免费试用页面后,勾选左边个人认证,会在右边列出所有个人可免费试用的云资源,选择左上角第一个云服务器ECS(每个用户只有一次试用机会,为三个月,作者已经用过了),如下
(三)服务器实例配置创建
点击立即试用之后就会进入到一个实例配置界面,如下
在选择完上面的配置,再接着一系列无脑下一步操作之后就可以得到一个创建好的ECS实例资源,可以在控制台管理资源(配置、修改密码、重启、开关机、升级规格什么的)。
二、基本环境搭建
(一)xshell远程连接和xftp文件传输
在获取到云服务器之后,就是连接上云服务器对其进行环境搭建了。由于是使用的Linux作为服务器操作系统,无法通过Windows自带的远程桌面连接进行连接。可以通过阿里云的控制台在网页进行登录连接,但是有些地方会略显不方便且对网络要求较高。xhsell是一款很好的Linux远程连接工具,一般和xftp配套同版本使用。官方免费版下载链接(ctrl点击可跳转),自行下载安装即可使用。
(二)连接到远程Linux服务器
打开xshell,依次点击左上角文件->新建->输入连接信息->连接
(三)JDK安装配置(Linux)
自己本地Windows环境的jdk安装配置略过,这里演示Linux的jdk安装。主要有两种安装方式,centos内核的yum安装openjdk和手动安装oracle的jdk,这两种各有其优缺点,下面的几种安装方式选择一种合适的安装即可。如果对Linux命令一点不了解的小伙伴请参考一下这篇笔记并试着练习
1.yum安装openjdk
openjdk较为方便,idea的SDK配置那里也有个自带默认的openjdk,但是是开源jdk,源码不够完整。
1.1执行命令yum list |grep jdk查看可安装的jdk
需要注意的是,因为使用的64位机子且安装的是jdk需要选择带**-devel**(开发环境也就是jdk)和**_64** 的安装,如上图红框框里的那种。这里选择java-1.8.0-openjdk-devel.x86_64版本,小伙伴可自行选择。
1.2执行yum install -y java-1.8.0-openjdk-devel.x86_64安装
执行完后耐心等待Complete。
yum安装的jdk默认安装到/usr/lib/jvm目录下,会默认配置好环境变量。
1.3执行java-version查看已安装jdk版本
因为早之前已经安装过高版本的jdk了,所以1.8的被覆盖掉了,可以执行rpm -qa|grep jdk查看所有已安装的jdk。
1.4yum卸载已安装jdk
执行yum -y remove java-1.8.0-openjdk*(如果是yum安装的文件,加粗的可换成对应文件名)卸载1.8.0所有openjdk相关文件。
2.rpm安装jdk
2.1获取rpm包
2.1.1官网(ctrl点击可跳转)手动下载并上传到服务器的一个自建目录下
选择要下载的版本(谨慎选择,作者虽然选择的8版本,但是前面的历史版本被锁了,要登录oracle才能下载,17、21版本可以直接下载)。
选择-linux-x64.rpm结尾的,这才是linux的jdk的rpm包。
打开xftp连接上服务器。
将下载好的rpm拖到服务器对应目录。
2.1.2在服务器对应目录执行wget命令下载rpm包。
bash
wget https://download.oracle.com/java/21/latest/jdk-21_linux-x64_bin.rpm
#下载链接可换成其他版本的可访问下载链接
执行成功后会在对应目录看到一个rpm文件。
2.2执行rpm -ivh安装
bash
rpm -ivh jdk-17.0.4.1_linux-x64_bin.rpm
#后面路径换成对应路径
2.3执行rpm卸载jdk
rpm查看已安装jdk上面已经有给了。
bash
rpm -e -nodeps jdk-17-17.0.4.1-ga.x86_64
#要卸载的jdk文件路径改为对应的
3.tar.gz包安装jdk
3.1获取tar.gz包
获取jdk的tar.gz包的和上述rpm的获取方式相同,在网页的同一界面手动选择下载tar.gz包上传到服务器对应目录或者找一个可下载的tar.gz包链接到对应目录执行wget命令。
3.2tar安装jdk
bash
tar -zxvf jdk-21_linux-x64_bin.tar.gz
#该命令会将jdk安装到tar.gz包所在目录下
3.3配置环境变量
tar安装的方式和Windows里的解压缩包安装jdk类似,需要手动配置环境变量。
在/etc目录下找到profile配置文件,也就是/etc/profile。
可以使用自带的vim进行编辑(执行vim /etc/profile),如果对命令不熟悉可以使用xftp文件传输打开profile文件用记事本进行编辑,在文件内最后空白处追加下面三行并保持退出。
bash
export JAVA_HOME=/***/*** #这里地址改成自己解压后的java目录地址
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib
执行下面命令让配置生效。
bash
source /etc/profile
执行java -version 出现版本号就是安装配置成功。
(四)代码编辑工具idea安装
1.官网选择idea版本
官方所有版本选择界面链接(ctrl点击可跳转)
因为是boot项目,所以选择专业版(小伙伴自行选择版本,作者选择2021.3.1或2021.3.2的版本)
2.安装idea
2.1下载好安装程序后,双击运行
作者已安装专业版,就用社区版演示,原理相同
2.2选择安装目录
2.3勾选需要选项
建议作者勾上的四条都勾选上
2.4直接点击install
2.5等待完成后选择选项点击finish完成安装
友情提示,专业版需要登录jetbrains账号试用30天或者激活才可正常使用,如果不想注册登号的小伙伴可以自行淘宝几块钱买一个破解器(附带破解教程)来激活。
3.中文插件下载
idea安装成功默认是英文,英文不习惯的小伙伴可以选择下载中文插件。
在登录了账号或者破解激活成功能够正常使用后可按照如下界面安装中文插件。
三、新建项目
作者使用idea专业版(安有中文插件),上面已经演示了社区版的安装。
1.点击新建项目
2.选择Spring Initializr创建boot项目
3.选择boot版本和依赖
4.项目创建完成
5.处理上面出现的问题
解决方法
结果演示
友情提示,不同小伙伴的电脑环境不同,有可能会出现一创建项目就出现其他情况的爆红,要学会自己百度解决。
四、代码编写
在启动类xxxApplication(我这里是DemoApplication)所在的包下面创建一个controller包并在controller包下创建一个TestController类(包名和类名可自取,包名小写开头,类名大写开头)。
完整代码如下
java
@RestController
public class TestController {
@GetMapping("/HelloWorld")
public String HelloWorld(){
return "HelloWorld";
}
}
本地调试
浏览器地址栏访问localhost:8080/HelloWorld,localhost和127.0.0.1等效是本地ip地址,8080是boot项目创建之后的默认端口号,如下界面能看到HelloWorld则代表本地测试成功。
五、项目打包
选择方便快捷的打包,一键点击即可。
在idea编辑器项目左侧target目录下可以看到已经打包好的项目jar包。
在某个自己喜欢的位置新建文件夹(文件夹命名最好带点标识性的,如项目名),将打包好的项目jar包复制一份到刚才新建的文件夹里面,然后再编写启动和终止脚本,如下图所示。
注意事项:即使是打包成功,但不代表不能运行成功,如果包里面缺少点东西(打包的时候漏掉了)就会运行失败。出现包错误导致的问题就自行复制报错信息百度解决,这里就不一一提出了。
六、jar包启动
(一)jar包启动脚本简单解释
1.什么是jar启动脚本
java的jar包启动脚本其实就是一个批处理文件,将多条命令放到一个文件里面依次执行。正常情况下我们都是在cmd控制台逐条执行的,jar包的启动命令最简单的是java -jar跟包名(有jdk是前提条件),每次需要的时候都单独手打命令就不太方便还容易打错,这时候脚本的好处就显现出来了。
jar包的启动脚本是分操作系统的,在不同的操作系统执行不同的脚本,.bat结尾的是在Windows上执行的,.sh结尾是在Linux操作系统运行的。
2.jar包启动脚本的一定好处
普通方式,也就是上面最简单的命令在控制台启动jar包,始终会有cmd控制台黑窗口,关掉黑窗口即终止程序。
假如jar包需要运行在Linux系统上,普通方式启动控制台会占用当前窗口,不能去操作其他,即使服务器一直开机的也不能断掉连接Linux服务器的终端(上面提到的xshell就是连接终端的一种),这样就极大的不方便,启动脚本就可以解决这样的问题。
(二)启动/终止jar包(Windows)
1.普通启动方式
在包所在的目录打开cmd,并执行下面命令,xxx是jar包名称,StartupLog是日志文件名称可自取,去掉后面的-> StartupLog.log日志会打印在控制台,否则会打印在StartupLog.log日志文件里面(如果没有该日志文件执行之后会在当前目录自动生成一个)
bash
java -jar xxx.jar -> StartupLog.log
1.1打开控制台
1.2运行命令
1.3临时出现的错误,打包不完整导致的
1.4skip标签坑导致上面的错误,帮大家踩一踩
在创建boot项目成功后会默认生成一个main主包和test测试包。main里面存放需要正常使用的代码,test里面放测试用例的,如果不使用的话可以看情况干掉test这个包(有时候会因test包的间接关系导致打包失败)。
skip标签一般是配置来在打包的时候跳过测试用例的,但是用不好就会出问题,如下面被注释掉的skip标签就是导致这次打包不完整的原因。
上面的打包不完整,注释或删掉那行true再重新打包一下,target目录下生成xxx.jar和xxx.jar.original文件就没问题了,如下。
这里解释一下,在依赖配置里面,如果没有spring-boot-starter-parent父工程(也就是下面这段配置)的情况下,使用skip标签就会影响到打包导致打包不完整。而刚才在创建boot项目的时候只引入了一个spring-boot-starter-web,是没有spring-boot-starter-parent的,又使用了skip标签因此导致打包不完整。对于解决没有主清单属性这个错误还有一个办法就是手动添加,过于繁琐不建议使用。
xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
1.5解决错误后,成功启动
注意,一般来说启动之后一直有黑窗口控制台的只要叉掉这个黑窗口就可以终止程序,特殊情况才需要到任务管理器去终止。
2.bat脚本启动方式
2.1创建并编辑脚本
1.在jar包所在目录新建一个文本文档,如start.txt
2.将start.txt改为start.bat。
3.用记事本打开start.bat进入编辑。
2.2非后台启动脚本
在脚本内写入如下几行,jar包名称改成自己对应的,保存退出后右键运行即可
less
@echo off
@title test1
@color 20
java -jar demo-0.0.1-SNAPSHOT.jar
上述脚本解释
@echo off:关闭命令行回显,使输出更简洁。
@title:设置控制台的显示标题,test1是标题名称。
@color :值为两位16进制数,分别设置控制台背景颜色和字体颜色,20代表绿色背景和黑色字体(如上图),值的规则如下。
java -jar demo-0.0.1-SNAPSHOT.jar 这一行就是启动命令,和上面普通启动需要手敲的命令是一样的,如果需要将日志打印到日志文件在后面加个> xxxlog.log就行,如下。
bash
java -jar demo-0.0.1-SNAPSHOT.jar > StartupLog.log
2.3后台启动(没有黑窗口)
在脚本第二行加入vbscript:CreateObject("WScript.Shell").Run("%~s0 ::",0,FALSE)(window.close)&&exit,如下
bash
@echo off
%1 mshta vbscript:CreateObject("WScript.Shell").Run("%~s0 ::",0,FALSE)(window.close)&&exit
java -jar demo-0.0.1-SNAPSHOT.jar >StartupLog.log
exit
3.jar包终止运行方式(后台启动)
3.1任务管理器手动关进程
在任务管理器找到java的进程,结束进程就可以了
3.2在cmd通过Windows命令终止进程
步骤如下
1.通过进程的端口查找进程的信息
2.从里面找到占用该端口的该进程PID
3.终止该PID的进程
用到命令
查找端口netstat -ano | findstr :port;其中-ano是参数,-a表示显示所有连接和监听端口,-n表示以数字形式显示地址和端口,-o表示显示与每个连接相关的进程PID;port是要查找的端口号,换成对应数值。
杀死进程taskkill /PID pid /F;其中pid代指要杀死进程的PID,换成对应数值,/F代表强制终止进程。
例子
3.3编写一个终止jar包脚本
新建一个bat文件,添加如下内容,port端口号改为jar包占用的端口号
bash
@echo off
set port=8080
for /f "tokens=1-5" %%i in ('netstat -ano^|findstr ":%port%"') do (
echo kill the process %%m who use the port
taskkill /pid %%m -t -f
goto q
)
:q
(三)启动jar包(Linux)
在Linux上可以直接执行命令的,我们为了方便所以选择将命令写到start.sh文件里面(.sh文件就是shell脚本),这样每次启动的时候只需要在当前目录执行./start.sh命令就可以了。两者启动之后的效果是几乎一样的,一个是控制台直接输入命令执行启动,一个是把命令一成不变的放到脚本里面然后执行脚本启动。
1直接启动
直接启动和Windows上的直接启动是一样的,命令复制过来就可以
java -jar demo-0.0.1-SNAPSHOT.jar
为了保险起见也可以用**-Dfile.encoding=utf-8**指定一下编码
ini
java -jar -Dfile.encoding=utf-8 demo-0.0.1-SNAPSHOT.jar
在Linux上这样启动很大的一个弊端,上面提到过,启动好了就不能动了,不能ctrl+c也不能退出连接终端(xshell这个软件),任意一个退出都会导致程序终止。
2后台启动
在命令的结尾加上一个**&**符号代表后台启动
java -jar demo-0.0.1-SNAPSHOT.jar &
这种启动方式可以ctrl+c退出,但不能退出连接终端,退出终端程序终止。简单来说就是启动之后可以去服务器上做其他的事(执行其他命令),但不能断开终端和服务器的连接。
3nohup启动
在上一条命令的基础上在前方加上一个nohup
bash
nohup java -jar demo-0.0.1-SNAPSHOT.jar &
这种启动方式会默认生成一个nohup.out记录日志(日志不会打印在控制台),ctrl+c和退出终端程序都不终止。
4重定向标准输出
在上面命令的基础上添加一个 >xxx.log就可以,这样日志输出就会重定向到我们指定的xxx.log文件中,而不是默认的nohup.out文件,但是日志依旧是默认的标准输出。
bash
nohup java -jar demo-0.0.1-SNAPSHOT.jar >StartupLog.log &
5重定向错误输出(常用)
这里简单解释一下shell脚本
Linux中1表示标准输出(写不写1都是默认的标准输出),2表示错误输出
1>xxx.log和**>xxx.log**是等效的,因为默认1可以省略掉,表示标准输出重定向到xxx.log文件中。
如果需要重定向错误输出到xxx.log文件中,在后面再跟一句2>&1变成**>xxx.log 2>&1**,&1代指前面的xxx.log文件,如果不加&就变成了重定向到1这个文件了。
完整命令如下
bash
nohup java -jar demo-0.0.1-SNAPSHOT.jar >StartupLog.log 2>&1 &
6.终止进程
使用kill -9 PID命令强制结束进程,PID是要结束进程的进程号,例如我要结束进程号为6666的进程
bash
kill -9 6666
(四)本地启动jar测试
选一种上面提到的启动方式在本地运行jar包,去浏览器看能否正常访问,可以看到下方能够正常访问。
七、项目上传运行
在本地测试没问题后就可以将项目上传到云服务器运行。作者选择将准备好的整个文件夹上传,文件夹内容也就是之前看到的内容,如下。
1.打开xshell连接上服务器
前面讲过新建连接了,这里直接右键打开连接。
2.新建一个自己的目录
先用cd/进入跟目录
然后使用mkdir -p /目录名/目录名创建一个多级目录
示例
bash
mkdir -p /server/myproject
这里作者已经创建好了,作者就省去创建步骤直接进入该目录
然后使用ls命令查看当前目录下的文件(隐藏文件不可查看)
3.上传项目文件
怎么上传文件前面已经提到了,这里就不演示了,上传成功后如上图中那个HelloWorldDemo文件夹就是上传的文件夹
4.启动运行
上面提到了几种启动方式,作者选择常用的那个
进入到HelloWorldDemo目录执行相应命令
出现的4464就是这个java进程的进程号,一般来说,能出现进程号就代表启动成功。
5.查看是否运行成功
上图情况是运行成功的,如果不放心,可用下面两种方式确保。
方式一查看输出日志
在当前目录用tac命令查看日志文件,tca是从文件最后一行开始显示,也就是从上到下显示的分别是文件内容的最后一行到第一行。能在日志里面看到Application in 2.453 seconds (JVM running for 2.901)这类似的代表运行成功
bash
tac 要查看的文件名
方式二查看java进程信息
使用 ps aux | grep java命令就可以查看和java有关的进程,参数grep是分类的意思。
perl
ps aux | grep java
八、防火墙配置并公网访问
到这里,我们的项目算是成功运行了的,但没有配置防火墙规则,肯定是访问不起的。防火墙配置分为服务器的防火墙端口放行 和运营商控制台的端口放行,两者缺一不可。
(一)服务器防火墙配置
1.有关命令
1.1-1.3里面的命令执行之后只要没提示不报错就是成功的
1.1防火墙启动命令
这两个命令都是启动防火墙,因系统内核不同而不同,centos7下面命令总有一个能成功。
sql
service firewalld start
systemctl start firewalld
1.2重启防火墙
与版本和内核不同有关,两者择其一,总有一个能执行
service firewalld restart
systemctl restart firewalld
1.3关闭防火墙(不建议关闭防火墙)
arduino
service firewalld stop
service stop firewalld
1.4查看防火墙规则全部信息
css
firewall-cmd --list-all
1.5查看防火墙已放行端口
css
firewall-cmd --list-ports
1.6开启(放行)端口
css
firewall-cmd --zone=public --add-port=8080/tcp --permanent
这里做一个解释
--zone 参数是作用域,参数值就写public就行
--add-port 参数是添加要放行的端口号,参数值格式为端口号/tcp,如上面的80/tcp;不想每次都单独开一个端口号,可以一次放行一个区间的端口号,如8080-8089/tcp,就是放行8080到8089这个区间的十个端口号。
--permanent 参数可以让这个端口配置一直生效,建议带上 ,无此参数重启防火墙或者重启服务器都会导致端口配置失效
2.步骤
在知道了有关防火墙命令后,这里的步骤就变得极为简单了
第一步开启防火墙
第二步放行项目需要的8080端口
第三步重启防火墙
第四步查看端口是否开放
这样服务器这一侧的防火墙配置就大工搞成了,接下来对运营商的控制台进行防火墙规则配置
(二)运营商控制台配置防火墙规则
作者用的是华为云的虚拟机,就拿华为云做演示了,几大厂商的控制台防火墙配置大致差不多,会华为云的就会其他云的,反过来亦是。
1.登录云账号并进入控制台
一般来说控制台标志就在右上角个人的旁边,很容易找到。
华为云的控制台进来是这样的,其他的云的也会类似显示自己拥有的云资源。
2.进入安全组
上图类似的界面,可以看到有很多安全组,红框框里面是默认的安全组,默认使用的这个,对这个安全组进行操作即可。
3.配置默认安全组
点击默认安全组的右侧配置规则进入下面界面
4.添加规则
点击上方添加规则
正常来说添加完安全组规则保存之后就可以通过公网ip访问项目了。
(三)公网访问项目
如下则成功访问
如果有任何找不到页面的情况,请检查公网ip地址是否输入错误,防火墙配置是否错误或者生效。
小结
案例做起来不麻烦,文章写起来有点费时,在其中踩了一个小坑也查了诸多文章,很多知识点都总结在里面了,希望这篇7k字对大家能够有所帮助,如有错误请各位大佬们多多指正。