当前位置: 首页 > news >正文

【博客系统】博客系统第十一弹:从 0 到 1 搭建 Java 部署环境并部署 web 项目到 linux 系统

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


搭建 Java 部署环境


apt


apt(Advanced Packaging Tool)是 Linux 软件包管理工具,用于在 Ubuntu、Debian 和相关 Linux 发行版上安装、更新、删除和管理 deb 软件包。

大多数 apt 命令必须以具有 sudo 权限的用户身份运行。


apt 常用命令


列出所有软件包

apt list

这个命令输出所有包的列表,内容比较多,可以使用 grep 命令过滤输出。

apt list | grep "java"

更新软件包数据库

sudo apt-get update

apt 实际上在可用软件包的数据库上工作。如果数据库没有更新,系统将不知道是否有更新的软件包可用。这就是为什么在安装任何 Linux 系统之后,第一件事应该是更新 apt 数据库。运行此命令时,将看到从各种服务器检索到的软件包信息。

如果切换到 root 用户,命令前就不需要加 sudo 了。


切换 root 用户

sudo su

安装软件包

sudo apt install package_name

移除软件包

sudo apt remove package_name

remove 命令将卸载给定的软件包,但可能会留下一些配置文件。如果要删除包含所有配置文件的软件包,请使用 purge 而不是 remove


apt removeapt purge 的区别


  • apt remove 删除包的二进制文件,它留下了残留的配置文件。
  • apt purge 删除与包相关的所有内容,包括配置文件。
  • 如果弄乱了程序的配置,希望从系统中完全清除它的痕迹再重新开始,可以使用 apt purge
  • 通常使用 apt remove 就足够了。

JDK


1. 更新软件包

sudo apt-get update

2. 安装 OpenJDK

查找 JDK 包

apt list | grep "jdk"

安装 JDK

sudo apt install openjdk-17-jdk

注意

  • 此处安装的是 OpenJDK,OpenJDK 是一个开源版本的 JDK,和 Oracle 官方的 JDK 略有差别。此处我们就使用 OpenJDK 即可。安装 Oracle JDK 比较麻烦。
  • 使用 java -version 验证是否安装成功。
  • 如果提示 “java 命令找不到” 则说明安装失败。

image-20250529160653334


3. 卸载 OpenJDK


  1. 检查安装的是哪个 OpenJDK

    dpkg --list | grep -i jdk
    
  2. 移除 OpenJDK 包

    apt-get purge openjdk*
    
  3. 卸载 OpenJDK 相关包

    apt-get purge icedtea-* openjdk-*
    
  4. 检查所有 OpenJDK 包是否都已卸载完毕

    dpkg --list | grep -i jdk
    

MySQL


使用 apt 安装 MySQL


  1. 查找安装包

    apt list | grep "mysql-server"
    
  2. 安装 MySQL

    sudo apt install mysql-server
    

查看 MySQL 状态


sudo systemctl status mysql

image-20250529161153518


MySQL 安装安全设置


默认的 MySQL 设置是不安全的,MySQL 安装提供了一个安全脚本,用于解决不太安全的默认选项。


运行以下命令

sudo mysql_secure_installation #安装安全设置

执行过程

  1. 是否设置验证密码组件

    Press y|Y for Yes, any other key for No: Y #是否设置验证密码组件
    
  2. 密码强度设置

    Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 2 #设置密码强度
    
  3. 删除匿名用户

    Remove anonymous users? (Press y|Y for Yes, any other key for No) : Y #默认情况下,MySQL安装有一个匿名用户, 允许任何人登录MySQL. 是否删除匿名用户?
    
  4. 禁止 root 用户远程登录

    Disallow root login remotely? (Press y|Y for Yes, any other key for No) : Y #仅应允许root从'localhost'连接
    
  5. 删除 test 数据库

    Remove test database and access to it? (Press y|Y for Yes, any other key for No) : Y #默认情况下, MySQL带有⼀个test数据库, 是否删除?
    
  6. 重新加载权限表

    Reload privilege tables now? (Press y|Y for Yes, any other key for No) : Y #是否现在加载配置, 使刚才的修改生效?
    
  7. 完成

    All done!
    

通过以上步骤,MySQL 的安全设置已经完成,确保了数据库的安全性。设置密码


连接 MySQL 服务器


sudo mysql

