【笔记】记录一次全新的Java项目部署过程

news2024/11/18 13:39:12

记录一次全新的Java项目部署过程

  • 环境:CentOS7

一、初始环境准备

yum install wget -y
yum install vim -y
yum install net-tools -y
mkdir /data
mkdir /data/html
mkdir /data/backend

一、安装JDK 17

  • 安装JDK17
# 下载rpm
wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.rpm
# 安装rpm(即安装jdk)
sudo yum -y install ./jdk-17_linux-x64_bin.rpm
# 校验安装是否成功
java -version

#得到如下输出说明成功
java version "17.0.11" 2024-04-16 LTS
Java(TM) SE Runtime Environment (build 17.0.11+7-LTS-207)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.11+7-LTS-207, mixed mode, sharing)

二、安装和配置Nginx

1 安装nginx
yum install epel-release
yum install nginx -y
2 配置nginx
# 配置文件默认位置
cd /etc/nginx/conf.d/
# 编辑配置文件
vim sh.conf
# 略
# server.stream、server.wx.stream等是动态的,根据启动的程序占用端口修改内容

三、安装redis

# 安装命令
yum install redis -y
# 启动redis
service redis start
# 停止redis
service redis stop
# 查看redis运行状态
service redis status
# 查看redis进程
ps -ef | grep redis
  • 设置为开机启动
chkconfig redis on
  • 设置密码
vi /etc/redis.conf
  • 查找 requirepass并修改密码
    在这里插入图片描述

四、测试环境打包

#在192.168.7.103上设置上设置免密登录服务器,用来传文件
ssh-copy-id -i ~/.ssh/id_rsa.pub  root@192.168.7.166
#一路按提示操作即可
  • 打包和上传命令
plat=${1}

folder=/data/chaiyou/oils-backend-template
distFolder=/data/chaiyou/bash/dist/server/


#跳转项目目录
cd ${folder}

#拉取最新代码
git pull

# gradle 打包
./gradlew :oils-backend:build -x test -x processTestResources -x checkstyleMain -x spotbugsMain -x verifyMergedCoverage -x compileTestJava -Dorg.gradle.java.home='/usr/local/jdk-17.0.8'  -Dorg.gradle.daemon=true

if [ $? -ne 0 ];then
 echo " build fail "
 exit 1
fi

#剪切打包结果jar包
# mv ${folder}/oils-backend/build/libs/oils-backend-0.0.1-SNAPSHOT.jar ${distFolder}/server.jar
scp ${folder}/oils-backend/build/libs/oils-backend-0.0.1-SNAPSHOT.jar root@192.168.7.166:/data/backend/

#登录到服务器上去执行重启命令
ssh root@192.168.7.166 << remotessh
cd /data/backend
bash restart.sh
exit

五、服务器上的重启脚本

  • 检查端口是否被占用的脚本(8080/8081端口交替使用)
  • checkPort.sh(位于/data/backend)
#!/bin/bash
#检查端口是否被占用,如果占用输出1,如果没有被占用输入0
port=${1}
#echo 'now checking port:'${port}
pIDa=`lsof -i :${port}|grep -v "PID" | awk '{print $2}'`
#echo $pIDa
if [ "$pIDa" != "" ];
then
   echo "1"
else
   echo "0"
fi
  • 重启脚本(restart.sh)
#默认端口
port=8080
portOld=8081

#今日日期
datestr=`date +"%Y%m%d%H%M%S"`

echo $datestr > date.log

#检查端口是否被占用
isPortInUse=`bash ./checkPort.sh ${port}`
if [ "$isPortInUse" == "1" ];
then
   echo "端口不可用"
   port=$[$port+1]
   portOld=8080
else
   portOld=8081
   echo "端口可用"
fi
echo '准备在端口'${port}'启动docker'


nohup java -Dspring.profiles.active=test -Dserver.port=${port} -jar oils-backend-0.0.1-SNAPSHOT.jar > output.${port}.log 2>&1 &


echo '正在启动程序,请耐心等待'
tail -f /data/backend/output.${port}.log | sed '/Started OilsApplication in\|JVM running for/q'

echo '准备修改nginx配置并重启'

