Skip to content

启动与部署

主启动类

RuoyiPlus.java

RuoyiPlus 是应用程序的主入口类,负责初始化 Spring Boot 应用上下文并启动服务。

java
@SpringBootApplication
public class RuoyiPlus {

    public static void main(String[] args) {
        // 创建Spring应用实例
        SpringApplication application = new SpringApplication(RuoyiPlus.class);

        // 配置启动性能监控(缓冲区大小2048)
        application.setApplicationStartup(new BufferingApplicationStartup(2048));

        // 启动应用
        application.run(args);

        // 等待组件就绪后输出启动信息
        ThreadUtil.sleep(1000);
        System.out.println(StringUtils.format(
            "\n(✨◠‿◠)ノ♪♫ {} 启动成功!环境: {} 地址: http://127.0.0.1:{}{}\n",
            SpringUtils.getApplicationName(),
            Arrays.toString(SpringUtils.getActiveProfiles()),
            SpringUtils.getProperty("server.port"),
            SpringUtils.getProperty("server.servlet.context-path")));
    }
}

启动流程解析

  1. 创建应用实例 - 基于 RuoyiPlus.class 创建 SpringApplication
  2. 配置性能监控 - 设置 BufferingApplicationStartup,缓冲区大小为2048,用于收集启动性能指标
  3. 初始化上下文 - 执行 application.run(),完成所有 Bean 的创建、自动配置和依赖注入
  4. 等待就绪 - 等待1秒确保所有组件完全就绪
  5. 输出启动信息 - 打印应用名称、激活环境、服务地址等信息

BufferingApplicationStartup

BufferingApplicationStartup 是 Spring Boot 提供的启动性能监控工具:

  • 作用:收集应用启动过程中的性能指标
  • 缓冲区大小:2048 表示最多记录2048个启动步骤
  • 查看指标:通过 Actuator 端点 /actuator/startup 查看详细启动耗时

Servlet初始化器

RuoyiPlusServletInitializer.java

用于支持传统 WAR 包部署到外部 Servlet 容器(如 Tomcat、Jetty)。

java
public class RuoyiPlusServletInitializer extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(RuoyiPlus.class);
    }
}

工作原理:

  • 继承 SpringBootServletInitializer 使应用支持 WAR 包部署
  • 重写 configure 方法指定主启动类
  • 当应用部署到外部 Servlet 容器时,容器会调用此类而非 main 方法

启动参数配置

基本启动参数

bash
# 指定端口
java -jar ruoyi-admin.jar --server.port=8080

# 指定环境
java -jar ruoyi-admin.jar --spring.profiles.active=prod

# 指定配置文件位置
java -jar ruoyi-admin.jar --spring.config.location=/opt/config/

# 组合使用
java -jar ruoyi-admin.jar \
  --spring.profiles.active=prod \
  --server.port=8080 \
  --spring.config.location=/opt/config/

JVM参数建议

开发环境

bash
java -Xms512m -Xmx1024m \
     -XX:+UseG1GC \
     -jar ruoyi-admin.jar

生产环境(JDK 17)

bash
java -Xms2g -Xmx4g \
     -XX:+UseG1GC \
     -XX:MaxGCPauseMillis=200 \
     -XX:+HeapDumpOnOutOfMemoryError \
     -XX:HeapDumpPath=/var/log/ruoyi/heapdump.hprof \
     -jar ruoyi-admin.jar --spring.profiles.active=prod

生产环境(JDK 21 虚拟线程)

bash
java -Xms2g -Xmx4g \
     -XX:+UseZGC \
     -XX:+ZGenerational \
     -XX:+HeapDumpOnOutOfMemoryError \
     -XX:HeapDumpPath=/var/log/ruoyi/heapdump.hprof \
     -jar ruoyi-admin.jar --spring.profiles.active=prod

JVM参数说明

参数说明
-Xms初始堆内存大小
-Xmx最大堆内存大小
-XX:+UseG1GC使用G1垃圾收集器(JDK17推荐)
-XX:+UseZGC使用ZGC垃圾收集器(JDK21推荐,低延迟)
-XX:MaxGCPauseMillis最大GC停顿时间目标
-XX:+HeapDumpOnOutOfMemoryErrorOOM时自动导出堆转储
-XX:HeapDumpPath堆转储文件保存路径

JAR包部署

构建JAR包

bash
# 开发环境构建
mvn clean package -DskipTests

# 生产环境构建
mvn clean package -Pprod -DskipTests

构建完成后,JAR包位于 ruoyi-admin/target/ryplus_uni_workflow.jar

直接启动

bash
# 前台启动
java -jar ryplus_uni_workflow.jar

# 后台启动(Linux)
nohup java -jar ryplus_uni_workflow.jar > /dev/null 2>&1 &

# 后台启动(指定日志文件)
nohup java -jar ryplus_uni_workflow.jar > app.log 2>&1 &

