接上次博客:JavaEE进阶(13)案例综合练习——博客系统-CSDN博客
目录
程序配置文件修改和打包
构建项目并打包
分平台配置
数据准备
上传jar包到云服务器并运行
开放端口号
验证程序
如何查看日志得到报错信息
常见问题
关于Linux基本使用和环境搭建(云服务器配置)可以参考我之前的博客,已经写的很详细了:初阶JavaEE(17)Linux 基本使用和 web 程序部署-CSDN博客
程序配置文件修改和打包
接着我们的上篇博客,现在我们把它部署到云服务器上。
首先我们需要修改一下.yml的配置,你需要把这里面的MySQL的密码修改成云服务器的密码:
并且我们可以把打印日志的语句注释掉了:
我们再加上一个配置日志的内容,方便我们后续观察日志:
# 应用服务 WEB 访问端口
server.port: 8080# 下面这些内容是为了让 MyBatis 映射
# 指定 MyBatis 的 Mapper 文件
mybatis.mapper-locations: classpath:mappers/*xml
# 指定 MyBatis 的实体目录
mybatis.type-aliases-package: com.example.mybatisstudy.mybatis.entity# 数据库连接配置
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/java_blog_spring?characterEncoding=utf8&useSSL=falseusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Drivermybatis:configuration: # 配置打印 MyBatis⽇志# log-impl: org.apache.ibatis.logging.stdout.StdOutImplmap-underscore-to-camel-case: true #配置驼峰⾃动转换mapper-locations: classpath:mapper/**Mapper.xmllogging:file:name:spring-blog.log
构建项目并打包
接下来就是打包:
注意,一定要确保自己的pom.xml里面包含了这个插件:
<plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.version}</version><configuration><mainClass>com.example.newblogsystem.NewBlogSystemApplication</mainClass></configuration><executions><execution><id>repackage</id><goals><goal>repackage</goal></goals></execution></executions></plugin>
可以去中央仓库下载。
先点击clean,再点击package。
注意,非专业版的双击Maven下面的package就行了,很容易找到。
打包失败。这是因为我们为了部署jar包,修改了配置文件。但是修改完配置文件之后Test运行失败,导致打包失败。
那你说把密码改回去?
不行啊,这样我们打的包里面密码就不对了,扔到云服务器上无法运行啊。
我们只能选择跳过Test:
非专业版的样子稍有不同,是个闪电。
这样就打包成功了。
包的地址他也告诉你了。
但是你有没有觉得手动打包真的很麻烦?
一旦我们需要对程序进行修改,就需要重新打一次包。
我们希望的是不同的平台去帮我们执行不同的配置,比如开发环境是一个配置文件,线上环境是一个配置文件,还有测试环境、预发布环境……
那么我们就需要“分平台配置”。
分平台配置
当谈到分平台配置时,通常涉及到软件开发、系统部署或网络架构等方面:
-
软件开发:在开发软件时,开发人员通常会面临不同的目标平台,比如不同的操作系统(如Windows、Linux、macOS)、不同的硬件架构(如x86、ARM)、不同的编程语言或框架(如Java、Python、Node.js)。针对不同的平台,可能需要进行不同的配置和优化,以确保软件能够在各种环境中正确运行和高效执行。
-
系统部署:在部署应用程序或服务时,可能会涉及到不同的部署环境,比如本地服务器、云平台(如AWS、Azure、Google Cloud)、容器化平台(如Docker、Kubernetes)等。针对不同的部署环境,可能需要不同的配置文件、环境变量设置或者部署脚本,以确保应用程序能够在各种环境中正确部署和运行。
-
网络架构:在构建网络架构时,可能会涉及到多种不同的网络设备和协议,比如路由器、交换机、防火墙、负载均衡器等。针对不同的网络设备和协议,可能需要不同的配置和调整,以确保网络能够稳定运行并满足性能要求。
总之,分平台配置是指我们可以根据不同的平台或环境来进行定制化的配置和优化,以确保软件、系统或网络能够在各种环境中正常运行并达到最佳性能。这种配置工作通常需要开发人员、系统管理员或网络工程师来完成,他们需要对不同平台的特性和要求有深入的了解,并采取相应的措施来适配和优化。
我们先多复制几个配置文件:
开发环境里面的放置我们最开始的配置,线上环境的放置我们刚刚修改完成后的配置。
但是Tomcat只认application.yml这一个配置文件,我们要怎么告诉它我们想要怎么运行呢?
直接在 application.yml里面规定就好了。
在主配置文件 application.yml 中指定配置文件,并删除数据库相关配置:
spring:profiles:active: dev
我们看看配置成功与否。
打包成功。
但是注意文件的命名规则,必须按照application-xxx.yml的格式命名。
当然,还是觉得麻烦的话,你也可以在pom.xml里面进行Maven的自定义配置:
<profiles><profile><id>dev</id>
<!-- <自定义配置>--><properties><profile.name>dev</profile.name></properties></profile><profile><id>prod</id><!-- <自定义配置>--><properties><profile.name>prod</profile.name></properties></profile></profiles>
运行之后:
这样以后我们打包就很简单了,只需要在右边点击一下。
然后再次修改application.yml:
spring:profiles:active: @profile.name@
我们选择不跳过Test运行:
这样从侧面反应我们配置成功了。
不信的话运行一下dev:
好了,现在我们重新打包:
数据准备
-- 建表SQL
CREATE DATABASE IF NOT EXISTS java_blog_spring CHARSET utf8mb4;
USE java_blog_spring;
-- 用户表
DROP TABLE IF EXISTS java_blog_spring.user;
CREATE TABLE java_blog_spring.user (`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(),PRIMARY KEY (`id`),UNIQUE INDEX `user_name_UNIQUE` (`user_name` ASC)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';-- 博客表
DROP TABLE IF EXISTS java_blog_spring.blog;
CREATE TABLE java_blog_spring.blog (`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(),PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='博客表';-- 新增用户信息
INSERT INTO java_blog_spring.user (user_name, password, github_url) VALUES ('神圣的管理员SAMA', 'a72bc4c673f7404f8d4342fb4b91e42e6735b80aadf34d80afad625b3a37cf3c');
INSERT INTO java_blog_spring.user (user_name, password, github_url) VALUES ('狂气兔子', '96bd56fa240d42078534534594d00dbb024bce4adb9c6dade636518c15ae2c0b');
INSERT INTO java_blog_spring.blog (title, content, user_id) VALUES ('我正在进行程序部署测试1', '111我是博客正文我是博客正文我是博客正文', 1);
INSERT INTO java_blog_spring.blog (title, content, user_id) VALUES ('我正在进行程序部署测试1', '222我是博客正文我是博客正文我是博客正文', 1);
但是注意这里有一个问题,就是我们的密码已经是加密过的了,你需要到上次我们写的MD5测试类里面给密码进行加密,替换掉我们刚刚的SQL语句中的密码,否则它会报错。
你也可以这样修改:
UPDATE java_blog_spring.user
SET password = 'a72bc4c673f7404f8dad1gda4b91e42e6735b80aadf74580afad625b3a37cf3c'
WHERE id = 1;UPDATE java_blog_spring.user
SET password = '96bd56fa240d42078549430994d00dbb023524addb9c6dade636518c15ae2c0b'
WHERE id = 2;
好了,直接把SQL语句SHIFT+INSERT粘贴进来:
上传jar包到云服务器并运行
然后我们先不关闭数据库,另外开一个窗口:
把我们的打好的包拖进来:
注意,你的包大小至少是30、40MB左右的大小,太小的话很有可能是pom.xml出了问题,没有正确引入依赖等等,一定要回去找问题,重新打包!!!
我的血泪史!!!
自己可以选一个存放的路径,然后把jar包拖进来:
然后我们就可以运行这个程序了:
java -jar NewBlogSystem-0.0.1-SNAPSHOT.jar
好了,我们继续。
开放端口号
如果外网需要访问该服务,需要先在服务器防火墙中开放相应的端口号。本着保障服务器安全的原则,云服务器上的端口非必要情况下不开放。
例如,常见的端口号如数据库的3306端口、Redis的6379端口等,应尽可能避免直接开放,而是可以考虑采用其他方式进行连接,比如配置隧道的方式。
以腾讯云服务器举例:
进⼊防火墙管理界面:
添加规则:
端口号写需要开放的端口号,多个端口号以逗号分割.
验证程序
接下来我们把端口号复制到网页,看看我们的博客系统:
看上去是成功了,我们测试每一个功能,也都没有问题。
如何查看日志得到报错信息
上面的一切可能都不会太顺利,因为每台电脑配置、环境都不一样,即使代码一模一样,在不同的环境里面运行得到的结果也可能天差地别。
当我们的程序运行出错了,我们就需要去查看日志,里面隐藏着报错信息。
我们一开始添加了:
logging:file:name:spring-blog.log
在application.yml里面,就是为了方便查看日志。
在Xshell中查看日志通常使用的命令:
- less: 用于逐页查看文件内容,可以向上或向下滚动查看文件内容,并支持搜索、定位等功能。less filename.log
- more: 类似于 less,也用于逐页查看文件内容,但不支持向上滚动或搜索,只能向下逐页查看。more filename.log
- vim: 是一个文本编辑器,但也可以用于查看文件内容。在命令模式下输入 :e filename.log 即可打开文件并查看其内容。
但是这些都不是最常用的,最方便的应该是:tail -f filename.log
tail: 用于显示文件的末尾内容,将实时显示日志文件filename.log的最新内容。 -f 参数表示“跟踪”,即持续监视文件的增长,我们就可以实时查看新的日志内容。
你甚至可以查找指定的日志信息:
tail -f filename.log |grep "ERROR"
这个命令的目的是实时查看日志文件 filename.log 的最新内容,并筛选出包含 "ERROR" 关键字的行。其中,tail -f 用于实时跟踪文件的增长,而 grep "ERROR" 用于筛选出包含 "ERROR" 关键字的行。通过将这两个命令组合起来,我们可以实时查看文件的最新内容,并且只关注包含 "ERROR" 关键字的行。
另外,| 代表管道(Pipeline)。管道是一种在Unix和类Unix系统中用于进程间通信的机制。在Linux指令中,管道可以使用竖线符号 | 作为管道标记。它的作用是将一个命令的标准输出作为另一个命令的标准输入。这种机制使得多个命令可以通过管道连接起来,形成一个流水线,每个命令都可以处理前一个命令的输出,从而实现复杂的数据处理和操作。
例如,我们提到的 tail -f filename.log | grep "ERROR" 就是一个典型的管道用法,它将 tail -f filename.log 的输出(即实时查看日志文件的最新内容)传递给 grep "ERROR" 命令,然后 grep 命令会筛选出包含 "ERROR" 关键字的行,并将其输出显示在终端上。
需要注意的是,如果 filename.log 中的内容不是文本而是二进制文件,可能无法直接使用 grep 命令。
常见问题
当我们测试完成之后直接断开对话,再打开:
这个时候我们需要思考为什么会出现这种问题:
服务未启动,或者端口未开放。
查找进程里面有Java出现的地方:
为什么没有启动呢?因为我们刚刚是非后台启用的,一关闭对话进程就被杀死了。
我们真正应该采用的命令是这个——后台启动:nohup java -jar <name> &
注意:“&”不可省略!
我们现在把窗口关掉:
但是这种做法也存在着弊端,比如我们突然发现程序还有需要修改的地方,但是这个时候再次重复之前的步骤,然后启动程序:
端口号冲突!
原因是后台启动的程序,重新发布时,必须先把之前的进程杀掉。
之前的进程未杀掉会造成端口号冲突。
这个时候我们有两种选择:
1、修改端口号;
但是你得去开放相关端口号。
2、杀死进程。
有两种语句可以查看占用端口号的进程:
也可以像之前那样搜索包含了Java的进程:
最后杀死进程就是直接输入:kill <进程PID>,或者 kill -9 <进程ID>。
"kill -9" 命令是用来强制终止一个进程的,其中的 "9" 表示信号编号,代表 SIGKILL 信号。SIGKILL 是一个特殊的信号,用来立即终止目标进程,而不管目标进程的状态如何。这个命令通常用来应对无法通过常规方式终止的进程,比如卡死的程序或者僵尸进程。
在执行 kill -9 <进程ID> 命令时,操作系统会发送 SIGKILL 信号给指定进程,从而立即终止该进程。需要注意的是,使用 SIGKILL 信号终止进程会直接结束进程,而不会给进程执行清理工作的机会,因此慎用此命令,可能会导致数据丢失或者其他不良后果。
最后,如果你的程序启动了,那么怎么确认是不是端口未开放?
可以输入:curl http://127.0.0.1:9090/blog_login.html
注意这里的端口号,因为还在测试本机。
像这样拿到了相关网页信息就可以确定你本机的应用启动成功了。
这个时候你就要去考虑有没有正确开发端口号?防火墙有没有处理?