侧边栏壁纸
  • 累计撰写 269 篇文章
  • 累计创建 141 个标签
  • 累计收到 16 条评论

目 录CONTENT

文章目录

[笔记]SpringBoot实战(6)-Spring Boot 开发部署与测试

Sherlock
2018-12-12 / 0 评论 / 0 点赞 / 1680 阅读 / 0 字
温馨提示:
本文最后更新于2023-10-09,若内容或图片失效,请留言反馈。 部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

系列笔记:

1.开发的热部署

1.1 模板热部署

在Spring Boot里,模板引擎的页面默认是开启缓存的,如果修改了页面的内容,则刷新页面是得不到修改后的页面的因此,我们可以在 application.properties 中关闭模板引擎的缓存:
例如:

#Thymeleaf的配置:
spring.thymeleaf.cache=false
#FreeMarker的配置:
spring.freemarker.cache=false
#Groovy的配置:
spring.groovy.template.cache=false
#Velocity 的配置:
spring.velocity.cache=false

1.2 Spring Loaded

Spring Loaded 可以实现修改类文件的热部署(可在spring官网下载)。

在 IDE 运行配置的VM arguments中添加如下内容:

-javaagent:D:\spring-loaded.xxx.jar -noverify

1.3 JRebel

JRebel 是Java开发热部署的最佳工具,其对SpringBoot也提供了极佳的支持。JRebel为收费软件,可试用14天。之前有网站可以提供免费试用账号,目前已取消。

1.4 spring-boot-devtools

在Spring Boot项目中添加spring-boot-devtools依赖即可实现页面和代码的热部署。

implementation ('org.springframework.boot:spring-boot-devtools:x.x.x')

2.常规部署

2.1 jar 形式

maven和gradle都对Spring Boot有很好的支持,可以直接打出可执行jar包。
1.可使用 jar 方式直接运行:

java -jar xx.jar

例如:

nohup java -jar /xxx/xxx.jar -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -Xms512M -Xmx4G > /dev/null 2>&1 &
# 或者
java -jar /xxx/xxx.jar --spring.profiles.active=prod > /var/log/xxx.log 2>&1 &

贴上一个支持 start/stop/restart 的完整sh:

#!/bin/bash

appName=backup2oss-0.0.1-SNAPSHOT.jar
if [ -z $appName ];then
    appName=`ls -t |grep .jar$ |head -n1`
fi

function start()
{
	count=`ps -ef |grep java|grep $appName|wc -l`
	if [ $count != 0 ];then
		echo "Maybe $appName is running, please check it..."
	else
		echo "The $appName is starting..."
		#nohup /opt/java/jdk1.8.0_191/bin/java -jar ./$appName -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -Xms512M -Xmx4G > /dev/null 2>&1 &
		/opt/java/jdk1.8.0_191/bin/java -jar /opt/sherlock/backup2oss/build/libs/backup2oss-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod > /var/log/backup2oss.log 2>&1 &
	fi
}

function stop()
{
	appId=`ps -ef |grep java|grep $appName|awk '{print $2}'`
	if [ -z $appId ];then
	    echo "Maybe $appName not running, please check it..."
	else
        echo "The $appName is stopping..."
        kill $appId
	fi
}

function restart()
{
    stop
    for i in {5..1}
    do
        echo -n "$i "
        sleep 1
    done
    echo 0
    
    start
}

function status()
{
    appId=`ps -ef |grep java|grep $appName|awk '{print $2}'`
	if [ -z $appId ] 
	then
	    echo -e "\033[31m Not running \033[0m" 
	else
	    echo -e "\033[32m Running [$appId] \033[0m" 
	fi
}


function usage()
{
    echo "Usage: $0 {start|stop|restart|status|usage -f}"
    echo "Example: $0 start"
    exit 1
}

case $1 in
	start)
	start;;

	stop)
	stop;;
	
	restart)
	restart;;
	
	status)
	status;;
	
	*)
	usage;;
esac

2.还可以注册为Linux的服务:
主流的Linux大多使用init.dsystemd来注册服务。

  • 基于 Linux 的init.d部署
