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.mzph.cn/news/727361.shtml

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

相关文章

串的匹配算法——KMP算法

目录 一.特点 二.算法思想 三.公式证明 四.next数组及其练习 五.找规律计算next[k] 六.代码实现 一.特点 BF算法的特点是i回退&#xff0c;KMP算法的最大特点是i不回退&#xff0c;由于i不回退&#xff0c;所以KMP算法的时间复杂度是O(nm)。 二.算法思想 在匹配主串和子…

浅谈社会工程学攻击

一、前言 1.1 社会工程学起源 社会工程学是黑客米特尼克在《欺骗的艺术》中所提出&#xff0c;其初始目的是让全球的网民们能够懂得网络安全&#xff0c;提高警惕&#xff0c;防止没必要的个人损失。但在我国黑客集体中还在不断使用其手段欺骗无知网民制造违法行为&#xff0c;…

String类,StringBuilder类,StringBuffer类

前言 String类&#xff0c;StringBuilder类&#xff0c;StringBuffer类都是java提供的定义字符串的类&#xff0c;下面是三种字符串类的异同介绍 String类&#xff1a;String类表示的字符串是是常量&#xff0c;一旦创建内容和长度都无法修改 StringBuilder类&#xff1a;St…

6个维度分析实时渲染和Webgl技术异同

在日常交流中&#xff0c;对Webgl技术熟悉的合作伙伴&#xff0c;在初次了解实时渲染技术时&#xff0c;都会问二者之间的异同。目前很多要求B/S架构的项目&#xff0c;很多在用webgl技术路线&#xff0c;而且这个方案在行业里比较普&#xff0c;业主方对这个也比较熟悉&#x…

JAVA实现图像取模

JAVA对图像取模 就是图片变成点阵 原图 取模效果图 代码如下&#xff1a; public static void main(String[] args) throws IOException {try {// 读取图像文件BufferedImage image ImageIO.read(new File("C:/Users/xiaol/Desktop/img/0.jpg"));// 定义阈值&am…

冬去春来天气阴晴不定 美食拿捏味蕾安稳换季

俗话说“春打六九头”&#xff0c;3月虽然已经入春&#xff0c;但是天气依然是凉飕飕的 &#xff0c;冬天春天的换季期&#xff0c;因为天气的变化&#xff0c;尤为痛苦。但是来到了换季期&#xff0c;天气也不总是那么稳定&#xff0c;随着气温的起伏&#xff0c;我们的食欲也…

Vue项目实战--空间论坛(1)

环境准备 安装好node.js,Vue后 添加插件 router---路由&#xff0c;多页面的应用 vuex---在多个组件之间维护同一个数据 添加依赖 bootstrap---美工 popperjs/core vue项目介绍 views-----对应vue文件&#xff0c;页面 router-----路由&#xff0c;页面&#xff0c;c…

leetCode刷题 4.寻找两个正序数组的中位数

目录 1. 思路 2. 解题方法 3. 复杂度 4. Code 题目&#xff1a; 给定两个大小分别为 m 和 n 的正序&#xff08;从小到大&#xff09;数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (mn)) 。 示例 1&#xff1a; 输入&…

1分钟带你搞定Python函数分类

python语言中&#xff0c;函数可以分为内置函数、自定义函数、有参数函数、无参数函数、有名字函数和匿名函数。其中&#xff0c;内置函数可以直接使用&#xff0c;自定义函数需要根据需求定义。有参数函数在定义时需要指定参数&#xff0c;调用时传入参数。无参数函数在定义时…

git远程仓库使用

赋值这个地址clone 克隆之后 cd slam_oncloud/ git remote add chenxnew ssh://git192.168.3.40:1022/chenxiao/slam_oncloud.git 查看一下 linuxchenxiao:/media/linux/mydisk/cloud_slam/slam_oncloud$ git remote add chenxnew ssh://git192.168.3.40:1022/chenxiao/sla…

