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

article/2025/8/19 1:17:13

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


搭建 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.hkcw.cn/article/oFpRlZAtQr.shtml

相关文章

新一线城市公布,成都连续11年第一 综合实力再获认可

新一线城市公布,成都连续11年第一 综合实力再获认可。5月28日,第一财经旗下城市数据研究智库新一线城市研究所发布了《2025新一线城市魅力排行榜》。15个进入新一线的城市依次为:成都、杭州、重庆、武汉、苏州、西安、南京、长沙、郑州、天津、合肥、青岛、东莞、宁波、佛山…

特朗普首次长文回应关税措施被叫停 抨击裁决并指责幕后势力

美东时间周四晚上,特朗普在其社交媒体平台Truth Social上发长文,抨击了美国国际贸易法院叫停其关税政策的裁决。周三,美国国际贸易法院裁定,特朗普无权对几乎所有国家征收一揽子全面关税,即他所谓的“解放日关税”在法律层面无效。法官们认为,加征关税的权力应由国会行使…

石破茂主动给特朗普打了25分钟电话 贸易协议势头增强

日本首相石破茂于29日主动致电美国总统特朗普,双方讨论了关税、外交及安全等议题。石破茂表示,通过此次对话,双方进一步加深了了解。这次通话持续了25分钟,距离两人上次对话还不到一星期。据日媒报道,石破茂向特朗普提出希望达成符合两国利益的贸易协议,并要求美方重新评…

国际调解院落户香港有何深意 凝聚国际人才

国际调解院将在香港成立,5月30日在港举行《关于建立国际调解院的公约》签署仪式。在香港特区立法会行政长官互动交流答问会上,行政长官李家超表示,国际调解院在港设立将为香港带来多方面利益,认为其影响深远,可不断发挥影响力,凝聚不同国家和地区的人才。特区政府愿意推荐…

58岁梁实发文称将参加第29次高考 梦想与挑战并存

梁实今年58岁,即将参加他的第29次高考。他表示,今年看书时间少,底气有些不足。查询历年成绩显示,梁实的高考分数均超过400分。对此,他回应说,400多分是个非常基础的分数,感觉一直停滞不前。上大学一直是梁实的梦想。尽管别人可能认为他多年来的坚持是躺平的表现,但他羡…

烟台一高校校长论文抄袭被免职 学术诚信受重视

近日,“烟台科技学院校长硕士论文涉嫌严重抄袭”一事引发社会广泛关注。5月29日,烟台科技学院就此事发布声明。声明中提到,有网民向媒体反映该事件后,学校进行了查核,确认情况属实。学校董事会高度重视,为严肃学术纪律,维护高校声誉和教育公信力,决定免去马红坤同志烟台…

TOTP算法原理与实现

一、原理说明 基于 HMAC-SHA1 生成的 20 字节哈希值&#xff0c;通过 ​偏移量截取法​ 生成 32 位整数示例&#xff1a; 假设 HMAC-SHA1 生成的 20 字节哈希值为&#xff1a; 1f 86 98 69 0e 02 ca 16 61 85 50 ef 7f 19 da 8e 94 5b 55 5a&#xff08;字节编号从 0 到 19&a…

JAVA与C语言之间的差异(二)

一、while循环&#xff0c;do while循环 众所周知&#xff0c;while循环的结构是这样的&#xff1a; while(循环条件) {循环语句;} 在C语言中&#xff0c;可以直接再循环条件处写1&#xff0c;表示死循环&#xff0c;直到执行break才可以跳出&#xff0c;但是在JAVA中不可以&…

环境温度通过H2A.Zub和H3K27me3动态调控拟南芥细胞命运决定

2025年4月22日&#xff0c;中国科学院遗传与发育生物学研究所肖军研究组在Developmental Cell在线发表了题为Dynamic control of H2A.Zub and H3K27me3 by ambient temperature during cell fate determination in Arabidopsis的研究论文&#xff0c;本研究综合运用ChIP-seq、C…

国际调解院正式落户香港有哪些亮点 凝聚国际人才

国际调解院将在香港成立,计划于5月30日在港举行《关于建立国际调解院的公约》签署仪式。在香港特区立法会行政长官互动交流答问会上,李家超表示,国际调解院在港设立对香港多方面有利,认为其影响深远,可不断发挥影响力,凝聚不同国家和地区的人才。他表示,特区政府愿意将人…

