#!/bin/bash # 爱维宠物医院管理平台 - 打包启动一条龙脚本 # 使用 IntelliJ IDEA 内置 JDK 和 Maven # 支持 IDEA 和 IDEA CE 版本 # 查找 IDEA 安装路径 if [ -d "/Applications/IntelliJ IDEA.app" ]; then IDEA_HOME="/Applications/IntelliJ IDEA.app" elif [ -d "/Applications/IntelliJ IDEA CE.app" ]; then IDEA_HOME="/Applications/IntelliJ IDEA CE.app" else echo "❌ 错误: 未找到 IntelliJ IDEA 安装目录" echo "请确保 IDEA 安装在 /Applications 目录下" exit 1 fi # 设置 IDEA 内置 JDK export JAVA_HOME="$IDEA_HOME/Contents/jbr/Contents/Home" export PATH="$JAVA_HOME/bin:$PATH" # 设置 IDEA 内置 Maven MAVEN_BIN="$IDEA_HOME/Contents/plugins/maven/lib/maven3/bin/mvn" if [ ! -f "$MAVEN_BIN" ]; then echo "❌ 错误: 未找到 IDEA 内置 Maven" exit 1 fi # 脚本所在目录 SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" cd "$SCRIPT_DIR" # 默认配置 JAR_NAME="pet-hospital-1.0.0.jar" JAR_PATH="target/$JAR_NAME" SERVER_PORT="8080" ACTIVE_PROFILE="dev" SKIP_TESTS="-DskipTests" BACKGROUND=false DEBUG_MODE=false JVM_OPTS="-Xms512m -Xmx1g" # 颜色输出 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # 显示帮助信息 show_help() { echo "爱维宠物医院管理平台 - 打包启动脚本" echo "" echo "用法: $0 [选项]" echo "" echo "选项:" echo " -p, --port PORT 指定服务端口号 (默认: 8080)" echo " -e, --env ENV 指定环境配置 (默认: dev, 可选: dev/prod)" echo " -t, --test 运行测试 (默认跳过测试)" echo " -b, --background 后台运行" echo " -d, --debug 开启调试模式 (端口: 5005)" echo " -c, --clean 仅清理,不打包" echo " -s, --stop 停止正在运行的服务" echo " -l, --logs 查看后台运行日志" echo " -h, --help 显示帮助信息" echo "" echo "示例:" echo " $0 # 打包并启动" echo " $0 -p 8081 # 使用端口 8081 启动" echo " $0 -e prod # 使用生产环境配置" echo " $0 -b # 后台运行" echo " $0 -d # 调试模式" echo " $0 -s # 停止服务" echo " $0 -l # 查看日志" } # 解析参数 while [[ $# -gt 0 ]]; do case $1 in -p|--port) SERVER_PORT="$2" shift 2 ;; -e|--env) ACTIVE_PROFILE="$2" shift 2 ;; -t|--test) SKIP_TESTS="" shift ;; -b|--background) BACKGROUND=true shift ;; -d|--debug) DEBUG_MODE=true shift ;; -c|--clean) echo "🧹 清理项目..." "$MAVEN_BIN" clean echo "✅ 清理完成" exit 0 ;; -s|--stop) echo "🛑 停止服务..." PID=$(lsof -ti:$SERVER_PORT 2>/dev/null || echo "") if [ -n "$PID" ]; then kill $PID 2>/dev/null sleep 2 if ps -p $PID > /dev/null 2>&1; then kill -9 $PID 2>/dev/null fi echo "✅ 服务已停止 (端口: $SERVER_PORT)" else # 尝试通过进程名查找 PID=$(pgrep -f "$JAR_NAME" | head -1) if [ -n "$PID" ]; then kill $PID 2>/dev/null sleep 2 if ps -p $PID > /dev/null 2>&1; then kill -9 $PID 2>/dev/null fi echo "✅ 服务已停止" else echo "⚠️ 未找到运行中的服务" fi fi exit 0 ;; -l|--logs) if [ -f "$SCRIPT_DIR/app.log" ]; then echo "📋 查看日志 (按 Ctrl+C 退出)..." tail -f "$SCRIPT_DIR/app.log" else echo "❌ 未找到日志文件" fi exit 0 ;; -h|--help) show_help exit 0 ;; *) echo "❌ 未知选项: $1" show_help exit 1 ;; esac done # 检查端口是否被占用 check_port() { if lsof -Pi :$SERVER_PORT -sTCP:LISTEN -t >/dev/null 2>&1; then echo -e "${YELLOW}⚠️ 警告: 端口 $SERVER_PORT 已被占用${NC}" echo "" echo "占用端口的进程:" lsof -Pi :$SERVER_PORT -sTCP:LISTEN echo "" read -p "是否停止现有进程并继续? (y/n): " -n 1 -r echo "" if [[ $REPLY =~ ^[Yy]$ ]]; then PID=$(lsof -ti:$SERVER_PORT) kill $PID 2>/dev/null sleep 2 echo -e "${GREEN}✅ 已释放端口 $SERVER_PORT${NC}" else echo -e "${RED}❌ 操作已取消${NC}" exit 1 fi fi } # 显示环境信息 show_info() { echo -e "${BLUE}═══════════════════════════════════════${NC}" echo -e "${BLUE} 爱维宠物医院管理平台 - 打包启动脚本${NC}" echo -e "${BLUE}═══════════════════════════════════════${NC}" echo "" echo -e "${GREEN}📦 使用 IDEA 内置 JDK:${NC} $JAVA_HOME" echo -e "${GREEN}🔧 Java 版本:${NC}" java -version 2>&1 | head -1 echo "" echo -e "${GREEN}🚀 运行配置:${NC}" echo " 端口: $SERVER_PORT" echo " 环境: $ACTIVE_PROFILE" echo " 调试: $([ "$DEBUG_MODE" = true ] && echo "开启 (端口: 5005)" || echo "关闭")" echo " 后台: $([ "$BACKGROUND" = true ] && echo "是" || echo "否")" echo "" } # 打包项目 build_project() { echo -e "${BLUE}📦 开始打包项目...${NC}" echo "" if ! "$MAVEN_BIN" clean package $SKIP_TESTS; then echo "" echo -e "${RED}❌ 打包失败!${NC}" exit 1 fi echo "" echo -e "${GREEN}✅ 打包成功!${NC}" echo "" } # 启动应用 start_app() { if [ ! -f "$JAR_PATH" ]; then echo -e "${RED}❌ 错误: 未找到 jar 文件: $JAR_PATH${NC}" exit 1 fi check_port # 构建启动命令 JAVA_OPTS="$JVM_OPTS" if [ "$DEBUG_MODE" = true ]; then JAVA_OPTS="$JAVA_OPTS -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005" echo -e "${YELLOW}🐛 调试模式已开启,可在 IDEA 中配置远程调试 (端口: 5005)${NC}" fi echo -e "${BLUE}🚀 正在启动应用...${NC}" echo "" if [ "$BACKGROUND" = true ]; then # 后台运行 nohup java $JAVA_OPTS -jar "$JAR_PATH" \ --server.port=$SERVER_PORT \ --spring.profiles.active=$ACTIVE_PROFILE \ > "$SCRIPT_DIR/app.log" 2>&1 & APP_PID=$! echo $APP_PID > "$SCRIPT_DIR/app.pid" echo -e "${GREEN}✅ 应用已在后台启动${NC}" echo " 进程ID: $APP_PID" echo " 访问地址: http://localhost:$SERVER_PORT" echo " 日志文件: $SCRIPT_DIR/app.log" echo "" echo "查看日志: $0 --logs" echo "停止服务: $0 --stop" else # 前台运行 echo -e "${GREEN}✅ 应用启动成功!${NC}" echo " 访问地址: http://localhost:$SERVER_PORT" echo " API 文档: http://localhost:$SERVER_PORT/swagger-ui.html" echo "" echo -e "${YELLOW}按 Ctrl+C 停止服务${NC}" echo "═══════════════════════════════════════" echo "" java $JAVA_OPTS -jar "$JAR_PATH" \ --server.port=$SERVER_PORT \ --spring.profiles.active=$ACTIVE_PROFILE fi } # 主流程 main() { show_info build_project start_app } main