springboot项目打jar包发布上线、查看日志和进程号

news2024/11/27 21:32:00

目录

  • 前言
  • 一、Maven打包
    • 1.1 删除test文件和对应依赖(不建议)
    • 1.2 pom.xml中配置跳过测试
    • 1.3 使用idea打包
    • 1.4 使用maven命令打包
  • 二、启动jar包
    • 2.1 简单启动
    • 2.2 后台运行并打印日志
    • 2.3 脚本启动
  • 三、查看日志
    • 3.1 tail命令查看日志
    • 3.2 cat命令查看日志
  • 四、其他操作
    • 4.1 jps命令查看进程
    • 4.2 ps查询进程
    • 4.3 查看端口占用


前言

在项目开发完成后,需要把项目发布到Linux服务器上,在没使用到Jenkins时,项目的部署的步骤是怎么样的呢?


一、Maven打包

都知道maven的package命令是可以打成jar包的,但是在发布项目时,服务器上的路径或者数据库地址都是不一样的(打印日志的logback.xml的存放路径,或者数据库的连接地址不一致),因为package命令执行时会包含test。
在这里插入图片描述
空 contextLoads () 是验证应用程序是否能够成功加载 Spring 上下文的测试,相当于启动下项目能不能成功。

1.1 删除test文件和对应依赖(不建议)

在这里插入图片描述

1.2 pom.xml中配置跳过测试

<build>
    <plugins>
        <!-- maven 打包时跳过测试 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                <skip>true</skip>
            </configuration>
        </plugin>
    </plugins>
</build>

1.3 使用idea打包

在这里插入图片描述

1.4 使用maven命令打包

mvn package -Dmaven.test.skip=true

打包成功后,在项目路径下的target目录下会生产jar包,把jar包通过ssh客户端拖到服务器上。

二、启动jar包

java -jar是启动jar包的命令,来看看还有那些有用的参数。

2.1 简单启动

java -jar /opt/project/test-demo.jar 

在这里插入图片描述
此时可以使用Ctrl+C打断程序运行,关闭窗口程序退出。

2.2 后台运行并打印日志

运行命令:

nohup java -jar /opt/project/test-demo.jar --spring.config.location=/opt/project/config/test-demo.yml -Dserver.port=8082 > /opt/project/logs/demo.log 2>&1 &

参数解释

#(no hang up)不挂断,当账户退出或终端关闭时,程序仍然运行
nohup  
# 运行jar包
java -jar  
# 设置最大java堆大小
-Xmx256m 
# 设置初始java堆大小
-Xms256m
# 指定配置文件,可覆盖jar包内部配置
--spring.config.location 
# 指定端口号
-Dserver.port=8082 
# 指定配置文件
--spring.profiles.active=prod
# 在shell中,0表示标准输入,1表示标准输出,2表示标准错误
# 【> file】 表示将标准输出输出到demo.log中
> /opt/project/logs/demo.log 
# 相当于
1> /opt/project/logs/demo.log 
# 2>&1中&则表示等同于,即标准错误也输出到标准输出中
> 2>&1 
# 后台运行
&

不知道有没有想过或者试过运行的服务删除掉对应的jar包后是什么情况,服务还能访问吗?
答:jar包删除后,服务还能访问,只要某个进程仍在使用该文件,Linux就不会完全删除它。只有当最后一个用户终止或关闭该文件时,它才会完全消失。

2.3 脚本启动

demo.sh

#!/bin/sh
# 指定JAR包文件夹,将来运行的时候,此文件需要与jar包同级
AppName=你的jar包名字.jar
Timezone=Asia/Shanghai
#运行端口
ServerPort=8088
#激活application-pro.properties配置文件
ProfilesActive=pro
# JVM参数
JVM_OPTS="-Dname=$AppName  -Duser.timezone=$Timezone -Xms512M -Xmx512M -XX:PermSize=256M -XX:MaxPermSize=512M -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDateStamps  -XX:+PrintGCDetails -XX:NewRatio=1 -XX:SurvivorRatio=30 -XX:+UseParallelGC -XX:+UseParallelOldGC -Dspring.profiles.active=$ProfilesActive -Dserver.port=$ServerPort"
# 此变量会获取到当前路径
APP_HOME=`pwd`
# 日志路径 一定要有此路经的文件夹,没有此路径的文件夹,将不会有日志文件:$AppName.log,记得创建logs文件夹。
LOG_PATH=$APP_HOME/logs/$AppName.log
# 获取第一个参数 如果为空,将会提示这个
if [ "$1" = "" ];
then
    echo -e "\033[0;31m 未输入操作名 \033[0m  \033[0;34m {start|stop|restart|status} \033[0m"
    exit 1
