【学习日记2023.6.6】之 Linux环境下部署Java项目

news2024/11/23 21:27:07

文章目录

    • 5. 项目部署
      • 5.1 手动部署项目
      • 5.2 基于Shell脚本自动部署
        • 5.2.1 介绍
        • 5.2.2 推送代码到远程
        • 5.2.3 Git操作
        • 5.2.4 Maven安装
        • 5.2.5 Shell脚本准备
        • 5.2.6 Linux权限
        • 5.2.7 授权并执行脚本
        • 5.2.8 设置静态IP

5. 项目部署

开发的项目绝大部分情况下都需要部署在Linux系统中。下面通过两种方式,来演示项目部署,分别是:手动部署项目 和 基于shell脚本自动部署。

5.1 手动部署项目

1). 在IDEA中开发SpringBoot项目并打成jar包

执行package指令,进行打包操作,将当前的springboot项目,打成一个jar包。

2). 将jar包上传到Linux服务器

通过 rz 指令,将打好的jar包上传至Linux服务器的 /usr/local/app 目录下。 先执行指令创建app目录。

A. 在/usr/local下创建目录app
mkdir /usr/local/app

B. 切换到app目录下
cd /usr/local/app

C. 执行指令,进行jar包上传
rz

3). 启动SpringBoot程序

运行这个jar包项目执行如下指令即可:

java -jar springboot-web-quickstart-0.0.1-SNAPSHOT.jar

注意: 由于前面安装的Tomcat在启动时,会占用端口号8080,而当前springboot项目我们没有配置端口号,默认也是8080,所以我们要想启动springboot项目,需要把之前运行的Tomcat停止掉。

4). 检查防火墙,确保8080端口对外开放,访问SpringBoot项目

firewall-cmd --zone=public --list-ports

如果防火墙没有放开8080端口,还需要放开对应的端口号,执行如下指令:

firewall-cmd --zone=public --add-port=8080/tcp --permanent

5). 访问测试(因为虚拟机中ip是DHCP随机获取的,故Linux中的ip可能随主机是动态变化的)

http://192.168.27.67:8080/hello
请添加图片描述

6). 后台运行项目

当前这个demo工程已经部署成功了,并且也可以访问项目了。但是这个工程目前是存在问题的,当前项目启动的这个窗口被霸屏占用了,如果把这个窗口关闭掉(或ctrl+c),当前服务也就访问不到了。

目前程序运行的问题:

A. 线上程序不会采用控制台霸屏的形式运行程序,而是将程序在后台运行

B. 线上程序不会将日志输出到控制台,而是输出到日志文件,方便运维查阅信息

后台运行程序:

要想让部署的项目进行后台运行,需要使用到linux中的一个命令 nohup 。

**nohup命令:**英文全称 no hang up(不挂起),用于不挂断地运行指定命令,退出终端不会影响程序的运行

语法格式: nohup Command [ Arg … ] [&]

参数说明:

​ Command:要执行的命令

​ Arg:一些参数,可以指定输出文件

​ &:让命令在后台运行

举例:

​ nohup java -jar boot工程.jar &> hello.log &

​ 上述指令的含义为: 后台运行 java -jar 命令,并将日志输出到hello.log文件

让当前部署的项目后台运行,使用下面的指令:

nohup java -jar 项目jar包名 &> test.log &

请添加图片描述

7). 停止SpringBoot项目

kill -9 7973 #通过kill Java的运行进程 -9强制,-15正常

5.2 基于Shell脚本自动部署

5.2.1 介绍

通过自动部署来简化项目部署的操作,流程及操作步骤如下图所示。
请添加图片描述

操作步骤如下:

1). 在Gitee上创建远程仓库,并将本地的项目代码推送到远程仓库中

2). 在Linux中安装Git,克隆代码

3). 在Linux中安装maven

4). 编写Shell脚本(拉取代码、编译、打包、启动)

5). 为用户授予执行Shell脚本的权限

6). 执行Shell脚本

5.2.2 推送代码到远程

A. 创建远程仓库

B. 将idea中的代码提交并推送到远程仓库

5.2.3 Git操作

1). Git软件安装

通过yum命令在线安装git,执行如下指令:

yum list git			#列出git安装包
yum install git.x86_64			#在线安装git

通过上述指令,安装好git之后,可以通过 git --version去验证git的环境。

2). Git克隆代码

cd /usr/local/
git clone https://gitee.com/yishooo/linuxdemo.git

3). Git保存用户名密码

git配置文件有三个位置:

  1. /etc/gitconfig 系统配置文件,对应git config --system
  2. ~/.gitconfig 用户全局配置文件,对应git config --global
  3. 项目目录中.git/config 仅该项目配置文件,对应git config --local

使用git拉取时需输入用户名和密码,为防止每次都输入,可通过配置保存用户名和密码。