使用 ALTER USER 命令修改密码


ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'BITE@yyds.666';

退出 MySQL


exit

image-20250529164241001


再次登录输入:

mysql -uroot -p   #  密码: BITE@yyds.666

卸载 MySQL


  1. 停止 MySQL
sudo systemctl stop mysql

  1. 卸载 MySQL
sudo apt-get remove --purge mysql-server mysql-client mysql-common

  1. 删除 MySQL 配置文件和数据
sudo rm -rf /etc/mysql /var/lib/mysql

  1. 清理残留文件和目录
sudo apt-get autoremove
sudo apt-get autoclean

  1. 验证卸载结果
mysql --version

部署 Web 项目到 Linux


环境配置


确保程序正常运行需完成以下配置:

  1. 数据库准备

    • 执行提供的建表脚本,确保表结构与服务器一致
  2. 多环境配置

    • 按环境创建配置文件(如开发/测试/生产环境)
    • 命名格式:application-XXX.ymlapplication-XXX.properties
    • 差异化配置项示例:MySQL账号密码、服务端口等

关键点:通过文件命名区分环境,避免硬编码敏感信息。


以下以application-XXX.yml为例:

application-dev.yml: 开发环境配置

image-20250529175414319

server:port: 8080spring:datasource:url: jdbc:mysql://127.0.0.1:3306/java_blog_spring?characterEncoding=utf8&useSSL=falseusername: rootpassword: 123456  # windows 数据库密码driver-class-name: com.mysql.cj.jdbc.Drivermybatis-plus:configuration:map-underscore-to-camel-case: true
#      log-impl: org.apache.ibatis.logging.stdout.StdOutImpl   # linux 服务器没必要打日志, 打日志也会影响性能logging:file:name: spring-blog.log

application-prod.yml: 生产环境配置

image-20250529175444889

server:port: 8080spring:datasource:url: jdbc:mysql://127.0.0.1:3306/java_blog_spring?characterEncoding=utf8&useSSL=falseusername: rootpassword: BITE@yyds.666 # linux 数据库密码driver-class-name: com.mysql.cj.jdbc.Drivermybatis-plus:configuration:map-underscore-to-camel-case: true
#      log-impl: org.apache.ibatis.logging.stdout.StdOutImpl   logging:file:name: spring-blog.log

如果同时有三个yml文件,通常只有主配置文件application.yml会自动生效。为了使其他配置文件(如application-prod.ymlapplication-dev.yml)生效,需要在主配置文件application.yml中进行相应的配置。具体步骤如下:

  1. 删除主配置文件中的数据库相关配置: 在application.yml中删除与数据库相关的配置项,以避免冲突。
  2. 指定生效的配置文件: 在application.yml中添加配置,指定使用application-prod.ymlapplication-dev.yml作为生效的配置文件。

image-20250529175812878

spring:profiles:active: prodspring:profiles:active: dev

在Spring框架中,spring.profiles.active属性用于指定激活的配置文件。

这里的active属性值填的是配置文件名的一部分(如devprod等),而不是完整的文件名(如application-prod.ymlapplication-dev.yml)。


启动程序:

image-20250529181815211


测试接口:

image-20250529182232839


当前配置文件中的数据库密码是按照 Linux 系统的设置来配置的,与 Windows 系统的数据库密码不一致,从而导致接口访问失败:

image-20250529182539655


在不同环境之间来回切换时,需要频繁修改配置文件中的active值。在多人协作的场景下,很容易出现忘记修改active值的情况,从而导致配置错误。

为了避免这种情况,我们可以通过从 Maven 中读取环境配置变量来为active赋值:

image-20250529184152481

<profiles><profile><id>dev</id><properties><profile.name>dev</profile.name></properties></profile><profile><id>prod</id><activation><activeByDefault>true</activeByDefault></activation><properties><profile.name>prod</profile.name></properties></profile>
</profiles>

注意,每次勾选新的 profile 都需要刷新 maven


修改 application.yml

spring:profiles:active: @profile.name@

image-20250529185215864


勾选好 profile 后,刷新 maven,重新运行程序:

image-20250529185507098


测试接口,此时接口访问成功:

image-20250529184623409


构建项目并打包


在本地使用 Maven 进行打包

  1. 如果 Test 代码中有与环境配置相关的操作(比如数据库相关的操作),打包会失败,可以跳过测试。
  2. 点击 clean -> package