# 注册服务,在CentOS 6
sudo ln -s /xxx/APP-SNAPSHOT.jar /etc/init.d/APP
# APP 就是服务名
# 启动服务/停止服务/重启服务/服务状态
service APP start/stop/restart/status
# 开机启动
chkconfig APP on
# 项目日志存放于 /var/log/APP.log 下。
  • 基于 Linux 的systemd部署
    CentOS 7 可以在 /etc/systemd/system/目录下文件 APP.server,填入以下内容:
[Unit]
Description=APP
After=syslog.target

[Service]
ExecStart=/xxx/java -jar /xxx/APP-SNAPSHOT.jar

[Install]
WantedBy=multi-user.target

注意:在实际使用中修改 和 后面的内容。

# 启动服务/停止服务/重启服务/服务状态
systemctl start/stop/restart/status APP/APP.service
# 开机启动
systemctl enable APP/APP.service
# 项目日志
journalctl -u APP/APP.service

具体可以参考:SpringBoot 应用配置 CentOS 服务化

2.2 war 形式

打包成war文件形式,可以放在常见的几种Servlet容器上运行。

启动类要稍改造一下:

/**
 * SpringBoot 下war包运行
 * <p>参考:<a href="https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/htmlsingle/#howto-create-a-deployable-war-file">Spring Boot 2 Reference Guide</a></p>
 */
@SpringBootApplication
public class WarApplication extends SpringBootServletInitializer {

    /**
     * SpringBoot 项目打包war运行:
     * 这样做可以利用Spring Framework的Servlet 3.0支持,并允许您在servlet容器启动时配置应用程序。
     * build.gradle 提供的嵌入式servlet容器依赖项会生成一个可执行的war文件,其中提供的依赖项打包在lib-provided目录中。
     * 这意味着,除了可部署到servlet容器之外,还可以在命令行上使用java -jar运行应用程序。
     * @param application
     * @return
     */
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(WarApplication.class);
    }

    public static void main(String[] args) {
        SpringApplication.run(WarApplication.class, args);
    }
}

3.云部署-基于Docker的部署

3.1 Dockerfile 编写

在CentOS 7上的 /var/apps/APP 目录下放入我们编译好的 APP 的jar包,如 APP-0.0.1-SNAOSHOT.jar,在同级目录下新建一个 Dockerfile 文件。内容如下:

# 基镜像为Java,标签(版本)为8。
FROM java:8
# 作者
MAINTAINER Sherlock
# 将jar包添加到镜像中,并重命名为app.jar
ADD APP-0.0.1-SNAOSHOT.jar app.jar
# 运行镜像的容器,监听 8080 端口
EXPOSE 8080
# 启动时运行 java -jar app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]

3.2 编译镜像

在 /var/apps/APP 目录下执行以下命令,执行镜像编译:

docker build -t Sherlock/APP .

其中 Sherlock/APP 为镜像名称,此处设置Sherlock作为前缀,这也是Docker进行的一种命名习惯。
==注意==:最后还有一个“.”,用来指明Dockerfile路径的。

编译完成后,可以使用docker images查看本地进行。

3.3 运行

通过以下命令运行:

docker run -d --name APP -p 8080:8080 Sherlock/APP

可使用docker ps查看当前的容器状态。

4.gradle 命令运行

gradle bootRun时指定 springboot 的 profiles:

4.1 方法-1

修改build.gradle添加:

applicationDefaultJvmArgs = [
        "-Dspring.profiles.active=${project.gradle.startParameter.systemPropertiesArgs['spring.profiles.active']}"
]

执行命令:

gradle bootRun -Dspring.profiles.active=prod

4.2 方法-2(need gradle 4.9+)

执行命令:

gradle bootRun --args='--spring.profiles.active=prod'

4.3 方法3:

执行命令:

SPRING_PROFILES_ACTIVE=prod gradle bootRun

如果build时需要排除单元测试:

// gradle 构建暂时排除掉有问题的单元测试
test {
    exclude '**/*'
}
0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区