cd .git
vi config

添加如下内容:

[credential]
        helper = store

结果如下所示:
请添加图片描述

5.2.4 Maven安装

由于是maven工程,要想进行项目的编译打包,需要用到maven的指令,所以需要安装maven。具体操作步骤如下:

1). 上传下载的maven的安装包

通过rz指令上传maven安装包

2). 解压maven安装包到/usr/local目录

tar -zxvf apache-maven-3.5.4-bin.tar.gz -C /usr/local
#创建maven本地仓库文件夹
mkdir /usr/local/repo

3). 在/etc/profile配置文件中配置环境变量

vim /etc/profile

#修改配置文件,进入到命令模式,按G切换到最后一行,按a/i/o进入插入模式,然后在最后加入如下内容 :
export MAVEN_HOME=/usr/local/apache-maven-3.5.4
export PATH=$JAVA_HOME/bin:$MAVEN_HOME/bin:$PATH

#然后按ESC进入到命令模式,输入 :wq 保存并退出

要想让配置的环境变量生效,还需要执行如下指令:

source /etc/profile 

4). 修改maven的settings.xml配置文件,配置本地仓库地址

A. 切换目录

cd /usr/local/apache-maven-3.5.4/conf

B. 编辑settings.xml配置文件

vim settings.xml

在其中增加如下配置,配置本地仓库地址:

<localRepository>/usr/local/repo</localRepository>

并在settings.xml中的标签中,配置阿里云的私服(选做):

<mirror> 
 <id>alimaven</id> 
 <mirrorOf>central</mirrorOf> 
 <name>aliyun maven</name> 
 <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror> 

5.2.5 Shell脚本准备

Shell脚本(shell script),是一种Linux系统中的脚本程序。使用Shell脚本编程跟 JavaScript、Java编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。

在/usr/local/目录下创建一个目录 sh(mkdir sh),在sh目录下创建一个脚本bootStart.sh,内容如下:

#!/bin/sh
echo =================================
echo 自动化部署脚本启动
echo =================================
echo 停止原来运行中的工程
APP_NAME=linuxdemo #运行项目的名称
tpid=`ps -ef|grep $APP_NAME|grep -v grep|grep -v kill|awk '{print $2}'`  #查询系统中正在运行的linuxdemo的进程,排除grep和kill本身,取每行第2个字段(即进程id)
if [ ${tpid} ]; then
echo 'Stop Process...'
kill -15 $tpid #如果tpid不为空则正常kill进程
fi
sleep 2
tpid=`ps -ef|grep $APP_NAME|grep -v grep|grep -v kill|awk '{print $2}'` #睡眠2秒重新查询程序进程id是否还在
if [ ${tpid} ]; then
echo 'Kill Process!'
kill -9 $tpid  #还在进行强制kill进程
else
echo 'Stop Success!'
fi
echo 准备从Git仓库拉取最新代码
cd /usr/local/app/linuxdemo
echo 开始从Git仓库拉取最新代码
git pull
echo 代码拉取完成
echo 开始打包
output=`mvn clean package -Dmaven.test.skip=true` #用mvn先清除之前的target项目,再打包跳过测试部分
cd target
echo 启动项目
nohup java -jar linuxdemo-0.0.1-SNAPSHOT.jar &> linuxdemo.log &
echo 项目启动完成

5.2.6 Linux权限

Shell脚本要想正常的执行,还需要给Shell脚本分配执行权限。 由于linux系统是一个多用户的操作系统,并且针对每一个用户,Linux会严格的控制操作权限。

1). chmod(英文全拼:change mode)命令是控制用户对文件的权限的命令

2). Linux中的权限分为三种 :读®、写(w)、执行(x)

3). Linux文件权限分为三级 : 文件所有者(Owner)、用户组(Group)、其它用户(Other Users)

4). 只有文件的所有者和超级用户可以修改文件或目录的权限

5). 要执行Shell脚本需要有对此脚本文件的执行权限(x),如果没有则不能执行

Linux系统中权限描述如下:
请添加图片描述

解析当前脚本的权限情况:
请添加图片描述

chmod命令可以使用八进制数来指定权限(0 - 代表无 , 1 - 执行x , 2 - 写w , 4 - 读r):

权限rwx
7读 + 写 + 执行rwx
6读 + 写rw-
5读 + 执行r-x
3写 + 执行-wx
4只读r–
2只写-w-
1只执行–x
0

举例:

chmod 777 bootStart.sh   为所有用户授予读、写、执行权限
chmod 755 bootStart.sh   为文件拥有者授予读、写、执行权限,同组用户和其他用户授予读、执行权限
chmod 210 bootStart.sh   为文件拥有者授予写权限,同组用户授予执行权限,其他用户没有任何权限

注意:

