SpringBoot工程的创建运行发布

Idea创建SrpingBoot工程

1. 创建

由于博客的示例代码都放在web-starter-demos项目里,所以这里我创建的是module而不是project

我们使用官方的Spring Initializr来初始化工程,jdk选择1.8:

image-20210112102036076

填好Group,Artifact,选择Java Version为8,点击Next

image-20210112102749459

Spring Boot我选择目前最新的稳定版本2.4.1,你可以在官网查询最新GA版本

同时这个界面还能让我们方便得选择一些开发常用的依赖,本文的简单项目,我们只添加以下两个,点击Next

image-20210112135337955

填好Module Name,点击Finish

image-20210112103919173

我们得到了如下目录结构的工程:

image-20210112105357563

2. 运行

我们直接点击主类的启动按钮:

image-20210112105444193

项目就运行起来了:

image-20210112105538899

可以看到默认情况下,项目运行在8080端口

3. 优化

作为开发者,我们电脑上肯定有装 Maven并配置了环境变量,所以我们不需要工程初始化带的Maven Wrapper

由于我这里是module 外层.gitignore已经做了全局配置,这里也不需要,帮助文档也删掉

1
rm -rf .mvn mvnw* .gitignore HELP.md

建议使用yml配置,我们把application.properties 改成 application.yml

一般建议显示指定端口号和服务名:

1
2
3
4
5
server:
port: 8080
spring:
application:
name: web-simple

编辑一下 IDE 里的运行配置:

image-20210112135821537

这里可以设置虚拟机参数,环境变量等:

image-20210112140241936

如图,一般开发的时候,我会指定比较小的堆内存大小,这样可以启动多个服务而不卡

还可以指定服务端口,比如要跑多个服务,直接点左上角复制一份配置,改个端口号就可以

以及可以指定 profile,比如区分开发环境、生产环境等,不需要改配置文件,即可指定启动

4. 请求

我们编写一个简单的Controller

1
2
3
4
5
6
7
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "Hello World!";
}
}

运行后可以直接访问,这里我使用插件RestfullTool来访问:

image-20210112114058484

5. 发布

我们在项目根目录下使用maven命令来打包项目(使用Idea的Maven插件点击按钮也可以):

-Dmaven.test.skip=true可以跳过测试

1
mvn clean package -Dmaven.test.skip=true

image-20210112115142859

打包完成后,target路径下就有了我们需要的可执行 jar

image-20210112115232952

然后就可以把 jar丢到服务端,运行起来:

1
java -jar web-simple-0.0.1-SNAPSHOT.jar

但是这样会占用控制台,可以使用 nohup命令在后台启动

1
nohup java -jar web-simple-0.0.1-SNAPSHOT.jar >/dev/null 2>&1 &

一般在服务器端会写一个启动脚本来控制应用的启动、关闭等操作,并且还可以配置想要的启动参数、环境变量等

这会在后续的博文中详细介绍,这里仅仅给出一个我使用的启动脚本文件:

start.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#!/bin/bash
JDK_HOME="java"
VM_OPTS="-Xms1g -Xmx1g"
SPB_OPTS="--spring.profiles.active=test"
APP_LOCATION="web-simple-0.0.1-SNAPSHOT.jar"
APP_NAME="web-simple-0.0.1-SNAPSHOT.jar"
PID_CMD="ps -ef |grep $APP_NAME |grep -v grep |awk '{print \$2}'"

start() {
echo "=============================start=============================="
PID=$(eval "$PID_CMD")
if [[ -n $PID ]]; then
echo "$APP_NAME is already running,PID is $PID"
else
nohup $JDK_HOME $VM_OPTS -jar $APP_LOCATION $SPB_OPTS >/dev/null 2>&1 &
echo "nohup $JDK_HOME $VM_OPTS -jar $APP_LOCATION $SPB_OPTS >/dev/null 2>&1 &"
PID=$(eval "$PID_CMD")
if [[ -n $PID ]]; then
echo "Start $APP_NAME successfully,PID is $PID"
else
echo "Failed to start $APP_NAME !!!"
fi
fi
echo "=============================start=============================="
}

stop() {
echo "=============================stop=============================="
PID=$(eval "$PID_CMD")
if [[ -n $PID ]]; then
kill -15 "$PID"
sleep 5
PID=$(eval "$PID_CMD")
if [[ -n $PID ]]; then
echo "Stop $APP_NAME failed by kill -15 $PID,begin to kill -9 $PID"
kill -9 "$PID"
sleep 2
echo "Stop $APP_NAME successfully by kill -9 $PID"
else
echo "Stop $APP_NAME successfully by kill -15 $PID"
fi
else
echo "$APP_NAME is not running!!!"
fi
echo "=============================stop=============================="
}

restart() {
echo "=============================restart=============================="
stop
start
echo "=============================restart=============================="
}

status() {
echo "=============================status=============================="
PID=$(eval "$PID_CMD")
if [[ -n $PID ]]; then
echo "$APP_NAME is running,PID is $PID"
else
echo "$APP_NAME is not running!!!"
fi
echo "=============================status=============================="
}

info() {
echo "=============================info=============================="
echo "APP_LOCATION: $APP_LOCATION"
echo "APP_NAME: $APP_NAME"
echo "JDK_HOME: $JDK_HOME"
echo "VM_OPTS: $VM_OPTS"
echo "SPB_OPTS: $SPB_OPTS"
echo "=============================info=============================="
}

help() {
echo "start: start server"
echo "stop: shutdown server"
echo "restart: restart server"
echo "status: display status of server"
echo "info: display info of server"
echo "help: help info"
}

case $1 in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
status)
status
;;
info)
info
;;
help)
help
;;
*)
help
;;
esac
exit $?

可以很方便地使用一下命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
~ ./start.sh
start: start server
stop: shutdown server
restart: restart server
status: display status of server
info: display info of server
help: help info
~ ./start.sh start
=============================start==============================
nohup java -Xms1g -Xmx1g -jar target/web-simple-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev >/dev/null 2>&1 &
Start web-simple-0.0.1-SNAPSHOT.jar successfully,PID is 6508
=============================start==============================
~ ./start.sh status
=============================status==============================
web-simple-0.0.1-SNAPSHOT.jar is running,PID is 6508
=============================status==============================
~ ./start.sh stop
=============================stop==============================
Stop web-simple-0.0.1-SNAPSHOT.jar successfully by kill -15
=============================stop==============================
~

源码及脚本都在Github

Enjoy it!