JavaEE进阶(14)Linux基本使用和程序部署(博客系统部署)

接上次博客: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:

非专业版的样子稍有不同,是个闪电。 

这样就打包成功了。

包的地址他也告诉你了。

但是你有没有觉得手动打包真的很麻烦?

一旦我们需要对程序进行修改,就需要重新打一次包。

我们希望的是不同的平台去帮我们执行不同的配置,比如开发环境是一个配置文件,线上环境是一个配置文件,还有测试环境、预发布环境……

那么我们就需要“分平台配置”。

分平台配置

当谈到分平台配置时,通常涉及到软件开发、系统部署或网络架构等方面:

  1. 软件开发:在开发软件时,开发人员通常会面临不同的目标平台,比如不同的操作系统(如Windows、Linux、macOS)、不同的硬件架构(如x86、ARM)、不同的编程语言或框架(如Java、Python、Node.js)。针对不同的平台,可能需要进行不同的配置和优化,以确保软件能够在各种环境中正确运行和高效执行。

  2. 系统部署:在部署应用程序或服务时,可能会涉及到不同的部署环境,比如本地服务器、云平台(如AWS、Azure、Google Cloud)、容器化平台(如Docker、Kubernetes)等。针对不同的部署环境,可能需要不同的配置文件、环境变量设置或者部署脚本,以确保应用程序能够在各种环境中正确部署和运行。

  3. 网络架构:在构建网络架构时,可能会涉及到多种不同的网络设备和协议,比如路由器、交换机、防火墙、负载均衡器等。针对不同的网络设备和协议,可能需要不同的配置和调整,以确保网络能够稳定运行并满足性能要求。

总之,分平台配置是指我们可以根据不同的平台或环境来进行定制化的配置和优化,以确保软件、系统或网络能够在各种环境中正常运行并达到最佳性能。这种配置工作通常需要开发人员、系统管理员或网络工程师来完成,他们需要对不同平台的特性和要求有深入的了解,并采取相应的措施来适配和优化。

我们先多复制几个配置文件:

开发环境里面的放置我们最开始的配置,线上环境的放置我们刚刚修改完成后的配置。

但是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

注意这里的端口号,因为还在测试本机。

像这样拿到了相关网页信息就可以确定你本机的应用启动成功了。

这个时候你就要去考虑有没有正确开发端口号?防火墙有没有处理? 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/520753.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入探讨 AutoGPT:彻底改变游戏的自主 AI

原文地址&#xff1a;Deep Dive into AutoGPT: The Autonomous AI Revolutionizing the Game 2023 年 4 月 24 日 AutoGPT 是一个功能强大的工具&#xff0c;它通过 API 使用 GPT-4 和 GPT-3.5&#xff0c;通过将项目分解为子任务并在自动循环中使用互联网和其他工具来创建完…

Android自定义横向滑动菜单的实现

本文讲述了Android自定义横向滑动菜单的实现。分享给大家供大家参考&#xff0c;具体如下&#xff1a; 前言 开发安卓过程中&#xff0c;经常会用到标题栏的样式&#xff0c;有时候传统方式不能满足开发者的需要&#xff0c;这时候就需要自定义控件来实现。&#xff08;注意&…

【MySQL 系列】MySQL 架构篇

在我们开始了解 MySQL 核心功能之前&#xff0c;首先我们需要站在一个全局的视角&#xff0c;来看 SQL 是如何运作执行的。通过这种方式&#xff0c;我们可以在头脑中构建出一幅 MySQL 各组件之间的协同工作方式&#xff0c;有助于我们加深对 MySQL 服务器的理解。 文章目录 1、…

【Memory协议栈】NVRAM Manager 模块介绍

目录​​​​​​​ 前言 正文 1.功能简介 2.关键概念 3.功能详解 3.1 内存硬件抽象层Ea/Fee的寻址方案 3.2 基本存储对象Basic storage objects 3.2.1 NV Block 3.2.2 RAM Block 3.2.3 ROM Block 3.2.4 Administrative block 3.2.5 NV Block Header 3.3块管理类型…

Django高级之-cookie-session-token

Django高级之-cookie-session-token 发展史 1、很久很久以前&#xff0c;Web 基本上就是文档的浏览而已&#xff0c; 既然是浏览&#xff0c;作为服务器&#xff0c; 不需要记录谁在某一段时间里都浏览了什么文档&#xff0c;每次请求都是一个新的HTTP协议&#xff0c; 就是请…

《水处理用臭氧陶瓷膜一体化装置》团体标准立项

一、标准编制单位 《水处理用臭氧陶瓷膜一体化装置》是由北京林业大学提出&#xff0c;中华环保联合会水环境治理专业委员会组织实施。本标准参编单位有山东华瓷环保设备科技有限公司、江苏永冠给排水设备有限公司、博天环境集团股份有限公司、天健水务集团、北京科泰兴达高新技…

【论文精读】【DETR】End-to-End Object Detection with Transformers

End-to-End Object Detection with Transformers 0.论文摘要 我们提出了一种新的方法&#xff0c;将目标检测视为一个直接的集合预测问题。我们的方法简化了检测管道&#xff0c;有效地消除了对许多手工设计组件的需求&#xff0c;如非极大抑制程序或锚生成&#xff0c;它们…

AI安全白皮书 | “深度伪造”产业链调查以及四类防御措施

以下内容&#xff0c;摘编自顶象防御云业务安全情报中心正在制作的《“深度伪造”视频识别与防御白皮书》&#xff0c;对“深度伪造”感兴趣的网友&#xff0c;可在文章留言中写下邮箱&#xff0c;在该白皮书完成后&#xff0c;会为您免费寄送一份电子版。 “深度伪造”就是创建…

SpringMVC | SpringMVC的“入门“

目录: Spring MVC入门 :Spring MVC 概述第一个Spring MVC应用SpringMVC 的 “工作流程” Spring MVC入门 : 作者简介 &#xff1a;一只大皮卡丘&#xff0c;计算机专业学生&#xff0c;正在努力学习、努力敲代码中! 让我们一起继续努力学习&#xff01; 该文章参考学习教材为&a…

css相邻元素边框重合问题,解决方案

1、如下图所示&#xff0c;在给元素设置边框后&#xff0c;相邻元素会出现重合的问题 2、解决方案 给每个元素设置margin-top以及margin-left为负的边框 <div style"width: 300px;display: flex;flex-wrap: wrap;margin-top: 50px;"><div style"border…

2024年AI辅助研发的技术革新与应用展望

文章目录 每日一句正能量前言AI辅助研发的技术进展全球AI应用呈现出百家争鸣、百花齐放态势&#xff0c;加速向各行各业渗透AI应用显著促进效率提升&#xff0c;“劳动替代低创造性脑力替代”正在加速形成 面临的挑战与机遇未来趋势预测后记 每日一句正能量 要理解这样的自己。…

3D资产管理

3D 资产管理是指组织、跟踪、优化和分发 3D 模型和资产以用于游戏、电影、AR/VR 体验等各种应用的过程。 3D资产管理也称为3D内容管理。 随着游戏、电影、建筑、工程等行业中 3D 内容的增长&#xff0c;实施有效的资产管理工作流程对于提高生产力、减少错误、简化工作流程以及使…