项目亮点之maven打包与项目部署
maven打包与项目部署
maven打包
多环境打包
在SpringBoot项目中,一般会有多个环境(开发环境、测试环境、上线生成环境等,每个环境的数据库、Redis等地址都不一样),用到profile属性(profile指具体是哪个环境),可以快速切换环境。
增加profile
我们项目默认的配置文件是application.yml,假设有3个环境(开发test、测试dev、线上pro),我们需要增加application-环境.yml(注意,必须与前面3个后缀一样,就是相当于application-test.yml),如下:
图中可以看出来,我们定义了test/dev/pro 共3个环境的配置文件
配置动态属性
优先级别为:命令行>idea>application.yml
yaml文件
spring:
profiles:
#本地环境的值是local,其他环境是对应的profile
active: test
以上配置设置了当前的环境,以上面的test为例,系统会先把application.yml和appication-test.yml都加载,这样会把两个文件中都有的配置合并互补,有冲突的配置以先加载的文件为准。
所以,实际项目为了配置精简,一般把跟环境无关的参数放在application.yml,跟环境相关的参数防止application-环境.yml中,这样可以简化配置,看起来更方便。
idea
命令行
项目用maven打包完为jar,执行的时候可以为java -jar 具体名称.jar --spring.profiles.active=pro
,可以在命令行中添加多个参数,会覆盖yml中的默认参数,多个参数例如java -jar seed-boot-0.0.1-SNAPSHOT.jar --spring.profiles.active=pro --server.port=8088
多人开发
实际项目开发的时候,一般会把spring.profiles.active设置为local,然后复制例如application-test.yml为application-local.yml,然后本地的配置在application-local.yml中修改,这样不会与其他人发生冲突。
另外多人项目中,一般用git管理代码,每个项目中都会有个.gitignore文件,可以参照项目,这个文件里面的文件都是只保留本地的文件,不会提交到服务器,一般会把application-local.yml也添加在这个文件中,.gitignore部分内容如下:
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
/.idea
/.settings
/*.iml
### project ###
application-local.yml
bootstrap-local.yaml
logs/
服务器打包
直接在seed_boot下用maven命令打包即可,命令为clean install -Dmaven.test.skip=true
,其中后面的-D参数的意思是忽略test文件
这种打包方式会包含所有的yml配置文件,如果我们不加任何参数,生效的是application.yml中的spring.profiles.active的参数,但是实际测试test或者其他环境都有自己的profile,所以我们线上的执行都会加上--spring.profiles.active=对应的profile
maven排重
识别冲突
maven识别
在项目下面执行如下命令
mvn dependency:tree -Dverbose >a.log
执行此命令可以检查Jar包版本冲突:mvn dependency:tree -Dverbose >a.log,然后在a.log文件里查找 是否有”omitted for conflict with”,如果有,则表示jar包有版本冲突 ;
注意:有版本冲突的也会显示编译成功的。然后把用冲突的包在自己的dependency用exclusion
如下图:
idea识别
如图,点击图示位置,就可以把整个项目的依赖关系展示出来,在图上就可以看到是否有冲突了,或者我们是否要排除某个包
排除jar包依赖
有多种做法,不过一般都是在pom文件的部分增加 标签,如下:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>sample.ProjectA</groupId>
<artifactId>Project-A</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
...
<dependencies>
<dependency>
<groupId>sample.ProjectB</groupId>
<artifactId>Project-B</artifactId>
<version>1.0-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>sample.ProjectD</groupId> <!-- Exclude Project-D from Project-B -->
<artifactId>Project-D</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>
实际环境部署
公司实际项目中,代码都是跑在linux系统上(docker可以理解也就是轻量化的linux操作系统,实际项目中也是跑在linux上,docker的命令跟linux类似),所以实际项目部署都是运维用bash脚本部署到生产环境的,一般步骤如下:
- 用maven(或者其他打包工具,maven是最主流的,会了maven参照这个其他的也很快就会了)把项目打包成jar、war或者docker镜像(springboot打包为jar,springMvc打包为war,部署到docker容器中打包为docker镜像)
- 用bash脚本获取到上面打包完的jar等,然后复制到实际的机器上,然后重启机器
- 实际环境都是集群,也是重复上一步中的bash脚本部署动作
部署方式
分环境打包有很多种方式,本节提供的是用Linux的bash脚本命令,核心流程如下:
- git拉取最新代码
- 使用maven脚本打包jar
- 使用ssh命令关闭原先程序
- 将项目打包的jar复制过来
- 重新启动jar
- 一台机器部署完毕,如果有多台的话按照上面的进行操作
相关脚本
部署脚本
#!/bin/bash
#这里可替换为你自己的执行程序,其他代码无需更改
APP_NAME=common.jar
#使用说明,用来提示输入参数
usage() {
echo "Usage: sh 执行脚本.sh [start|stop|restart|status]"
exit 1
}
#检查程序是否在运行
is_exist(){
pid=`ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}' `
#如果不存在返回1,存在返回0
if [ -z "${pid}" ]; then
return 1
else
return 0
fi
}
#启动方法
start(){
is_exist
if [ $? -eq "0" ]; then
echo "${APP_NAME} is already running. pid=${pid} ."
else
nohup java -jar $APP_NAME --spring.profiles.active=pro> /dev/null 2>&1 &
fi
}
#停止方法
stop(){
is_exist
if [ $? -eq "0" ]; then
kill -9 $pid
else
echo "${APP_NAME} is not running"
fi
}
#输出运行状态
status(){
is_exist
if [ $? -eq "0" ]; then
echo "${APP_NAME} is running. Pid is ${pid}"
else
echo "${APP_NAME} is NOT running."
fi
}
#重启
restart(){
stop
start
}
#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"restart")
restart
;;
*)
usage
;;
esac
操作脚本
#!/bin/bash
#代码打包
cd /home/deploy/ppp/****-service
git fetch
git checkout master
git pull
mvn clean package -Dmaven.test.skip=true
cd 下面某个分支/target
#如果需要git服务器和部署服务器不在一台用ssh跳转上去,否则没有ssh这段
ssh 10.25.62.161 'source /etc/profile;/seed-feed.sh stop'
sleep 5
ssh 10.25.62.161 'rm /代码部署路径/*.jar -rf'
scp ./实际项目.jar deploy@10.25.62.161:/代码部署路径/
ssh 10.25.62.161 'source /etc/profile;/seed-feed.sh start'
sleep 10
cd -
JVm优化参数
简单版
JAVA_OPTS="-Xms512m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=128m -Ddruid.registerToSysProperty=true"
完全版
JAVA_OPTS="$JAVA_OPTS -server -Xms2g -Xmx2g -Xmn1g -Xss1024K -XX:PermSize=256m -XX:MaxPermSize=512m -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:SurvivorRatio=4 -XX:MaxTenuringThreshold=10 -XX:CMSInitiatingOccupancyFraction=80"
nohup java $JAVA_OPTS -jar 实际项目名称.jar --spring.profiles.active=pro> /dev/null 2>&1 &
或
nohup java -Xms512m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=128m -Ddruid.registerToSysProperty=true -jar bimowo.jar --spring.profiles.active=生成环境 &
日志分析
线上日志一般都分为debug,info,error这几个级别(其中debug比较大,很多时候就不打开),每类日志都有单独的文件,然后日志也有总体的控制台输出问题,linux上就是catalina.out
- 查看当前日志就可以直接看这些文件
- 查看过去日志的话,debug/info/error这些日志都会按天切割,找到当天发生的日志,然后用linux命令就可以查看出错的文件
如下图:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!