fi
# 如果没有指定JAR包,将会提示这个
if [ "$AppName" = "" ];
then
    echo -e "\033[0;31m 未输入应用名 \033[0m"
    exit 1
fi
# start方法
function start(){
    # 获取PID,最后打印出结果$2 就是PID 注意,此处$2不是我们运行此脚本的第二个参数($0 不算做第一个参数)!
    PID=`ps -ef |grep java|grep $AppName|grep -v grep|awk '{print $2}'`

	if [ x"$PID" != x"" ]; then
	    echo "$AppName is running..."
	else
		nohup java -jar  $JVM_OPTS $AppName > $LOG_PATH 2>&1 &
		echo "Start $AppName success..."
	fi
}
# stop方法
function stop(){
    echo "Stop $AppName"

	PID=""
	# 定制查询服务PID的方法
	query(){
		PID=`ps -ef |grep java|grep $AppName|grep -v grep|awk '{print $2}'`
	}
	# 第一次查询状态,更变PID
	query

	if [ x"$PID" != x"" ]; then
		kill -TERM $PID
		echo "$AppName (pid:$PID) exiting..."
		while [ x"$PID" != x"" ]
		do
			# 间隔1秒执行后续代码
			sleep 1
			# 这是一个死循环,检查每一次PID,都会更变PID的最新结果,如果PID等于空了,就结束循环,输出结束
			query
		done
		echo "$AppName exited."
	else
		echo "$AppName already stopped."
	fi
}

function restart(){
    # 先停止服务,然后等待5秒后,再次重启服务
    stop
    sleep 5
    start
}

function status(){
    # 获取PID
    PID=`ps -ef |grep java|grep $AppName|grep -v grep|wc -l`
    # 如果PID为0,代表服务器停止,不为0,就代表服务器正在运行
    if [ $PID != 0 ];then
        echo "$AppName is running..."
    else
        echo "$AppName is not running..."
    fi
}
# 获取第一个参数,执行不同的方法!
case $1 in
    start)
    	start
    	;;
    stop)
    	stop
    	;;
    restart)
    	restart
    	;;
    status)
    	status
    	;;
    *)
# case的结束标志
esac

创建demo.sh后,需要给脚本权限

chmod 777 demo.sh

启动服务

./demo.sh start 

停止服务

./demo.sh start 

三、查看日志

3.1 tail命令查看日志

显示日志最后10行
tail -n 10 demo.log

实时监控显示日志最后10行
tail -10f demo.log

3.2 cat命令查看日志

搜索关键字,-n显示行数

cat -n filename | grep "关键字"

显示日志里匹配OutOfMemoryError那行已经前后10行

cat filename | grep -C 10 OutOfMemoryError

四、其他操作

4.1 jps命令查看进程

jps命令是JDK提供的一个命令行工具,用来显示当前所有java虚拟机的进程信息。

jps -mlvV
  • -m:显示Java虚拟机启动时传递给main()方法的参数。
  • -l:显示主类的完整包名,如果进程执行的是JAR文件,也会显示JAR文件的完整路径。
  • -v:显示Java虚拟机启动时传递的JVM参数。
  • -V:不显示主类名称、JAR文件名和传递给主方法的参数,只显示本地虚拟机唯一ID。
    在这里插入图片描述

4.2 ps查询进程

查询java进程
ps -ef | grep java

查询java进程排除当前进程
ps -ef | grep java | grep -v grep

4.3 查看端口占用

netstat -tunlp | grep 8080
在这里插入图片描述
如果使用netstat报错
-bash: netstat: command not found

【解决方法】

yum install net-tools

关闭进程 kill -9 进程号


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

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

