#!/bin/bash # ============================================================ # 脚本名称:build.sh # 功能说明:快速编译打包后端项目,支持多线程、增量、模块化编译 # 作 者:湖北新华业务中台研发团队 # 创建时间:2026-02-02 # ============================================================ # # 【优化策略】 # - 多线程编译:-T 1C 使用全部CPU核心并行编译 # - 增量编译:不执行 clean,复用已编译的 class 文件 # - 模块化编译:-pl :module -am 仅编译指定模块及其依赖 # - 静默模式:-q 减少日志输出,加快速度 # - JVM优化:-XX:TieredStopAtLevel=1 编译器快速模式 # # 【使用方法】 # ./build.sh [选项] # # 【选项说明】 # -q, --quick 快速编译(仅 compile,检查语法错误,最快) # -p, --package 增量打包(package,不 clean,默认选项) # -f, --full 全量编译(clean + package) # -m, --module 指定模块编译(如: -m pangu-business) # -r, --restart 编译后重启后端服务 # -c, --clean 仅清理 target 目录 # -h, --help 显示帮助信息 # # 【常用示例】 # ./build.sh -q # 快速编译,仅检查语法(约4秒) # ./build.sh -p # 增量打包(约4秒) # ./build.sh -f # 全量编译(约30秒) # ./build.sh -m pangu-business # 仅编译业务模块 # ./build.sh -m pangu-business -r # 编译业务模块并重启(约27秒) # ./build.sh -r # 增量打包并重启 # # 【开发建议】 # 1. 日常开发:修改代码后用 -q 快速检查语法错误 # 2. 本地测试:用 -r 编译并重启服务 # 3. 仅改某模块:用 -m 指定模块,加快编译速度 # 4. 部署前:用 -f 全量编译确保干净 # # ============================================================ set -e # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # 项目根目录 PROJECT_DIR="$(cd "$(dirname "$0")" && pwd)" cd "$PROJECT_DIR" # Maven 通用参数 MAVEN_OPTS="-Xmx1024m -XX:+TieredCompilation -XX:TieredStopAtLevel=1" # 多线程编译(CPU核心数) THREADS="1C" # 通用参数:跳过测试、静默模式 COMMON_ARGS="-DskipTests -q" # 打印带颜色的消息 print_info() { echo -e "${BLUE}[INFO]${NC} $1"; } print_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; } print_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } print_error() { echo -e "${RED}[ERROR]${NC} $1"; } # 显示帮助信息 show_help() { echo "用法: ./build.sh [选项]" echo "" echo "选项:" echo " -f, --full 全量编译(clean + package)" echo " -q, --quick 快速编译(仅 compile,最快)" echo " -p, --package 打包(package,不 clean)" echo " -m, --module 指定模块编译(如: -m pangu-business)" echo " -r, --restart 编译并重启后端服务" echo " -c, --clean 仅清理" echo " -h, --help 显示帮助信息" echo "" echo "示例:" echo " ./build.sh -q # 快速编译检查语法" echo " ./build.sh -p # 增量打包" echo " ./build.sh -f # 全量编译" echo " ./build.sh -m pangu-business -r # 编译业务模块并重启" echo " ./build.sh -r # 全量编译并重启" } # 快速编译(仅 compile) quick_compile() { local module=$1 print_info "快速编译中(仅检查语法)..." local start_time=$(date +%s) if [ -n "$module" ]; then print_info "目标模块: $module" mvn compile -T $THREADS $COMMON_ARGS -pl :$module -am else mvn compile -T $THREADS $COMMON_ARGS fi local end_time=$(date +%s) print_success "编译完成,耗时: $((end_time - start_time)) 秒" } # 增量打包(不 clean) incremental_package() { local module=$1 print_info "增量打包中..." local start_time=$(date +%s) if [ -n "$module" ]; then print_info "目标模块: $module" mvn package -T $THREADS $COMMON_ARGS -pl :$module -am else mvn package -T $THREADS $COMMON_ARGS fi local end_time=$(date +%s) print_success "打包完成,耗时: $((end_time - start_time)) 秒" } # 全量编译 full_build() { print_info "全量编译中(clean + package)..." local start_time=$(date +%s) mvn clean package -T $THREADS $COMMON_ARGS local end_time=$(date +%s) print_success "全量编译完成,耗时: $((end_time - start_time)) 秒" } # 仅清理 clean_only() { print_info "清理中..." mvn clean -q print_success "清理完成" } # 重启后端服务 restart_backend() { print_info "重启后端服务..." # 停止当前运行的服务 pkill -f "pangu-admin.jar" 2>/dev/null || true sleep 2 # 检查 jar 包是否存在 local jar_file="$PROJECT_DIR/pangu-admin/target/pangu-admin.jar" if [ ! -f "$jar_file" ]; then print_error "找不到 jar 包: $jar_file" print_warn "请先运行 ./build.sh -p 或 ./build.sh -f 进行打包" exit 1 fi # 启动服务 nohup java -jar "$jar_file" > /tmp/pangu-admin.log 2>&1 & print_info "后端启动中,等待服务就绪..." # 等待服务启动 local retry=0 local max_retry=30 while [ $retry -lt $max_retry ]; do if lsof -i :8080 >/dev/null 2>&1; then print_success "后端服务启动成功!端口: 8080" return 0 fi sleep 1 retry=$((retry + 1)) done print_error "后端服务启动超时,请检查日志: /tmp/pangu-admin.log" exit 1 } # 主逻辑 main() { local action="" local module="" local need_restart=false # 解析参数 while [[ $# -gt 0 ]]; do case $1 in -f|--full) action="full" shift ;; -q|--quick) action="quick" shift ;; -p|--package) action="package" shift ;; -m|--module) module="$2" shift 2 ;; -r|--restart) need_restart=true shift ;; -c|--clean) action="clean" shift ;; -h|--help) show_help exit 0 ;; *) print_error "未知选项: $1" show_help exit 1 ;; esac done # 默认操作:增量打包 if [ -z "$action" ] && [ "$need_restart" = true ]; then action="package" elif [ -z "$action" ]; then action="package" fi # 执行操作 case $action in full) full_build ;; quick) quick_compile "$module" ;; package) incremental_package "$module" ;; clean) clean_only ;; esac # 重启服务 if [ "$need_restart" = true ]; then restart_backend fi } # 执行主函数 main "$@"