特朗普关税政策为何被暂时恢复 法院裁决引发争议

5月29日,美国联邦巡回上诉法院批准了特朗普政府的请求,暂时搁置了美国国际贸易法院此前做出的禁止执行依据《国际紧急经济权力法》对多国加征关税措施的裁决。联邦巡回上诉法院在裁决书中表示,在审议相关动议文件期间,美国国际贸易法院在这些案件中作出的判决和永久性禁令将…

中国寻亲网将关闭 负责人回应原因 公司注销不影响运营

中国寻亲网将关闭 负责人回应原因 公司注销不影响运营。近日,中国寻亲网在官方网站发布公告,宣布将于2025年7月15日正式关闭服务器。自5月1日起,该网站已停止发布新的寻亲信息,仅保留原有数据的修改功能。这一消息引起众多网友关注,并引发对关闭原因的猜测。寻子家长、电影…

大众中国CEO:中国人喜欢智能 欧洲人看中实用 市场偏好差异显著

大众中国CEO:中国人喜欢智能 欧洲人看中实用 市场偏好差异显著。大众中国CEO贝瑞德指出,中国消费者和欧洲消费者在电动汽车的偏好上存在显著差异。中国年轻用户群体对“智能座舱”和“语音交互”功能习以为常,电动车主的平均年龄不到35岁,他们崇尚数字体验。相比之下,欧洲…

C库-进程

库 头文件: #include<stdio.h> <>代表区系统路径下查找头文件 /usr/include #include"head.h" ""代表先去当前路径下查找头文件&#xff0c;找不到再去系统路径下查找 头文件也就是以.h结尾的文件&#xff0c;其中包含&#xff1a;宏定义…

华为OD机试真题——阿里巴巴找黄金宝箱Ⅰ(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

2025 A卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…

泡泡玛特成基金重仓新贵 消费投资聚焦“含新量”

泡泡玛特成基金重仓新贵 消费投资聚焦“含新量”!随着泡泡玛特在港交所挂牌并凭借爆款IP实现股价大幅上涨,不少曾经重仓持有贵州茅台的基金经理开始转向投资泡泡玛特。许多基金经理也在积极寻找能够复制泡泡玛特成功的新消费标的。一位长期关注新消费领域的公募基金经理表示,…

刘扬伟:富士康即将宣布第二家日本车企合作伙伴 电动车业务再扩展

刘扬伟:富士康即将宣布第二家日本车企合作伙伴 电动车业务再扩展!富士康董事长刘扬伟在股东大会上宣布,公司即将与第二家日本汽车制造商建立合作关系,继续拓展电动车业务。他提到两家日本车厂中,一家已经公布,另一家也快了,但未透露更多细节。本月早些时候,富士康旗下的…

美若禁止对华出售EDA对我国有何影响 芯片设计工具受限

美若禁止对华出售EDA对我国有何影响 芯片设计工具受限!经历两天传闻后,两家美国芯片EDA大厂Synopsys(新思科技)和Cadence(楷登电子)确认,美国商务部工业和安全局(BIS)要求它们对中国企业断供芯片设计EDA软件工具。Synopsys在5月29日发布公告称,公司收到了BIS的信函,…

女子称坐飞机万元金手链托运后丢失 行李完好首饰不翼而飞

5月26日,杨女士在社交平台发布视频称,她在25日搭乘春秋航空公司的航班从西安返回宁波。落地后发现托运行李中一条价值一万两千余元的金手链不见了。奇怪的是,该金手链的内外包装完好无损。目前,宁波市公安局机场分局已接到杨女士的报警,并受理此案。杨女士表示,她原本不打…

网飞回应苦尽柑来遇见你霸凌风波 剧组工作方式受质疑

网飞(Netflix)热播韩剧《苦尽柑来遇见你》近日被质疑剧组工作人员压榨群演,霸凌风波持续发酵。韩国网络上关于该剧拍摄现场工作方式严苛的爆料不断涌现,爆料人疑似为群演或外包公司员工。有人控诉剧组不愿在非主演身上花钱,不允许群演穿保暖内衣和使用取暖设备,寒冬时节放…