相关文章

员工为什么对绩效考核不满意?管理者应该怎么做?

绩效考核是公司管理员工的重要工具&#xff0c;员工通过绩效考核可以衡量自己的工作效果和完成任务的能力&#xff0c;能够帮助管理者更好的了解员工的工作情况和绩效表现。 但是&#xff0c;现实中很多员工对绩效考核“不满意”&#xff0c;认为绩效考核不公正、不透明、不准确…

docker基础命令-阳哥

docker基础篇-阳哥 文章目录docker基础篇-阳哥centos7最小安装准备工作网络设置安装必备工具1.1 安装工具1.5 优化ssh连接1.1 修改ssh服务的配置文件1.2 找到对应的行数修改如下1.3 修改完成之后重启ssh服务1.6 永久修改主机名sed命令sed命令替换文本_xbd_zc的博客-CSDN博客1.镜…

《2023年化妆品原料成分趋势报告》| 解码化妆品备案数据,洞悉2023年潜力原料成分

回顾2022年&#xff0c;是中国化妆品行业“历史转折年”。备案制度的全面改革&#xff0c;直接改变了产品备案新格局。法律法规对新品备案提出了详实的要求&#xff0c;新品出炉也设置了更高的门槛&#xff0c;所以我们清晰地看到2022年整体的化妆品备案数据大幅度下滑&#xf…

精心梳理的11个在线常用工具,提高开发效率

1、Hutool工具类——Java开发常用工具类 参考文档&#xff1a;https://hutool.cn/docs/index.html#/ 2、在线工具——各种工具整合 我主要用于时间戳转换&#xff0c;进制转换等。 地址&#xff1a;https://tool.lu/ 3、蛙蛙工具——各种文本字符等整合工具 https://www…

python@pyside样式化

文章目录refWidget类创建样式化文件qss引用样式并启动应用ref Styling the Widgets Application - Qt for PythonQt Style Sheets Reference | Qt Widgets 5.15.12 Widget类创建 创建一个简单界面(菜单主要内容)它们是水平布局 主要内容包括一段文本和一个按钮,它们是垂直布…

AI大模型,驶向产业何方?

技术更迭&#xff0c;已不是壁垒&#xff0c;国产式AI需要的是产品的创新思维&#xff0c;以及对需求的产品变现能力。 作者|斗斗 出品|产业家 “AI炒了那么多年&#xff0c;第一次感觉它真的要来了。”国内某论坛中&#xff0c;带有ChatGPT的词条下&#xff0c;几乎都会出…

【Java开发】设计模式 01:单例模式

1 单例模式介绍单例模式&#xff08;Singleton Pattern&#xff09;是Java中最为基础的设计模式。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类&#xff0c;该类负责创建自己的对象&#xff0c;同时确保只有单个对…

打怪升级之使用csv文件发送UDP数据

面临的困难 如果你想做一个基于UDP包的数据处理问题的话&#xff0c;比较好的办法是使用csv文件来进行数据的保存&#xff08;csv文件比较简单&#xff0c;方便进行各种处理&#xff09;。 CSV文件格式简单&#xff0c;一方面它可以直接被excel处理&#xff0c;另一方面它完全…

PDF转word在线转换方法!操作简单又高效

相信很多已经工作的人都知道&#xff0c;PDF文件格式的优点在于兼容性强、安全性高&#xff0c;而且查看和传输给他人都很方便。但是&#xff0c;这种格式的文件也有不太方便的地方&#xff0c;那就是不能对文件内容进行编辑和修改。对于许多人来说&#xff0c;如果想要编辑修改…

接口自动化神器推荐:免费开源Lim接口测试平台

前言 对于传统的实现接口自动化的方案往往是搭建自动化框架&#xff0c;通过excel编写用例来驱动执行&#xff0c;例如常见的万金油技术栈组合&#xff1a;excel&#xff08;编写用例&#xff09;、pytest(用例执行)、allure(测试报告)等。 很多公司往往是通过自动化框架而非…

3-2 SpringCloud快速开发入门:Ribbon 实现客户端负载均衡

