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=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

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Polar 写shell

Polar 写shell 直接给了源码 还是没啥好说的&#xff0c;考点是die()死亡函数绕过之不同变量 **绕过原理&#xff1a; **通过base64解密或rot13解密使"<?php exit();"变为乱码&#xff0c;而传入的$content为base64编码&#xff0c;解码后为正常shell语句。通过…

Java数据结构-----List的介绍

目录 一、什么是List 二、List的常用方法 三、List的使用 一、什么是List 在集合框架中&#xff0c;List是一个接口&#xff0c;继承自Collection&#xff0c;其中&#xff0c;Iterable和Collection都是接口。 站在数据结构的角度来看&#xff0c;List就是一个线性表&#x…

Java定时调度:Timer类和TimerTask类

Java提供了多种方式来执行定时任务&#xff0c;其中使用Timer类和TimerTask类是一种简单而有效的方法。这篇教程将介绍如何使用Java的Timer类和TimerTask类来实现定时调度。 1. Timer类 Timer类用于安排指定的任务按指定的时间执行。它可以执行一次性任务&#xff0c;也可以按…

草稿111

peekmessage&#xff08;用于接受信息&#xff09; exmessage&#xff08;专门用于鼠标操作&#xff09; #include<graphics.h> #include<string> #include<vector> using namespace std; const int WINDOW_WIDTH 1280; const int WINDOW_HEIGHT 720;//封装…

VNC 与 虚拟机 保姆级 快速入门图文指导

Time: 2024年3月5日22:31:49 By[ V ]: MemoryErHero 重要的事情先说三遍: 1 虚拟机内无需安装 VNC-Viewer-7.0.1-Windows 2 虚拟机内无需安装 VNC-Viewer-7.0.1-Windows 3 虚拟机内无需安装 VNC-Viewer-7.0.1-Windows 1 VNC 图文安装 流程 ① VNC-Viewer-7.0.1-Windows.e…

ROS 2基础概念#5:执行器(Executor)| ROS 2学习笔记

在ROS 2中&#xff0c;Executor是一个核心概念&#xff0c;负责管理节点&#xff08;Node&#xff09;中的回调函数&#xff0c;如订阅消息的回调、服务请求的回调、定时器回调等。Executor决定了何时以及如何执行这些回调&#xff0c;从而在ROS 2系统中实现异步编程。 ROS 2 …

AD20软件使用指南:拼板操作与Gerber文件生成详解

文章目录 一、前言二、拼板1.创建新的PCB&#xff0c;用于放置拼板文件2.放置拼板阵列3.设置阵列信息4.V割拼板&#xff0c;放置工艺边和定位孔和光点5.完成拼板 三、生成Gerber文件1.输出Gerber文件2.选择单位和格式3.选择输出的图层4.生成Gerber文件5.生成钻孔文件 四、上传嘉…

Mybatis-Plus Mapper映射文件使用

介绍 MyBatis 的真正强大在于它的语句映射&#xff0c;这是它的魔力所在。由于它的异常强大&#xff0c;映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比&#xff0c;你会立即发现省掉了将近 95% 的代码。MyBatis 致力于减少使用成本&#xff0…

使用Navicat连接阿里云服务器上的MySQL数据库

打开navicat&#xff0c;连接如下&#xff1a; 服务器的默认密码是 root 连接时出现 使用 ls 查找 /etc/my.cnf ls /etc/my.cnf 用vi打开my.cnf&#xff1a; vi /etc/my.cnf看看是否有绑定本地回环地址的配置&#xff0c;如果有&#xff0c;注释掉下面这段文字&#xff1a;…

几何工具的使用

Geometry - Creation 创建几何 CogCreateCircleTool&#xff1a;创建圆CogCreateEllipseTool:创建椭圆CogCreateLineBisectPointsTool&#xff1a;带有两个点的平行线CogCreateLineParallelTool:在某一点创建某条线的平行线CogCreateLinePerpendicularTool:在某一点创建某条线…

数据备份:守护你的数字资产,安全无忧!

一、数据备份&#xff1a;数字时代的“保险箱” 在数字化日益盛行的今天&#xff0c;我们的工作、学习和生活都离不开各种电子设备。无论是电脑中的文档、图片&#xff0c;还是手机里的联系人、短信&#xff0c;都承载着我们的重要信息和回忆。然而&#xff0c;电子设备并非永…

Vector Search和专用Search Nodes:现已正式发布

我们非常高兴地推出了 Atlas Vector Search 和 Search Nodes 的正式发布版本 (GA)&#xff0c;为 Atlas 平台增添了更多价值。 自从在公开预览版中发布 Atlas Vector Search 和带有 Search Nodes 的专用基础架构以来&#xff0c;我们注意到&#xff0c;对于使用向量优化搜索节…

WEB自动化测试----------Webdriver API 的使用

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

0x04_数组_指针_字符串

数组 数组的定义与使用 数组是具有一定顺序关系的若干相同类型变量的集合体&#xff0c;组成数组的变量称为该数组的元素。 给出下面程序的输出&#xff1a; #include <iostream> using namespace std; int main() {int a[10], b[10];for(int i 0; i < 10; i) {a[…

LeetCode刷题---二叉树展开为链表

官方题解&#xff1a;LeetCode官方题解 解题思想&#xff1a; 当根节点不为空时&#xff0c;从二叉树根节点开始遍历 判断当前节点是否有左节点&#xff0c;如果不存在左节点&#xff0c;则当前节点向右移一位 如果存在左节点&#xff0c;创建辅助节点指向左节点&#xff0c;判…

万字长文讲解Golang pprof 的使用

往期好文推荐 ⭐️⭐️⭐️: # golang pprof 监控系列(1) —— go trace 统计原理与使用 # golang pprof监控系列&#xff08;2&#xff09; —— memory&#xff0c;block&#xff0c;mutex 使用 # golang pprof 监控系列(3) —— memory&#xff0c;block&#xff0c;mute…

第三百八十八回

文章目录 概念介绍使用方法示例代码 我们在上一章回中介绍了DateRangePickerDialog Widget相关的内容,本章回中将介绍Radio Widget.闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 我们在这里说的Radio Widget是指单选按钮&#xff0c;没有选中时是圆形边框&#x…

小白在VMware Workstation Pro上安装部署SinoDB V16.8

一、安装环境说明 CPU&#xff1a;2核或以上&#xff0c;内存&#xff1a;2G或以上&#xff1b;磁盘10G或以上&#xff1b;网卡&#xff1a;千兆 1.1检查服务器内存大小 命令&#xff1a;free -m 1.2检查服务器磁盘空间大小 命令&#xff1a;df -h 1.3检查服务器网络配置信息 命…

Python Tkinter GUI 基本概念

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd;如果停止&#xff0c;就是低谷&#xf…

VM内存结构和垃圾回收机制

引言 在计算机科学中&#xff0c;虚拟机&#xff08;VM&#xff09;是一个重要的概念&#xff0c;它允许程序在硬件平台之上运行。虚拟机模拟真实机器的行为&#xff0c;为程序提供了一个独立的运行环境。本文将深入探讨VM的内存结构和垃圾回收机制&#xff0c;以帮助读者更好…