本课目标打包成 JAR 和 WAR部署到 Linux 服务器Docker 容器化部署环境变量和配置文件管理健康检查与监控日志配置恭喜你上完这节课Java 课程全部学完了一、打包部署1.1 JAR 包推荐Spring Boot 默认打包成JARJava Archive内嵌服务器直接java -jar就能运行。Maven 打包mvn clean package生成的 JAR 文件在target/目录下target/demo-1.0.0.jar ← 可运行的 fat JAR target/demo-1.0.0.jar.original ← 原始 JAR不含依赖运行# 基本运行java-jardemo-1.0.0.jar# 指定配置文件java-jardemo-1.0.0.jar--spring.profiles.activeprod# 设置 JVM 参数java-Xms256m-Xmx512m-jardemo-1.0.0.jar# 绑定到所有网卡允许外网访问java-jardemo-1.0.0.jar--server.address0.0.0.01.2 WAR 包传统方式有些传统服务器如外部 Tomcat不支持嵌入式 JAR需要打成 WAR!-- pom.xml --packagingwar/packagingdependencies!-- 排除内嵌 Tomcat --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-tomcat/artifactIdscopeprovided/scope/dependency/dependencies// 主启动类继承 SpringBootServletInitializerSpringBootApplicationpublicclassDemoApplicationextendsSpringBootServletInitializer{OverrideprotectedSpringApplicationBuilderconfigure(SpringApplicationBuilderapplication){returnapplication.sources(DemoApplication.class);}publicstaticvoidmain(String[]args){SpringApplication.run(DemoApplication.class,args);}}# 打包mvn clean package war# 部署到 Tomcat把 WAR 复制到 $CATALINA_HOME/webapps/cptarget/demo-1.0.0.war$CATALINA_HOME/webapps/二、Linux 服务器部署2.1 服务器准备推荐使用云服务器阿里云/腾讯云配置说明CPU2核内存4GB系统Ubuntu 22.04 / CentOS 8带宽5Mbps2.2 安装 Java 环境# Ubuntu / Debiansudoaptupdatesudoaptinstall-yopenjdk-17-jdk# CentOS / RHELsudoyuminstall-yjava-17-openjdk java-17-openjdk-devel# 验证java-versionjavac-version2.3 安装 MySQL# Ubuntusudoaptinstall-ymysql-serversudosystemctl start mysqlsudosystemctlenablemysql# 登录 MySQLsudomysql# 创建数据库和用户CREATE DATABASE javacourse DEFAULT CHARACTER SET utf8mb4;CREATEUSERjavacourse%IDENTIFIED BYYourStrongPassword123;GRANT ALL PRIVILEGES ON javacourse.* TOjavacourse%;FLUSH PRIVILEGES;2.4 安装 Redis# Ubuntusudoaptinstall-yredis-serversudosystemctl start redissudosystemctlenableredis# 测试redis-cliping# 返回 PONG 表示成功2.5 上传 JAR 包# 方式1scp 命令scptarget/demo-1.0.0.jar root你的服务器IP:/opt/app/# 方式2使用 rz/sz如果服务器装了rz demo-1.0.0.jar# 方式3Git 拉取项目放 GitHub/Giteegitclone https://github.com/yourname/demo.gitcddemomvn clean package2.6 配置 application.yml# 创建配置目录sudomkdir-p/opt/app/config# 创建生产环境配置sudovim/opt/app/config/application-prod.yml# /opt/app/config/application-prod.ymlspring:datasource:driver-class-name:com.mysql.cj.jdbc.Driverurl:jdbc:mysql://localhost:3306/javacourse?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghaiusername:javacoursepassword:YourStrongPassword123redis:host:localhostport:6379server:port:8080logging:file:name:/var/log/demo/application.loglevel:com.example.demo:INFO2.7 使用 systemd 管理进程# 创建服务文件sudovim/etc/systemd/system/demo.service[Unit] DescriptionDemo Application Afternetwork.target mysql.service redis.service [Service] Typesimple Userroot WorkingDirectory/opt/app ExecStart/usr/bin/java -Xms256m -Xmx512m -jar /opt/app/demo-1.0.0.jar --spring.profiles.activeprod Restartalways RestartSec10 [Install] WantedBymulti-user.target# 重载 systemdsudosystemctl daemon-reload# 启动服务sudosystemctl start demo# 设置开机启动sudosystemctlenabledemo# 查看状态sudosystemctl status demo# 查看日志sudojournalctl-udemo-f2.8 配置 Nginx 反向代理# 安装 Nginxsudoaptinstall-ynginx# 配置反向代理sudovim/etc/nginx/sites-available/demoserver { listen 80; server_name your-domain.com; # 或服务器 IP location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 超时设置 proxy_connect_timeout 60s; proxy_read_timeout 60s; proxy_send_timeout 60s; } # 静态资源可选前端项目 location /static/ { alias /opt/app/static/; expires 7d; } }# 启用配置sudoln-s/etc/nginx/sites-available/demo /etc/nginx/sites-enabled/sudonginx-t# 测试配置sudosystemctl reload nginx2.9 配置域名 HTTPSLet’s Encrypt 免费证书# 安装 Certbotsudoaptinstall-ycertbot python3-certbot-nginx# 获取证书会自动配置 Nginxsudocertbot--nginx-dyour-domain.com# 自动续期Certbot 会创建定时任务sudocertbot renew --dry-run三、Docker 容器化部署3.1 Docker 简介Docker让你把应用和依赖打包成一个集装箱在任何 Docker 环境中都能运行。传统部署 应用 各种依赖 配置文件 → 手动安装配置 → 可能遇到环境不一致 Docker 部署 应用 依赖 配置 → 打包成镜像 → 一键运行 → 任何环境都一致3.2 安装 Docker# Ubuntucurl-fsSLhttps://get.docker.com|bash# 启动sudosystemctl startdockersudosystemctlenabledocker# 测试docker--versiondockerrun hello-world3.3 Dockerfile在项目根目录创建Dockerfile# 基于哪个镜像 FROM openjdk:17-slim # 作者 MAINTAINER laobing laobingexample.com # 设置工作目录 WORKDIR /app # 复制 jar 包先把 target/demo-1.0.0.jar 复制到项目根目录 COPY target/demo-1.0.0.jar app.jar # 环境变量 ENV JAVA_OPTS-Xms256m -Xmx512m ENV SPRING_PROFILES_ACTIVEprod # 暴露端口 EXPOSE 8080 # 启动命令 ENTRYPOINT [sh, -c, java $JAVA_OPTS -jar app.jar]3.4 构建 Docker 镜像# 构建镜像注意最后有个点 .dockerbuild-tdemo:1.0.0.# 查看镜像dockerimages# 运行容器dockerrun-d\--namedemo\-p8080:8080\-eSPRING_PROFILES_ACTIVEprod\demo:1.0.0# 查看运行状态dockerps# 查看日志dockerlogs-fdemo# 进入容器调试用dockerexec-itdemo /bin/bash3.5 Docker Compose一键启动多容器# docker-compose.ymlversion:3.8services: app: build:.ports: -8080:8080environment: -SPRING_PROFILES_ACTIVEprod -SPRING_DATASOURCE_URLjdbc:mysql://mysql:3306/javacourse -SPRING_REDIS_HOSTredis depends_on: - mysql - redis restart: always mysql: image: mysql:8.0 ports: -3306:3306environment: -MYSQL_ROOT_PASSWORDroot123 -MYSQL_DATABASEjavacourse volumes: - mysql_data:/var/lib/mysql restart: always redis: image: redis:7-alpine ports: -6379:6379volumes: - redis_data:/data restart: always volumes: mysql_data: redis_data:# 一键启动所有服务docker-composeup-d# 查看状态docker-composeps# 查看日志docker-composelogs-fapp# 停止docker-composedown3.6 推送镜像到仓库# 登录 Docker Hub需要先注册dockerlogin# 给镜像打标签dockertag demo:1.0.0 yourname/demo:1.0.0# 推送dockerpush yourname/demo:1.0.0# 在服务器上拉取并运行dockerpull yourname/demo:1.0.0dockerrun-d-p8080:8080 yourname/demo:1.0.0四、环境配置管理4.1 多环境配置src/main/resources/ ├── application.yml # 公共配置 ├── application-dev.yml # 开发环境 ├── application-test.yml # 测试环境 └── application-prod.yml # 生产环境# application.ymlspring:profiles:active:dev# 默认激活 dev# application-dev.ymlspring:datasource:url:jdbc:mysql://localhost:3306/javacourse_devredis:host:localhost# application-prod.ymlspring:datasource:url:jdbc:mysql://prod-db-server:3306/javacoursepassword:${DB_PASSWORD}# 从环境变量读取redis:host:prod-redis-server4.2 环境变量优先级命令行参数 application-{profile}.yml application.yml 系统环境变量# 通过命令行指定环境java-jarapp.jar--spring.profiles.activeprod# 通过环境变量指定exportSPRING_PROFILES_ACTIVEprodjava-jarapp.jar# 通过系统变量SPRING_PROFILES_ACTIVEprodjava-jarapp.jar4.3 敏感信息处理不要把密码直接写在配置文件中# 方式1从环境变量读取推荐spring:datasource:password:${DB_PASSWORD}# 方式2使用 Java 系统属性java-jar app.jar-DDB_PASSWORDyourpass# 方式3使用配置中心如 Apollo、Nacos五、健康检查与监控5.1 Spring Boot ActuatorSpring Boot Actuator 提供了一系列监控端点dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-actuator/artifactId/dependencymanagement:endpoints:web:exposure:include:health,info,metrics,prometheus# 暴露哪些端点base-path:/actuator# 端点前缀endpoint:health:show-details:always# 显示详细信息metrics:tags:application:${spring.application.name}5.2 常用健康检查端点# 健康状态curlhttp://localhost:8080/actuator/health# {status:UP} 或 {status:DOWN}# 详细信息curlhttp://localhost:8080/actuator/health/db,redis# 包含数据库和 Redis 的状态# 查看指标curlhttp://localhost:8080/actuator/metrics/jvm.memory.used# 查看所有端点curlhttp://localhost:8080/actuator5.3 Docker 健康检查# 在 Dockerfile 中添加健康检查 FROM openjdk:17-slim WORKDIR /app COPY target/demo-1.0.0.jar app.jar EXPOSE 8080 HEALTHCHECK --interval30s --timeout10s --start-period60s --retries3 \ CMD curl -f http://localhost:8080/actuator/health || exit 1 ENTRYPOINT [java, -jar, app.jar]5.4 Prometheus Grafana 监控进阶# Prometheus 配置文件 prometheus.ymlglobal:scrape_interval:15sscrape_configs:-job_name:spring-bootmetrics_path:/actuator/prometheusstatic_configs:-targets:[your-app:8080]# docker-compose.yml 添加prometheus:image:prom/prometheus:latestports:-9090:9090volumes:-./prometheus.yml:/etc/prometheus/prometheus.ymlgrafana:image:grafana/grafana:latestports:-3000:3000六、日志配置6.1 日志级别级别说明TRACE最详细追踪DEBUG开发调试用INFO一般信息默认WARN警告不影响运行ERROR错误影响运行FATAL致命错误6.2 配置日志# application.ymllogging:level:root:INFO# 全局日志级别com.example.demo:DEBUG# 当前包的日志级别pattern:console:%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%nfile:name:/var/log/demo/application.logmax-size:100MB# 单个文件大小max-history:30# 保留天数6.3 使用日志importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;ServicepublicclassUserService{privatestaticfinalLoggerlogLoggerFactory.getLogger(UserService.class);publicvoidcreateUser(Useruser){log.info(创建用户{},user.getUsername());try{// 业务逻辑userMapper.insert(user);log.info(用户创建成功{},user.getId());}catch(Exceptione){log.error(用户创建失败{},e.getMessage(),e);throwe;}}}七、CI/CD 自动化部署进阶7.1 什么是 CI/CDCI持续集成代码提交 → 自动构建 → 自动测试 CD持续交付构建测试通过 → 自动部署到测试/生产环境7.2 GitHub Actions 示例创建.github/workflows/deploy.ymlname:Deployon:push:branches:[main]# main 分支 push 时触发jobs:build-and-deploy:runs-on:ubuntu-lateststeps:-uses:actions/checkoutv3-name:Set up JDK 17uses:actions/setup-javav3with:java-version:17distribution:temurin-name:Build with Mavenrun:mvn clean package-DskipTests-name:Deploy to Serveruses:appleboy/scp-actionmasterwith:host:${{secrets.SERVER_HOST}}username:rootkey:${{secrets.SERVER_SSH_KEY}}source:target/demo-1.0.0.jartarget:/opt/app/-name:Restart Serveruses:appleboy/ssh-actionmasterwith:host:${{secrets.SERVER_HOST}}username:rootkey:${{secrets.SERVER_SSH_KEY}}script:|systemctl restart demo八、常见面试题Q1JAR 和 WAR 的区别对比JARWAR含义Java 归档Web 归档内嵌服务器有无需要外部 Tomcat用途微服务、Spring Boot传统 Java Web部署java -jar部署到 Tomcat推荐场景新项目需要部署到现有服务器Q2如何排查线上问题日志docker logs、journalctl -u demo线程Dumpjstack pid看死锁、阻塞内存Dumpjmap -dump:fileheap.hprof pidGC日志加-Xlog:gc*参数Arthas阿里开源的 Java 诊断工具Q3Docker 和传统部署的区别Docker 打包了应用依赖环境一致Docker 启动快秒级 vs 分钟级Docker 资源隔离性好传统部署更简单适合小型项目 Java基础课程全部完结恭喜你完成了全部17节课的学习✅ 第0课学前必知 ✅ 第1课环境搭建 ✅ 第2课Java基础语法 ✅ 第3课数组和方法 ✅ 第4课面向对象三大特性 ✅ 第5课接口与抽象类 ✅ 第6课常用类 ✅ 第7课异常处理 ✅ 第8课集合框架 ✅ 第9课泛型与IO流 ✅ 第10课Lambda与Stream API ✅ 第11课JDBC数据库开发 ✅ 第12课SSM框架整合 ✅ 第13课Spring Boot 入门 ✅ 第14课Spring Boot Web 开发进阶 ✅ 第15课MyBatis-Plus 与 Redis ✅ 第16课认证与安全 ✅ 第17课部署与运维 后续学习路线学完基础后你可以选择以下方向深入方向一微服务Spring Cloud AlibabaNacos服务发现配置中心Sentinel流量控制Seata分布式事务方向二大数据HadoopSparkFlink方向三DevOpsDocker KubernetesPrometheus GrafanaCI/CD 流水线方向四移动开发Android 开发无论哪条路线你现在已经有了扎实的 Java 基础这是你最大的底气继续加油少走弯路有问题随时来问关注我跟着老兵学Java少走弯路。评论区聊聊学完这17节课你接下来想学什么或者有什么感想一路走来感谢你的陪伴