echo 'proxy_pass http://127.0.0.1:'${port}'/web/;' > /etc/nginx/conf.d/server.stream
echo 'proxy_pass http://127.0.0.1:'${port}'/wx/;' > /etc/nginx/conf.d/server.wx.stream
echo 'proxy_pass http://127.0.0.1:'${port}';' > /etc/nginx/conf.d/doc.stream

nginx -s reload

echo '10秒后向原服务发出退出请求'

sleep 10

echo '正在请求原程序优雅退出'
exitResult=`curl http://127.0.0.1:${portOld}/systemd/graceful/exit`
echo '优雅退出结果:'${exitResult}

if [ "$exitResult" != "1" ]; then
  echo '优雅退出失败'
  exit 1
else
  echo '优雅退出成功'
fi

六、安装tesseract

  • 我的项目需要用到这个做最基本的图像识别
yum install tesseract -y
yum install tesseract-langpack-deu -y

七、提前准备好RDS

  • 用的是阿里云的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1884102.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

科普文:一文搞懂jvm(一)jvm概叙

概叙 因篇幅限制&#xff0c;这里将分为多篇文章来讲解。 为什么要学习jvm&#xff1f; 1.这是3年的java程序员必备技能。 2.理解“跨平台”、熟悉jvm组织结构、类的加载、双亲委派、对象在jvm中的生命周期、STD。 3.最终目的只有一个&#xff1a;用jdk提供的工具分析排查解决…

一篇带你了解ScheduledExecutorService的用法和适用场景

希望文章能给到你启发和灵感&#xff5e; 如果觉得文章对你有帮助的话&#xff0c;点赞 关注 收藏 支持一下博主吧&#xff5e; 阅读指南 开篇说明一、ScheduledExecutorService的作用二、ScheduledExecutorService的使用2.1 常用方法2.2 如何关闭释放资源 三、最后 开篇说明 …

SAPUI5基础知识10 - i18与国际化

1. 背景 i18n 是 “internationalization” 的缩写&#xff0c;其中的 18 是 “internationalization” 这个单词中间的字符数。i18n 是一种让应用程序支持多种语言的方法&#xff0c;也就是我们通常所说的国际化。 在SAPUI5中&#xff0c;i18n主要通过使用资源模型&#xff…

基于Java平价平价汽车租赁系统设计和实现(源码+LW+部署讲解)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;…

一、课程介绍,基础—环境安装、判断、循环语句等(爬虫及数据可视化)

一、课程介绍&#xff0c;基础—环境安装、判断、循环语句等&#xff08;爬虫及数据可视化&#xff09; 1. 课程介绍1.1 相关内容1.2 学习目标1.3 学习内容安排 2. python2.1 环境配置2.2 标识符和关键字2.3 运算符2.4 判断语句2.5 循环语句 1. 课程介绍 1.1 相关内容 10天的…

一文了解IP地址冲突的起因与解决方案

IP 地址冲突是困扰网络管理员影响网络的正常运行的常见因素。深入理解并有效解决 IP 地址冲突故障对于维护网络的高效稳定运行具有重要意义。 一、IP 地址冲突的原因 &#xff08;一&#xff09;人为配置错误 网络用户在手动配置 IP 地址时&#xff0c;对网络配置了解不多用户…

HarmonyOS开发探索:父子组件手势绑定问题处理

场景一&#xff1a;父子组件同时绑定手势的冲突处理 效果图 方案 在默认情况下&#xff0c;手势事件为非冒泡事件&#xff0c;当父子组件绑定相同的手势时&#xff0c;父子组件绑定的手势事件会发生竞争&#xff0c;最多只有一个组件的手势事件能够获得响应&#xff0c;默认子…

数据结构笔记第3篇:双向链表

1、双向链表的结构 注意&#xff1a;这里的 "带头" 跟前面我们说的 "头结点" 是两个概念&#xff0c;实际前面的在单链表阶段称呼不严谨&#xff0c;但是为了同学们更好的理解就直接称为单链表的头结点。 带头链表里的头结点&#xff0c;实际为 "哨兵…

# 职场生活之道:善于团结