三个数字分别代表不同用户的权限

  • 第1位表示文件拥有者的权限
  • 第2位表示同组用户的权限
  • 第3位表示其他用户的权限

5.2.7 授权并执行脚本

在测试阶段,可以给所有的人都赋予执行该shell脚本的权限。所以可以执行如下指令:

chmod 777 bootStart.sh

请添加图片描述

执行该shell脚本:
请添加图片描述

注意: 在执行maven指令进行打包时,第一次执行可能会耗时比较长,因为在进行maven工程的打包时,需要到中央仓库下载工程依赖的jar包和插件(可以在settings.xml中配置阿里云私服加速下载)。

启动完成之后, 可以查看java进程:
请添加图片描述

5.2.8 设置静态IP

默认IP地址是动态获取的,IP地址可能会发生变动

1). 设置静态IP

设置静态ip,需要修改 /etc/sysconfig/network-scripts/ifcfg-ens33 配置文件,内容如下:

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static               # 设置ip的获取方式为静态
IPADDR="192.168.93.152"        # 设置的静态IP地址
NETMASK="255.255.255.0"         # 子网掩码
GATEWAY="192.168.93.2"         # 网关地址
DNS1="192.168.93.2"            # DNS服务器
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=afd0baa3-8bf4-4e26-8d20-5bc426b75fd6
DEVICE=ens33
ONBOOT=yes
ZONE=public

请添加图片描述

上述所设置的网段为138,并不是随意指定的,需要和虚拟机中的虚拟网络编辑器中的NAT模式配置的网关保持一致。
请添加图片描述

2). 重启网络服务

ip地址修改完毕之后,需要重启网络服务,执行如下指令:

systemctl restart network

注意:重启完网络服务后ip地址已经发生了改变,需要创建一个新连接才能连接到Linux。

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

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

相关文章

springboot+vue多维的知识分类管理系统

随着国内市场经济这几十年来的蓬勃发展&#xff0c;突然遇到了从国外传入国内的互联网技术&#xff0c;互联网产业从开始的群众不信任&#xff0c;到现在的离不开&#xff0c;中间经历了很多挫折。本次开发的多维分类的知识管理系统有管理员和用户两个角色。管理员可以管理用户…

Dozzle-解决通过命令方式查看Docker 日志的神器

对于程序员们来说&#xff0c;Docker 一定是不陌生了。Docker 为我们的工作带来的巨大的便利&#xff0c;你可以使用它快速部署和扩展应用程序&#xff0c;并保证隔离性和可移植性&#xff0c;使应用程序在容器内独立运行&#xff0c;而且可以轻松地在不同的主机和操作系统上移…

bpmn是什么?bpmn.js的简单使用

文章目录 一、bpmn.js是什么&#xff1f;二、使用步骤1.引入bpmn2.使用bpmn3.引入bpmn-左侧工具栏4.引入bpmn-左侧工具栏5.引入bpmn数据导出6.数据导出为svg格式7.监听modeler并绑定事件7.监听element点击……8.自定义左侧工具栏图标9.自定义左侧工具栏完整效果 总结 一、bpmn.…

推动体系建设 助推融合发展|2023 开放原子全球开源峰会软件物料清单(SBOM)分论坛即将启幕

软件物料清单对于普通人而言可能很陌生&#xff0c;而对于从业者而言&#xff0c;软件物料清单是以 “开源” 为核心&#xff0c;通过有效识别和记录软件组成成分及相互依赖关系&#xff0c;保障软件全生命周期各环节要素的可控制、可预测、可管理。 由开放原子开源基金会主办…

云原生Docker网络管理和数据卷

Docker网络 Docker 网络实现原理 Docker使用Linux桥接&#xff0c;在宿主机虚拟一个Docker容器网桥(docker0)&#xff0c; Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址&#xff0c;称为Container-IP&#xff0c; 同时Docker网桥是每个容器的默认网关。 …

案例26:基于Springboot校园社团管理系统开题报告

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

那些你可能遇到的 Linux 命令?什么,你还不知道?赶紧收藏?完善中!

文章目录 一. Linux 进程1. 通过进程名查找进程号1.1 ps aux & ps -ef&#xff1a;diff1.2 ps aux & ps -aux&#xff1a;什么&#xff1f;它们不一样&#xff1f;1.3 grep & awk&#xff1a;取出进程号、取出进程号并 Kill 2. 通过进程号查看进程信息&#xff1a;…

视频理解学习笔记(四)

视频理解学习笔记&#xff08;四&#xff09; 3D CNNC3DI3DNon-local算子 &#xff08;Self-attention替换掉LSTM&#xff09;R (2 1) DSlowFast Video TransformerTimeSformer 总结Reference 3D CNN 双流的缺点&#xff1a;光流抽取太慢——tvl one算法&#xff0c;0.06s抽取…

