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

news2024/12/22 7:41:49

接上次博客: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=false
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver

mybatis:
  configuration: # 配置打印 MyBatis⽇志
    #    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    map-underscore-to-camel-case: true #配置驼峰⾃动转换
  mapper-locations: classpath:mapper/**Mapper.xml
  
  logging:
    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.coloradmin.cn/o/1498872.html

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

相关文章

【自然语言处理】NLP入门(五):1、正则表达式与Python中的实现(5):字符串常用方法:对齐方式、大小写转换详解

文章目录 一、前言二、正则表达式与Python中的实现1.字符串构造2. 字符串截取3. 字符串格式化输出4.字符转义符5. 字符串常用函数函数与方法之比较 6. 字符串常用方法1. 对齐方式center()ljust()rjust() 2. 大小写转换lower()upper()capitalize()title()swapcase() 一、前言 本…

maven项目结构管理统一项目配置操作

一、maven分模块开发 Maven 分模块开发 1.先创建父工程&#xff0c;pom.xml文件中&#xff0c;打包方式为pom 2.然后里面有许多子工程 3.我要对父工程的maven对所有子工程进行操作 二、解读maven的结构 1.模块1 <groupId>org.TS</groupId><artifactId>TruthS…

Java基于微信小程序的医院挂号系统(V2.0),附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

ThreadLocal, InheritableThreadLocal和TransmittableThreadLocal

ThreadLocal, InheritableThreadLocal和TransmittableThreadLocal ThreadLocal(TL) 后续部分地方会使用ThraedLocal简称为TL 什么是TL? ThreadLocal是Java中的一个类, 也称为线程本地变量, 它提供了线程局部变量的功能。每个ThreadLocal对象都可以存储一个线程本地的变量副…

【数据结构】二、线性表:4.循环链表的定义及其基本操作(循环单链表,循环双链表的初始化、判空、判断头结点、尾结点、插入、删除)

文章目录 4.循环链表4.1循环单链表4.1.1初始化4.1.2判断单链表是否为空4.1.3判断p结点是否为循环单链表的表尾结点 4.2循环双链表4.2.1初始化4.2.2判断循环链表是否为空4.2.3判断结点p是否为循环双链表的表尾结点4.2.4双链表的插入4.2.5双链表的删除 4.循环链表 4.1循环单链表…

R语言:多值提取到点

ArcGIS中有相关工具实现多值提取到点的功能&#xff0c;在这里&#xff0c;我将使用R语言进行操作&#xff1a; library(dplyr) library(readxl) library(sf) library(raster)setwd("D:/Datasets") Bio <- stack(paste0("D:/Datasets/Data/worldclim2_1km/…

关于并发编程和并行

目录 前言: 并发编程: 1.并发编程的定义: 2. 并发编程的目的 2.1提高性能&#xff1a; 2.2增强响应性&#xff1a; 2.3资源利用&#xff1a; 3. 并发编程的实现方式 3.1多线程&#xff1a; 3.2多进程&#xff1a; 3.3异步编程&#xff1a; 3.4协程&#xff1a; 4. …

16、电源管理入门之驱动Runtime PM管理

目录 1. 框架介绍 1.1 为什么需要Runtime PM Framework? 1.2 系统框架图 2. Drivers 3. Runtime PM core 4. power domain framework 5. runtime pm的sysfs 6参考: Runtime PM管理也就是设备驱动里面的电源管理,即设备驱动结构体里面的struct dev_pm_ops,只控制设…

简明固体物理--晶体的形成与晶体结构的描述

简明固体物理-国防科技大学 chapter 1 Formation of Crystal Contents and roadmapQuantum Mechanics and atomic structureElectronsOld quantum theoryMethod of Quantum MechanicsDistributing functions of micro-particles BindingCrystal structure and typical crystal…

【打工日常】使用docker部署IT运维管理平台CAT

​一、CAT介绍 CAT是一个专为 IT 运维从业者打造的一站式解决方案平台&#xff0c;包含资产管理、工单、工作流、仓储等功能模块。 本项目是celaraze/chemex重构版&#xff0c;原项目chemex名称弃用&#xff1b;CAT采用全新架构设计&#xff0c;大量提升使用体验的细节&#xf…

Tensorflow实现手写数字识别

模型架构 具有10个神经元&#xff0c;对应10个类别&#xff08;0-9的数字&#xff09;。使用softmax激活函数&#xff0c;对多分类问题进行概率归一化。输出层 (Dense):具有64个神经元。激活函数为ReLU。全连接层 (Dense):将二维数据展平成一维&#xff0c;为全连接层做准备。展…

Solidworks界面左边FeatureManager/设计树/模型树/树区域/零件树/零件栏不见了

Solidworks界面左边FeatureManager/设计树/模型树/树区域/零件树/零件栏不见了&#xff0c;按F9还原/隐藏&#xff0c;有的笔记本按FnF9

Koa: 打造高效、灵活的Node.js后端 (介绍与环境部署)

在上一篇文章中&#xff0c;我们了解了Node.js的基础知识&#xff0c;今天我们将进一步学习Node.js 较新的一个轻量级Web框架Koa&#xff0c;一起创建NodeJS后端服务器吧&#xff01; 一、介绍 Koa是一个新生代Node.js Web框架&#xff0c;由Express原团队成员开发&#xff0c…

大模型笔记:最少到最多提示过程 (Least to Most prompting, LtM)

LEAST-TO-MOST PROMPTING ENABLES COMPLEX REASONING IN LARGE LANGUAGE MODELS 2023 ICLR 1 概述 进一步发展维链提示过程 (CoT prompting) 分为两个阶段&#xff1a; 第一阶段&#xff1a;向语言模型提出查询&#xff0c;将问题分解成子问题。第二阶段&#xff1a;再次向语…

【数据结构】二、线性表:2.单链表的插入、删除、查找

文章目录 2.3插入2.3.1按位序插入2.3.2指定结点后插入2.3.3指定结点前插入 2.4删除2.4.1按位序删除2.4.2指定结点删除 2.5查找2.5.1按位查找2.5.2按值查找 2.3插入 2.3.1按位序插入 ListInsert(&L,i,e)&#xff1a;插入操作。在表L中的第i个位置上插入指定元素e。 带头结…

【MATLAB第98期】基于MATLAB的MonteCarlo蒙特卡罗结合kriging克里金代理模型的全局敏感性分析模型【更新中】

【MATLAB第98期】基于MATLAB的Monte Carlo蒙特卡罗结合kriging克里金代理模型的全局敏感性分析模型【更新中】 PS:因内容涉及较多&#xff0c;所以一时半会更新不完 后期会将相关原理&#xff0c;以及多种功能详细介绍。 麻烦点赞收藏&#xff0c;及时获取更新消息。 引言 在…

从《繁花》看图数据库的关联力!

2024年开年&#xff0c;最热的电视剧非《繁花》莫属。 这部现象级剧集不仅在全国掀起了一股怀旧潮&#xff0c;还引发了对故事情节和人物关系的深入探讨。 随着《繁花》的热播&#xff0c;不少观众为了更好地理解复杂的故事情节&#xff0c;开始自制人物关系图。 这些关系图以…

【Spring Boot 3】获取已注入的Bean

【Spring Boot 3】获取已注入的Bean 背景介绍开发环境开发步骤及源码工程目录结构总结 背景 软件开发是一门实践性科学&#xff0c;对大多数人来说&#xff0c;学习一种新技术不是一开始就去深究其原理&#xff0c;而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历…

java SSM科研管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM科研管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S…

OPC UA 学习笔记:状态机/有限状态机

有限状态机 有限状态机 &#xff08;FSM&#xff09; 是程序员、数学家、工程师和其他专业人士用来描述具有有限数量条件状态的系统的数学模型。 有限状态机的构成包括以下内容&#xff1a; 一组潜在的输入事件。与潜在输入事件相对应的一组可能的输出事件。系统可以显示的一…