项目亮点之maven打包与项目部署

maven打包与项目部署

maven打包

多环境打包

在SpringBoot项目中,一般会有多个环境(开发环境、测试环境、上线生成环境等,每个环境的数据库、Redis等地址都不一样),用到profile属性(profile指具体是哪个环境),可以快速切换环境。

增加profile

我们项目默认的配置文件是application.yml,假设有3个环境(开发test、测试dev、线上pro),我们需要增加application-环境.yml(注意,必须与前面3个后缀一样,就是相当于application-test.yml),如下:

162867932247007

图中可以看出来,我们定义了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

162868435361908

命令行

项目用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
如下图:
img

idea识别

如图,点击图示位置,就可以把整个项目的依赖关系展示出来,在图上就可以看到是否有冲突了,或者我们是否要排除某个包

162875302581571

排除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命令就可以查看出错的文件

如下图:

162856714801016

posted @   Faetbwac  阅读(912)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示