什么是浅拷贝和深拷贝

javascript 中有不同的方法来复制对象,那么我们怎样才能正确地复制一个对象呢?&#xff0c;本文来介绍一下浅拷贝和深拷贝。 一、什么是浅拷贝(Shallow Copy) 浅拷贝是创建一个新对象&#xff0c;这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型&#xff0c;拷…

遗传算法在数学建模中的应用及MATLAB实现

2023年9月数学建模国赛期间提供ABCDE题思路加Matlab代码,专栏链接(赛前一个月恢复源码199,欢迎大家订阅):http://t.csdn.cn/Um9Zd 目录 遗传算法基本概念 遗传算法原理 MATLAB实现 1. 使用ga求解遗传算法问题 数学建模案例&#xff1a;旅行商问题&#xff08;TSP&#xf…

操作系统原理 —— 内存连续分配管理方式(二十)

在之前的章节中&#xff0c;我们到了内存管理&#xff0c;其中有一个很重要的功能&#xff0c;就是对操作系统中的内存进行分配和回收。 那如何对操作系统的内存进行分配呢&#xff1f; 整体上可以分为两种方式&#xff1a;连续分配管理方式、非连续分配管理方式。 这里提到的…

【vue3】08-vue的组件化开发-插槽(Slots)的完全指南

Vue插槽&#xff08;Slots&#xff09;的完全指南 插槽的作用插槽的基本使用具名插槽作用域插槽&#xff08;难点&#xff09; 插槽的作用 在开发中&#xff0c;我们会经常封装一个个可复用的组件: 前面我们会通过props传递给组件一些数据&#xff0c;让组件来进行展示;但是为…

【CVPR2023】TPS详解:联合令牌剪枝与压缩以实现视觉变形器更积极的压缩

【CVPR2023】TPS详解&#xff1a;联合令牌剪枝与压缩以实现视觉变形器更积极的压缩 0. 引言1. 为什么要使用TPS&#xff1f;2. TPS介绍3. TPS 详解3.1 重要性计算3.2 令牌压缩3.2.1 匹配3.2.2 融合 4. 简化版理解5. 总结 0. 引言 虽然 Vision Transformers &#xff08;ViTs&a…

小文智能宣布接入ChatGPT,智能化客户服务,开创全新用户体验

小文智能是一家致力于用AI技术解放劳动力的公司&#xff0c;最近我们接入了ChatGPT技术&#xff0c;深度探索AI在智能对话机器人领域应用的更多可能&#xff0c;这将为我们的客户带来更为优质的人机对话服务和全新的用户体验。 ChatGPT是一种基于人工智能的自然语言处理技术&a…

案例31:基于Springboot企业员工薪酬关系系统开题报告设计

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

逍遥自在学C语言 | break-循环的中断与跳转

前言 在C语言中&#xff0c;break语句是一种控制流语句&#xff0c;它用于终止当前所在的循环结构&#xff08;for、while、do-while&#xff09;或者switch语句&#xff0c;从而跳出循环或者结束switch语句的执行。 一、人物简介 第一位闪亮登场&#xff0c;有请今后会一直…

ML算法——梯度下降随笔【机器学习】

文章目录 11、梯度下降 11、梯度下降 梯度下降如何帮助参数优化&#xff1f; 梯度下降是一种用于参数优化的常见方法。它的基本思想是通过迭代地更新参数&#xff0c;以减小损失函数|代价函数的值&#xff0c;从而找到一个最优解。 梯度方向&#xff1a;→|向右|正向 ←|向左|反…

PostGIS(1):PostGIS概述

作为对象关系型数据库PostGreSQL的拓展模块&#xff0c;PostGIS可用于存储GIS数据&#xff0c;并提供了对基于GiST的R树索引支持、以及面向GIS对象的分析和处理相关的函数。 以下是PostGIS官网对其特征的介绍&#xff0c; &#xff08;1&#xff09; 先看一下百度对PostGIS的介…

Langchain-ChatGLM:基于本地知识库问答

文章目录 ChatGLM与Langchain简介ChatGLM-6B简介ChatGLM-6B是什么ChatGLM-6B具备的能力ChatGLM-6B具备的应用 Langchain简介Langchain是什么Langchain的核心模块Langchain的应用场景 ChatGLM与Langchain项目介绍知识库问答实现步骤ChatGLM与Langchain项目特点 项目主体结构项目…

php7新特性详细介绍(二)

一、PHP 7 异常 PHP 7 异常用于向下兼容及增强旧的assert()函数。它能在生产环境中实现零成本的断言&#xff0c;并且提供抛出自定义异常及错误的能力。 assert() 配置 | 配置项默认值可选值zend.assertions11 - 生成和执行代码 (开发模式) 0 - 生成代码&#xff0c;但在执…