上传 Jar 包到服务器并运行


1. 上传 Jar 包


dev 切换成 prod,刷新 maven 并打包:

image-20250529190134939


因为这个项目使用的是 mybatis-plus ,所以不需要写 mybatis 的测试用例,所以打包成功

image-20250529192016934

  • 如果使用的是 MyBatis 而非 MyBatis-Plus,就需要在单元测试中编写 MyBatis 的接口测试代码

  • Maven 的配置文件中,如果选择了prod环境配置并刷新了 Maven,然后按照生命周期package命令进行打包,那么 Maven 会依次执行clean、validate、compile、test、package阶段:image-20250529191432762

  • 在 Maven 的 test 阶段运行单元测试时,由于配置的数据库密码与 Windows 系统的数据库密码不一致,导致 MyBatis 无法连接到数据库,从而使得单元测试失败

  • 单元测试失败会中断 Maven 的打包过程,导致打包失败

  • 解决方案:在打包前,设置去掉 test 阶段,避免打包过程因为 test 的问题导致打包过程被打断:image-20250529191733447

接下来,找到打好的 Jar 包:

image-20250529192828340


在 linux 系统中,创建和 windows 对应数据库及数据表

-- 建表 SQL
create database if not exists java_blog_spring charset utf8mb4;use java_blog_spring;-- 用户表
DROP TABLE IF EXISTS java_blog_spring.user_info;
CREATE TABLE java_blog_spring.user_info(
`id` INT NOT NULL AUTO_INCREMENT,
`user_name` VARCHAR (128) NOT NULL,
`password` VARCHAR (128) NOT NULL,
`github_url` VARCHAR (128) NULL,
`delete_flag` TINYINT (4) NULL DEFAULT 0,
`create_time` DATETIME DEFAULT now(),
`update_time` DATETIME DEFAULT now() ON UPDATE now(),
PRIMARY KEY (id),
UNIQUE INDEX user_name_UNIQUE (user_name ASC)) ENGINE = INNODB DEFAULT CHARACTER SET = utf8mb4 COMMENT = '用户表';-- 博客表
drop table if exists java_blog_spring.blog_info;
CREATE TABLE java_blog_spring.blog_info (
`id` INT NOT NULL AUTO_INCREMENT,
`title` VARCHAR(200) NULL,
`content` TEXT NULL,
`user_id` INT(11) NULL,
`delete_flag` TINYINT(4) NULL DEFAULT 0,
`create_time` DATETIME DEFAULT now(),
`update_time` DATETIME DEFAULT now() ON UPDATE now(),
PRIMARY KEY (id))
ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '博客表';-- 新增用户信息
insert into java_blog_spring.user_info (user_name, password, github_url) values("zhangsan", "123456", "https://gitee.com/bubblefish666/class-java45");
insert into java_blog_spring.user_info (user_name, password, github_url) values("lisi", "123456", "https://gitee.com/bubblefish666/class-java45");insert into java_blog_spring.blog_info (title, content, user_id) values("第一篇博客", "111我是博客正文我是博客正文我是博客正文", 1);
insert into java_blog_spring.blog_info (title, content, user_id) values("第二篇博客", "222我是博客正文我是博客正文我是博客正文", 2);

为了能通过加密、加盐功能的密码校验,更新 linux 数据库表中,用户的密码:

update user_info set password= 'e5bf3de57e3243ab9d94b59b379a0a640f967f2e3ae738c2f5474ab0fe46389b' where id in(1,2);

image-20250529193626767


直接拖动打好的 Jar 包到 Xshell 窗口即可完成文件的上传。

image-20250529194002503

Xshell 可以直接拖动文件到窗口,达到上传文件的目的。如果使用其他客户端,不支持文件的上传,需要借助 lrzsz 命令;


借助 mv 改一下 jar 包名:

image-20250529194152710


2. 运行程序


接下来,在 linux 上运行该 jar 包:

java -jar blog.jar

image-20250529194511729

这种部署方式,如果按 ctrl+c ,那么部署好的服务就无法被服务了;正确的启动命令:

