一、编写springboot测试项目

出于测试目的,编写如下简单的 hello world程序,将其部署到 阿里云Centos服务器,实现外网访问 /hello 路径时,可返回 hello world!

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class Hello {
    @RequestMapping("/hello")
    public String hello(){
        return "hello world!";
    }
}

二、项目打包

将springboot项目打包为可执行的jar包:


springboot 整合阿里短信 将springboot项目部署到阿里云_jdk

三、pscp命令的使用

  • 工具:putty,下载地址:putty官网
  • 将生成的 jar 包上传到 centos 服务器

下载完成后放到 C:/WINDOWS/system32 目录下(相当于添加到系统目录),可以在任意 cmd 窗口使用putty命令;

上传文件格式:pscp+空格+本地文件+空格+用户名@ip地址:远端路径

C:\Users\lixy>pscp D:\demo-0.0.1-SNAPSHOT.jar root@101.200.146.118:springbootTest
root@101.200.146.118's password: //输入服务端密码
demo-0.0.1-SNAPSHOT.jar   | 17202 kB | 2457.6 kB/s | ETA: 00:00:00 | 100%

下载文件格式:pscp+空格+用户名@IP地址:远端路径+本地路径

C:\Users\lixy>pscp root@101.200.146.118:springbootTest/demo-0.0.1-SNAPSHOT.jar d:
root@101.200.146.118's password://输入服务端密码
demo-0.0.1-SNAPSHOT.jar   | 1824 kB | 140.3 kB/s | ETA: 00:01:49 |  10%

四、启动项目

1、直接使用 java -jar 运行jia包

springboot 整合阿里短信 将springboot项目部署到阿里云_spring boot_02

项目启动后,进行外网访问测试:

springboot 整合阿里短信 将springboot项目部署到阿里云_centos_03

  • 这种方式是一次性启动,当终端断开连接时,项目也会自动停止运行;

2、jar 包运行方式

  • 第一种:前台运行
java -jar demo.jar

用这种方法启动后,不能继续执行其它命令了;

如果想要继续执行其它命令,就都打断,打断一般用ctrl+c

  • 第二种:后台运行
java -jar demo.jar & // &表达的意思是在后台运行

这种方式可以避免打断后程序停止的问题;

但是避免不了关闭当前窗口后程序停止的问题

  • 第三种:后台持续运行
nohup java -jar demo.jar &

nohup是不挂断运行命令,当账户退出或终端关闭时,程序仍然运行;

日志默认输出到 nohup.out;

如果想关掉项目,可以做如下操作

//关闭进程
ps -aux | grep java
kill -s 9 12887 // 12887代表上一步查出的进程ID
  • 第四种:
nohup java -jar demo.jar >1.txt &

将日志重定向到1.txt文件中

  • 第五种:
nohup java -jar demo.jar >output.txt 2>&1 &

2>&1的意思 :
把标准错误(2)重定向到标准输出中(1),而标准输出又导入文件output.txt 里面,所以结果是标准错误和标准输出都导入文件 output.txt 里面了;

至于为什么需要将标准错误重定向到标准输出的原因,那就归结为标准错误没有缓冲区,而stdout有。这就会导致 >output.txt 2>output.txt 文件,output.txt 被两次打开,而stdout和stderr将会竞争覆盖,这肯定不是我们想要的.

这就是为什么有人会写成: nohup ./command.sh >output 2>output出错的原因了

nohup java -jar demo.jar >/dev/null 2>&1 &

/dev/null文件的作用,这是一个无底洞,任何东西都可以定向到这里,但是却无法打开。 所以一般很大的stdou和stderr当你不关心的时候可以利用stdout和stderr定向到这里
一般不需要查看日志的就直接丢掉丢掉

  • 拓展

使用脚本运行项目

1、新建 start.sh 文件
vim start.sh
nohup java -jar demo.jar >output.txt 2>&1 & // 写入启动命令

2、esc+:wq + 回车保存并退出

3、chmod 777 start.sh  //赋予管理员权限

4、nohup  ./start.sh &

五、采坑指南:

  • 阿里云开放端口,否则外网无法访问项目
    配置 0.0.0/0 表示任意网络可访问;

springboot 整合阿里短信 将springboot项目部署到阿里云_jar_04

springboot 整合阿里短信 将springboot项目部署到阿里云_springboot 整合阿里短信_05

  • Centos需要安装jdk环境 ,且jdk环境需要和项目打包使用的jdk环境一致,否则项目启动会失败
Exception in thread "main" java.lang.UnsupportedClassVersionError: pers/cyz/BookManage has been compiled by a more recent version of the Java Runtime (class file version 58.0), this version of the Java Runtime only recognizes class file versions up to 52.0
	at java.lang.ClassLoader.defineClass1(Native Method)
	at java.lang.ClassLoader.defineClass(Unknown Source)
	at java.security.SecureClassLoader.defineClass(Unknown Source)
	at java.net.URLClassLoader.defineClass(Unknown Source)
	at java.net.URLClassLoader.access$100(Unknown Source)
	at java.net.URLClassLoader$1.run(Unknown Source)
	at java.net.URLClassLoader$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)
  • 调整jdk环境后,项目启动或者打包时可能会报错:Error :java:无效的源发行版14,需要修改项目配置

springboot 整合阿里短信 将springboot项目部署到阿里云_centos_06

springboot 整合阿里短信 将springboot项目部署到阿里云_jar_07

springboot 整合阿里短信 将springboot项目部署到阿里云_centos_08

springboot 整合阿里短信 将springboot项目部署到阿里云_jdk_09