接上一章节Ribbon 是什么&#xff0c;这里讲讲Ribbon 实现客户端负载均衡 Ribbon 实现客户端负载均衡 由于 Spring Cloud Ribbon 的封装&#xff0c; 我们在微服务架构中使用客户端负载均衡调用非常简单&#xff0c; 只需要如下两步&#xff1a; 1、启动多个服务提供者实例并…

Matplotlib 绘图实用大全

本文只介绍最简单基本的画图方法 预设 要想画出来的图有些逼格&#xff0c;首先应该进行如下设置 plt.rcParams[font.sans-serif][SimHei] #画图时显示中文字体 plt.rcParams[axes.unicode_minus] False #防止因修改成中文字符&#xff0c;导致某些 unicode 字符不能…

正则表达式高阶技巧之环视的组合(使用python实现)

环视的组合介绍环视的组合环视中包含环视并列多个环视注意&#xff1a;环视作为多选分支排列在多选结构中断言与反向引用之间的关系介绍 在我们日常使用的编程语言都是支持环视的&#xff0c;但是语言不同&#xff0c;支持程度也就不同&#xff0c;下面具体介绍一下在python中…

【ChatGPT前世今生】前置知识Seq2Seq入门理解

【ChatGPT前世今生】前置知识Seq2Seq入门理解1、环境准备与依赖包安装2、数据集准备3、数据集预处理与读取4、定义Seq2Seq模型的基础类5、预处理训练数据集6、定义训练过程7、定义验证过程8、执行训练与验证过程9、展示模型的结果&#xff0c;进行进一步分析最近一段时间&#…

js - CommonJs和ES6 module的使用和区别

文章目录1&#xff0c;先说区别2&#xff0c;CommonJS3&#xff0c;ES6 module1&#xff0c;先说区别 阮一峰老师在 ES6 入门 中提到 ES6 模块与 CommonJS 模块有一些重大的差异&#xff1a; 它们有三个重大差异&#xff1a; CommonJS 模块输出的是一个值的拷贝&#xff0c;…

Idea+maven+spring-cloud项目搭建系列--11-1 dubbo(zookeeper,nacos)注册中心

前言&#xff1a;dubbo rpc 服务需要将服务提供者和消费者信息进行注册&#xff0c;以便于消费端可以完成远程接口调用&#xff1b;注册中心是 Dubbo 服务治理的核心组件&#xff0c;Dubbo 依赖注册中心的协调实现服务&#xff08;地址&#xff09;发现&#xff0c;自动化的服务…

json-server单独使用或者在react中进行使用

json-serverjson-server使用教程修改json-server端口号启动1、全局安装json-server2、在根目录生成一个db.json3、启动 访问react中进行使用react中修改json-server启动端口号1、 第一步也是安装&#xff0c;和第一种一样2、在根路径下定义一个__json_server_mock__文件夹3、在…

怎么合并或注销重复LinkedIn领英帐号?

您可能会发现您拥有多个领英帐户。如果您收到消息&#xff0c;提示您尝试使用的邮箱与另一个帐户已绑定&#xff0c;就表明您可能存在重复的领英帐户。如果您使用许多不同的邮箱地址&#xff0c;也可能会收到这样的提示。 领英精灵温馨提示: 目前&#xff0c;仅支持在 PC 端合并…

设置基站IP设置基站连接服务器

一、基站状态指示灯 基站正常连接上服务器&#xff0c;基站指示灯如下&#xff0c;第一个灯是电源指示灯常亮&#xff1b;第二个灯为运行指示灯&#xff0c;程序正常运行第二个灯一直闪烁&#xff1b;第三个灯为为网络指示灯&#xff0c;网络连接正常会常亮&#xff0c;网络不…

SQL注入进阶练习(一)一些进阶的注入方法

SQL注入进阶练习1. 二次注入1.1 概念1.2 sqllabs less-241.2.1 利用示例1.2.2 原理剖析1.3 网鼎杯2018 二次注入1.3.1 环境搭建1.3.2 解题思路1.3.2.1 寻找源码 - git泄露数据恢复1.git是啥2.获取源码泄露的数据1.3.2.2 源码分析1.3.2.3 爆破登陆密码1.3.2.4 实施二次注入获取f…