在职场这个大舞台上&#xff0c;每个人都是演员&#xff0c;也是观众。要想在这个舞台上站稳脚跟&#xff0c;除了专业技能&#xff0c;更要学会如何与人相处&#xff0c;如何团结他人。团结&#xff0c;是职场生存的重要法则之一。 1. 主动团结&#xff1a;多一个朋友&#x…

UE5(c++)开发日志(3):将前面写的输出日志的方法进行封装

Public下新增一个c类&#xff1a; 选择无属性&#xff0c;因为不需要添加任何东西进去, 也不需要借助里面任何东西。 创建一个命名空间Debug&#xff0c;可以在命名空间内写一点静态方法 &#xff1a; namespace Debug{} static void Print(const FString& message, con…

试用笔记之-汇通汉诺塔-益智游戏

首先下载汇通汉诺塔&#xff1a; http://www.htsoft.com.cn/download/HanoiTower.rar 汇通汉诺塔游戏规则:把X轴的圈圈都移到Z轴过关。 还可以选择自动游戏哦&#xff0c;看看AI机器人玩汇通汉诺塔

前程无忧滑块

声明(lianxi a15018601872) 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 前言(lianxi …

启智畅想火车集装箱箱号识别系统,同时识别车皮号、火车底盘号码

1、应用背景 在现代物流体系中&#xff0c;铁路集装箱运输扮演着举足轻重的角色&#xff0c;目前各个铁路系统在管理集装箱车厢进出站时&#xff0c;方法传统&#xff0c;采用人工登记集装箱箱号、车皮号以及火车底盘号码的方式&#xff0c;效率低、错误率高、人员工作量大、信…

湖北大学2024年成人高考函授报名专升本会计学专业介绍

湖北大学&#xff0c;这所坐落于历史文化名城武汉的高等学府&#xff0c;自其创立之初&#xff0c;便秉持着“厚德博学&#xff0c;求是创新”的校训&#xff0c;致力于培养一代又一代的优秀人才。而今&#xff0c;为满足广大社会人士对高等教育的渴求&#xff0c;特别是那些已…

新的里程碑丨deepin校园联盟在拉丁美洲自由软件节上的国际风采

deepin校园联盟秉持推广开源文化与技术的宗旨&#xff0c;在全球技术交流的洪流中&#xff0c;再次于海外掀起热烈浪潮。在厄瓜多尔雅才理工大学&#xff08;Yachay Tech University&#xff09;&#xff0c;deepin校园联盟大使Mosquera率领团队&#xff0c;跨越数百公里之遥&a…

Jenkins教程-12-发送html邮件测试报告

上一小节我们学习了发送钉钉测试报告通知的方法&#xff0c;本小节我们讲解一下发送html邮件测试报告的方法。 1、自动化用例执行完后&#xff0c;使用pytest_terminal_summary钩子函数收集测试结果&#xff0c;存入本地status.txt文件中&#xff0c;供Jenkins调用 #conftest…

Optional类方法

Optional类 方法empty()方法of(T value)ofNullable(T value)filter(Predicate<? super T> predicate)get()ifPresent(Consumer<? super T> consumer)isPresent()map(Function<? super T,? extends U> mapper)orElse(T other)orElseGet(Supplier<? ex…

如何实现Action菜单

文章目录 1. 概念介绍2. 思路与方法2.1 实现思路2.2 实现方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"自定义标题栏"相关的内容&#xff0c;本章回中将介绍自定义Action菜单.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在这里提到的…

Swift 中的 StoreKit 测试

文章目录 前言创建一个 StoreKit Demo使用 SKTestSessionaskToBuyEnabled 属性总结前言 StoreKit 框架的第二次迭代是我在过去几年中应用程序中最重大的变化。最近版本的 StoreKit 框架已完全采用了 Swift 语言特性,如 async 和 await。本篇内容我们将讨论 StoreKitTest 框架…

AutoGen 两个agent讲相声

Lesson 1: Multi-Agent Conversation and Stand-up Comedy 第 1 课&#xff1a;多人对话和单口相声 Setup from utils import get_openai_api_key OPENAI_API_KEY get_openai_api_key() llm_config {"model": "gpt-3.5-turbo"}Define an AutoGen agent…