Systemd服务(推荐)

创建服务文件 /etc/systemd/system/ruoyi.service

ini
[Unit]
Description=RuoYi-Plus Application
After=network.target mysql.service redis.service

[Service]
Type=simple
User=ruoyi
Group=ruoyi
WorkingDirectory=/opt/ruoyi
ExecStart=/usr/bin/java -Xms2g -Xmx4g -jar /opt/ruoyi/ryplus_uni_workflow.jar --spring.profiles.active=prod
ExecStop=/bin/kill -SIGTERM $MAINPID
Restart=on-failure
RestartSec=10

# 环境变量
Environment="DB_HOST=127.0.0.1"
Environment="DB_PASSWORD=your_password"
Environment="REDIS_HOST=127.0.0.1"
Environment="REDIS_PASSWORD=your_redis_password"

[Install]
WantedBy=multi-user.target

服务管理命令:

bash
# 重新加载配置
sudo systemctl daemon-reload

# 启动服务
sudo systemctl start ruoyi

# 停止服务
sudo systemctl stop ruoyi

# 重启服务
sudo systemctl restart ruoyi

# 查看状态
sudo systemctl status ruoyi

# 开机自启
sudo systemctl enable ruoyi

WAR包部署

修改打包方式

pom.xml 中修改打包方式:

xml
<packaging>war</packaging>

排除内嵌容器

添加 Tomcat 排除依赖:

xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-undertow</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>
    <groupId>jakarta.servlet</groupId>
    <artifactId>jakarta.servlet-api</artifactId>
    <scope>provided</scope>
</dependency>

构建WAR包

bash
mvn clean package -Pprod -DskipTests

部署到Tomcat

  1. ryplus_uni_workflow.war 复制到 $TOMCAT_HOME/webapps/
  2. 启动 Tomcat
  3. 访问 http://localhost:8080/ryplus_uni_workflow

Docker部署

Dockerfile

dockerfile
FROM eclipse-temurin:17-jre-alpine

LABEL maintainer="ruoyi"

WORKDIR /app

# 设置时区
RUN apk add --no-cache tzdata \
    && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && echo "Asia/Shanghai" > /etc/timezone

# 复制JAR包
COPY target/ryplus_uni_workflow.jar app.jar

# 创建上传目录
RUN mkdir -p /ruoyi/server/upload

# 暴露端口
EXPOSE 5503

# 健康检查
HEALTHCHECK --interval=30s --timeout=10s --retries=3 \
    CMD wget -q --spider http://localhost:5503/actuator/health || exit 1

# 启动命令
ENTRYPOINT ["java", \
    "-Xms1g", "-Xmx2g", \
    "-Djava.security.egd=file:/dev/./urandom", \
    "-jar", "app.jar"]

构建镜像

bash
# 先构建JAR包
mvn clean package -Pprod -DskipTests

# 构建Docker镜像
docker build -t ruoyi-plus:latest .

Docker Compose

创建 docker-compose.yml

yaml
version: '3.8'

services:
  ruoyi-app:
    image: ruoyi-plus:latest
    container_name: ruoyi-app
    ports:
      - "5503:5503"
    environment:
      - SPRING_PROFILES_ACTIVE=prod
      - DB_HOST=mysql
      - DB_PORT=3306
      - DB_NAME=ryplus_uni_workflow
      - DB_USERNAME=root
      - DB_PASSWORD=root123456
      - REDIS_HOST=redis
      - REDIS_PORT=6379
      - REDIS_PASSWORD=redis123456
    volumes:
      - ./upload:/ruoyi/server/upload
      - ./logs:/app/logs
    depends_on:
      - mysql
      - redis
    networks:
      - ruoyi-net
    restart: unless-stopped

  mysql:
    image: mysql:8.0
    container_name: ruoyi-mysql
    environment:
      - MYSQL_ROOT_PASSWORD=root123456
      - MYSQL_DATABASE=ryplus_uni_workflow
    volumes:
      - mysql-data:/var/lib/mysql
      - ./sql:/docker-entrypoint-initdb.d
    ports:
      - "3306:3306"
    networks:
      - ruoyi-net
    restart: unless-stopped

  redis:
    image: redis:7-alpine
    container_name: ruoyi-redis
    command: redis-server --requirepass redis123456
    volumes:
      - redis-data:/data
    ports:
      - "6379:6379"
    networks:
      - ruoyi-net
    restart: unless-stopped

volumes:
  mysql-data:
  redis-data:

networks:
  ruoyi-net:
    driver: bridge

Docker Compose 命令

bash
# 启动所有服务
docker-compose up -d

# 查看日志
docker-compose logs -f ruoyi-app

# 停止所有服务
docker-compose down

# 重新构建并启动
docker-compose up -d --build

环境变量清单

应用基础配置