nohup java -jar blog.jar &
  • nohup:后台运行程序。用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行。

  • 语法格式:

    nohup Command [Arg …] [&]
    
  • 参数说明:

    • Command:要执行的命令。
    • Arg:一些参数,可以指定输出文件。
    • &:让命令在后台执行,终端退出后命令仍旧执行。
  • 示例:

    nohup java -jar blog-0.0.1-SNAPSHOT.jar >/logs &
    
  • Linux 可以通过 > 把需要输出的内容写到指定文件中。这样的操作称为“重定向”。


开放端口号


如果外网需要访问该服务,需要先服务器防火墙开放对应的端口号。

本着服务器安全的原则,云服务器上的端口非必要不开启。比如常见端口号:数据库 3306、Redis 6379,尽可能避免开放,而是采用其他方式来连接,比如配置隧道的方式。

image-20250529204038344


image-20250529204120904


确保列表中有添加的规则:

image-20250529204159836


验证程序


  1. 访问项目http://IP:Port/blog_login.html
    • IP 改为云服务器的 IP,Port 改为项目的端口号。
  2. 按照项目功能进行验证
    • 验证账号注册登录。image-20250529204225810
    • 验证展示博客列表。image-20250529204310510
    • 验证博客编辑功能image-20250529204430024
    • 验证新增博客。image-20250529204506265
    • 验证展示博客内容。image-20250529204453371

常见问题


一个程序的正常运行,需要程序的正确和环境的正确。同样的代码在 Windows 上可以运行成功,不一定在 Linux 上运行成功。不同的系统对代码的理解和支持是不同的。比如 Windows 系统对 MySQL 不区分大小写,Linux 区分大小写。

服务不能正常访问的原因有很多,主要分以下几个方面:

  1. 服务未启动

    • 使用 ps -ef | grep java 查看程序是否在运行。
    • 使用 curl http://127.0.0.1:8080/blog_login.html 看下是否有返回 HTML 页面。如果有返回,说明程序启动成功了,考虑端口未开放。
    • 如果未启动成功,需要查看对应的日志,根据原因来分析:
      • 数据库不存在。
      • 表不存在(区分大小写)。
      • 数据库密码不正确。
      • JDK 安装版本不对,或者未安装。
      • MySQL 未设置密码。
  2. HTTP 端口未开放

    • 检查云服务器防火墙/安全组是否开放相应端口(如 8080)。

杀掉进程

如果我们需要重启服务,或者重新部署等,都需要先停止之前的服务。

  1. 查看当前服务的进程

    ps -ef | grep java
    

    上图中的 35443 就是该服务的进程。

  2. 杀掉进程

    kill -9 PID
    

在这里插入图片描述

在这里插入图片描述

http://www.xdnf.cn/news/720775.html

相关文章:

  • 【笔记】2025 年 Windows 系统下 abu 量化交易库部署与适配指南
  • 2023年12月GESPC++二级真题解析(含视频)
  • 2023年6月第三套第二篇
  • 什么是生成式人工智能?
  • 【决策分析】基于Excel的多变量敏感性分析解决方案
  • 9.5 Q1 | 北京协和医学院GBD发文 | 1990-2021 年全球、区域和国家心力衰竭负担及其根本原因
  • 运筹说 第137期 | 对策论精品案例
  • 重塑企业:迈向人类、智能体与下一代组织模式
  • LeetCode 75. 颜色分类 - 双指针法高效解决(Java实现)
  • unity星空运动
  • ZeroSearch: 无需搜索即可激发LLM的搜索能力
  • Ollama v0.8.0 发布,支持通过工具调用进行流式响应!
  • Powerbuilder 连接达梦数据库(ODBC 和 JDBC)
  • [ Qt ] | Qlabel使用
  • 软考-系统架构设计师-第十章 系统质量属性和架构评估
  • 2025-05-29 学习记录--Python-面向对象
  • Pinia Plungin Persistedstate
  • Shell 脚本基础笔记
  • Java 中的 synchronized 和 Lock:如何保证线程安全
  • 深度解析互联网区(Internet ):架构、风险与防护全攻略
  • iOS 关于上架 4.3a
  • 330130-045-00-00 Bently Nevada 3300 XL延长电缆
  • 软考 系统架构设计师之考试感悟3
  • 美创专家分享医疗数据安全分类分级实践与探索
  • 从“固定“到“流动“:移动充电如何重塑用户体验?
  • 使用grpc建立跨语言通讯
  • Lua语言学习
  • 编译原理OJ平台练习题题解
  • 用 Python 模拟下雨效果
  • 输入输出相关问题 day4