记录一次Dubbo远程调用的错误

情景&#xff1a;有一个生成PDF的接口中&#xff0c;如下&#xff1a; GET Path("/getPDF") public void getPDF(QueryParam("id") String id, Context HttpServletResponse response) {………… }之前实现的代码都写在了Controller里面&#xff0c;代码里…

北斗卫星助力无人机在沙漠播种,促进沙漠治理

北斗卫星助力无人机在沙漠播种&#xff0c;促进沙漠治理 近年来&#xff0c;随着科技的不断发展&#xff0c;北斗卫星和无人机技术的结合被广泛应用于沙漠治理领域&#xff0c;为解决沙漠化问题提供了全新的思路和解决方案。 近日&#xff0c;黄河“几字弯”北岸的内蒙古自治…

word打字后面的字消失是怎么回事

在使用Microsoft Word进行文档编辑时&#xff0c;很多用户可能会遇到一个令人困惑的问题&#xff1a;当在文档中打字时&#xff0c;后面的字却莫名其妙地消失了。这种情况不仅影响了编辑效率&#xff0c;还可能导致重要数据的丢失。那么&#xff0c;这一现象背后的原因是什么&a…

JVM3_数据库连接池虚引用ConnectionFinalizerPhantomReference引起的FullGC问题排查

背景 XOP服务运行期间&#xff0c;查看Grafana面板&#xff0c;发现堆内存周期性堆积&#xff0c;Full GC时间略长&#xff0c;需要调查下原因 目录 垃圾收集器概述 常见的垃圾收集器分区收集策略为什么CMS没成为默认收集器 查看JVM运行时环境分析快照 PhantomReference虚引用…

深度学习目标检测】二十二、基于深度学习的肺炎检测系统-含数据集、GUI和源码(python,yolov8)

肺炎尽管很常见&#xff0c;但准确诊断是一项困难的任务。它要求训练有素的专家对胸部X光片进行检查&#xff0c;并通过临床病史&#xff0c;生命体征和实验室检查进行确认。肺炎通常表现为胸部X光片上一个或多个区域的阴影(opacity)增加。但是&#xff0c;由于肺部有许多其他状…

每日OJ题_链表①_力扣2. 两数相加

目录 力扣2. 两数相加 解析代码 力扣2. 两数相加 2. 两数相加 难度 中等 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个…

二维码门楼牌管理系统应用场景:数据管理的智慧新选择

文章目录 前言一、数据管理部门的智慧工具二、助力决策制定与优质服务提供三、二维码门楼牌管理系统的优势四、展望未来 前言 随着科技的飞速发展&#xff0c;二维码门楼牌管理系统正逐渐成为城市管理的智慧新选择。该系统不仅提升了数据管理效率&#xff0c;还为政府和企业提…

python并发编程:阻塞IO

阻塞IO&#xff08;blocking IO&#xff09; 在Linux中&#xff0c;默认情况下所有的socket都是blocking&#xff0c;一个典型的读操作流程大概是这样&#xff1a; 当用户进程调用了recvfrom这个系统调用&#xff0c;kernel就开始了IO的第一个阶段&#xff1a;准备数据。对于…

Python编程作业五:面向对象编程

目录 一、类的定义和方法 二、图书管理系统 一、类的定义和方法 定义一个学生类&#xff08;Student&#xff09;&#xff0c;包括学号(id)、姓名(name)、出生日期(birthday)和分数(score)4个属性&#xff0c;其中出生日期是私有属性&#xff0c;不能被外界直接访问。该类应具…

力扣每日一题 找出字符串的可整除数组 数论

Problem: 2575. 找出字符串的可整除数组 文章目录 思路复杂度Code 思路 &#x1f468;‍&#x1f3eb; 灵神题解 复杂度 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( 1 ) O(1) O(1) Code class Solution {public int[] divisibilityArray(String word, int m){in…