变量名说明默认值必填
SERVER_PORT服务端口5503
APP_LICENSE授权码-
APP_OFFLINE_LICENSE离线授权码-
APP_UPLOAD_PATH文件上传路径D:\download\ruoyi\uploadPath
APP_BASE_API应用基础URLhttp://127.0.0.1:5503
LOG_LEVEL日志级别info

数据库配置

变量名说明默认值必填(生产)
DB_HOST数据库主机127.0.0.1
DB_PORT数据库端口3306
DB_NAME数据库名ryplus_uni_workflow
DB_USERNAME数据库用户名root
DB_PASSWORD数据库密码root
DB_MAX_POOL_SIZE最大连接数20(dev)/50(prod)
DB_MIN_IDLE最小空闲连接10(dev)/20(prod)

从库配置(可选)

变量名说明默认值
DB_SLAVE_HOST从库主机同主库
DB_SLAVE_PORT从库端口3306
DB_SLAVE_NAME从库数据库名同主库
DB_SLAVE_USERNAME从库用户名同主库
DB_SLAVE_PASSWORD从库密码同主库

Redis配置

变量名说明默认值必填(生产)
REDIS_HOSTRedis主机127.0.0.1
REDIS_PORTRedis端口6379
REDIS_DATABASERedis数据库索引0
REDIS_PASSWORDRedis密码-
REDIS_SSL_ENABLED是否启用SSLfalse

安全配置

变量名说明默认值
JWT_SECRET_KEYJWT签名密钥uDkkASPQVN5iR4eN
API_ENCRYPT_ENABLEDAPI加密开关true
API_RESPONSE_PUBLIC_KEYAPI响应加密公钥-
API_REQUEST_PRIVATE_KEYAPI请求解密私钥-
ENCRYPT_PASSWORD数据加密密钥(AES/SM4)-
ENCRYPT_PUBLIC_KEY数据加密公钥(SM2/RSA)-
ENCRYPT_PRIVATE_KEY数据加密私钥(SM2/RSA)-

监控配置

变量名说明默认值
MONITOR_ENABLED监控客户端开关false(dev)/true(prod)
MONITOR_URL监控中心地址http://127.0.0.1:9090/admin
MONITOR_USERNAME监控中心用户名ruoyi
MONITOR_PASSWORD监控中心密码123456

定时任务配置

变量名说明默认值
SNAIL_JOB_ENABLED定时任务开关false(dev)/true(prod)
SNAIL_JOB_HOST调度中心主机127.0.0.1
SNAIL_JOB_PORT调度中心端口17888
SNAIL_JOB_TOKEN接入令牌-

消息队列配置

变量名说明默认值
ROCKETMQ_ENABLEDRocketMQ开关false
ROCKETMQ_NAME_SERVERNameServer地址127.0.0.1:9876
MQTT_ENABLEDMQTT开关false
MQTT_IPMQTT Broker地址-
MQTT_PORTMQTT端口1883

第三方服务配置

变量名说明
MAIL_ENABLED邮件服务开关
MAIL_HOSTSMTP服务器地址
MAIL_USERNAME邮箱账号
MAIL_PASSWORD邮箱密码/授权码
SMS_ALI_ACCESS_KEY阿里云短信AccessKey
SMS_ALI_ACCESS_SECRET阿里云短信AccessSecret
WECHAT_MP_CLIENT_ID微信公众号AppID
WECHAT_MP_CLIENT_SECRET微信公众号AppSecret

API文档配置

变量名说明默认值
SPRINGDOC_ENABLEDAPI文档开关true

开放平台配置

变量名说明默认值
OPEN_API_ENABLED开放平台开关false
OPEN_API_SECRET_KEYAppSecret加密密钥-
OPEN_API_ACCESS_MODE访问控制模式all
OPEN_API_ALLOWED_ROLES允许访问的角色admin,pc_user

启动检查清单

启动前检查

  • [ ] MySQL 服务已启动且可连接
  • [ ] Redis 服务已启动且可连接
  • [ ] 数据库已初始化(执行 SQL 脚本)
  • [ ] 授权码已配置(APP_LICENSE)
  • [ ] 敏感配置已通过环境变量注入

启动后验证

  • [ ] 应用日志无报错
  • [ ] 访问 http://localhost:5503 有响应
  • [ ] 访问 http://localhost:5503/actuator/health 返回 UP
  • [ ] API文档可访问 http://localhost:5503/doc.html

常见启动问题

问题原因解决方案
端口被占用5503端口已被使用修改 SERVER_PORT 或关闭占用进程
数据库连接失败配置错误或服务未启动检查 DB_* 环境变量配置
Redis连接失败配置错误或服务未启动检查 REDIS_* 环境变量配置
授权码无效未配置或已过期前往 license.ruoyi.plus 生成新授权码
内存不足JVM堆内存设置过小增大 -Xms 和 -Xmx 参数