【JavaEE】通过Linux部署Web项目到云服务器上

news2024/9/17 7:18:06

一.配置部署所需的环境.

1.1 什么是部署?

  • 要想知道什么是部署, 就要先了解我们在日常开发的过程中所设计到的几种环境:
    • 开发环境: 软件开发环境指的是开发人员在创建、测试和部署软件应用程序时所需的一系列硬件、软件、工具和流程的集合。它是为了支持软件开发过程而构建的基础设施.
    • 测试环境: 测试环境是专门为软件测试工作搭建的环境,用于模拟真实生产环境以验证软件的功能和性能。
    • 生产环境: 生产环境是软件正式发布并对外提供服务的环境,用于面向最终用户的实际使用.
  • 部署: 把程序安装到生产环境上, 这个过程称为 “部署”. 也叫 “上线”. 一旦程序部署成功, 那么这个程序就能被外网中千千万万的普通用户访问到. 当然,如果程序有 BUG, 这个 BUG 也就被千千万万的用户看到了. 部署过程至关重要, 属于程序开发中最重要的一环. 一旦部署出现问题, 极有可能导致严重的事故(服务器不可用之类的问题). 为了防止部署出错, 一般公司内部都有一些自动化部署工具(如 Jenkins 等). 当前我们在学习阶段先使用手工部署的方式来完成部署.

1.2 环境配置.

  • 程序正常运行, 需要保证环境和程序都要正确, 我们需要先设置环境
  • 实际工作中, 开发环境, 测试环境以及生产环境的配置都是不一样的. 比如mysql的用户名和密码
    我们可以针对不同的环境, 设置不同的配置

多平台文件配置

  1. application-dev.yml (开发环境的配置)
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/java_blog_spring?characterEncoding=utf8&useSSL=false
    username: root
    password: 120348
    driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
  configuration:
    map-underscore-to-camel-case: true #配置驼峰自动转换
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句
  mapper-locations: classpath:mapper/**Mapper.xml
# 设置日志文件的文件名
logging:
  file:
    name: spring-blog.log
  1. application-prod.yml (生产环境的配置)
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/java_blog_spring?characterEncoding=utf8&useSSL=false
    username: root
    password: YT@yyds.666
    driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
  configuration:
    map-underscore-to-camel-case: true #配置驼峰自动转换
  mapper-locations: classpath:mapper/**Mapper.xml
# 设置日志文件的文件名
logging:
  file:
    name: spring-blog.log
  1. application.yml (主配置文件, 用于选择在不同的环境下,选择不同的配置文件)
spring:
  profiles:
    active: @profile.name@

在pom中添加标签,方便我们选择不同的环境配置:

	<profiles>
        <profile>
            <id>dev1</id>
            <properties>
                <C>dev</C>
            </properties>
        </profile>
        <profile>
            <id>prod1 </id>
            <properties>
                <profile.name>prod</profile.name>
            </properties>
        </profile>
    </profiles>

在这里插入图片描述

二.构建项目并打包.

  • 在本地使用maven进行打包
    • 如果Test代码中有与环境配置相关的操作(比如数据库相关的操作), 打包会失败, 点击下图①处的图标, 可以跳过测试
    • 点击clean->package
      在这里插入图片描述
      在这里插入图片描述

三.上传Jar包到服务器, 并运行

3.1 上传Jar包到服务器

  1. 将打好的Jar包, 直接拉到Linux的终端中
    如果使用其他客户端,不支持文件的上传, 需要借助lrzsz命令
    • 上传文件
      sz filename
    • 下载文件
      rz
  • 问题: 如果执行上述命令之后, 提示 Command ‘XX’ not found , 表示当前云服务器未安装lrzsz
    命令, 需要先进行安装
    • 安装lrzsz
      apt-get install lrzsz

在这里插入图片描述

在这里插入图片描述

  1. 运行程序.
    • 命令: nohup java -jar blog-spring-0.0.1-SNAPSHOT.jar &
      nohup : 后台运行程序. 用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行.
    • 语法格式:
      nohup Command [ Arg … ] [ & ]
    • 参数说明:
      • Command:要执行的命令。
      • Arg:⼀些参数,可以指定输出文件
      • &:让命令在后台执行,终端退出后命令仍旧执行
    • 比如:
      nohup java -jar blog-0.0.1-SNAPSHOT.jar >/logs &
      Linux 可以通过 > 把需要输出的内容写到指定文件中. 这样的操作称为 “重定向”.

3.2 开放服务器端口号.

  • 如果外网需要访问该服务, 需要先服务器防火墙开放对应的端口号, 本着服务器安全的原则,云服务器上的端口非必要不开启. 比如常见端口号: 数据库 3306 , Redis 6379, 尽可能避免开放, 而是采用其他方式来连接, 比如配置隧道的方式

  • 以阿里云为例子:
    在这里插入图片描述

在这里插入图片描述

3.3 杀掉进程.

如果我们需要重启服务, 或者重新部署等, 都需要先停止之前的服务.

  1. 查看当前服务的进程
    ps -ef|grep java

  2. 杀掉进程
    kill -9 PID

四.常见问题.

  • 一个程序的正常运行, 需要程序的正确和环境的正确. 同样的代码在Windows上可以运行成功, 不一定在Linux上运行成功. 不同的系统对代码的理解和支持是不同的. 比如Windows系统对MySQL不区分大小写, Linux区分大小写服务不能正常访问的原因有很多, 主要分以下几个方面
    1. 服务未启动
      a. 使用 ps -ef|grep java 查看程序是否在运⾏
      b. 使用 curl http://127.0.0.1:8080/blog_login.html 看下是否有返回html页面,
      如果有返回, 说明程序启动成功了, 考虑端口未开放
      c. 如果未启动成功, 需要查看对应的日志, 根据原因来分析.
      i. 数据库不存在
      ii. 表不存在(区分大小写)
      iii. 数据库密码不正确
      iv. Jdk 安装版本不对, 或者未安装
      v. mysql未设置密码
      vi. …
    2. http端口未开放
      检查云服务器防火墙/安全组是否开放相应端⼝(如8080)

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

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

相关文章

各路数据库的第一

各路第一 上周很多朋友都在发这些。朋友圈被刷屏了。 而且几乎都是同一时间。一般来说文无第一武无第二&#xff0c;怎么全是第一&#xff1f; 后来了解到这是不同维度的。我想这大概和奥斯卡颁奖一样&#xff0c;最佳导演、最佳男主角、最佳女主角、最佳音乐等等有20多个维度…

FPGA开发——LED流水灯实现先从左往右流水,再从右往左流水

一、概述 我们在设计完一个方向的流水灯的设计时&#xff0c;总是会想实现让流水灯倒着流水回去的设计&#xff0c;这里我也是一样&#xff0c;实现这种设计的方法有很多种&#xff0c;其中就有直接使用case语句将所有可能包含进去编写&#xff0c;这种设计方法是最简单的&…

JavaFX布局-TitledPane

JavaFX布局-TitledPane 常用属性textcontentgraphicexpandedcollapsibleanimated 实现方式Javafxml 提供了一个可折叠的标题栏和一个内容区域内容区域可以嵌套其他布局 常用属性 text 设置标题 titledPane.setText("测试标题");content 内容区域&#xff0c;可以单…

【C++进阶学习】第十弹——哈希的原理与实现——链地址法的原理与讲解

开放地址法&#xff1a;【C进阶学习】第九弹——哈希的原理与实现——开放寻址法的讲解-CSDN博客 前言&#xff1a; 哈希的整体思想就是建立映射关系&#xff0c;前面的开放地址法的讲解中&#xff0c;也对哈希的原理做了详细的讲解&#xff0c;今天就来讲解一下实现哈希的另一…

系统移植(八)u-boot源码解析(未整理)

文章目录 一、分析make <board_name>_defconfig执行过程&#xff08;一&#xff09;1. 1. 分析Makefile文件&#xff0c;分析Makefile文件的规则中目标为"<board_name>_defconfig", &#xff08;二&#xff09;&#xff08;三&#xff09; 二、分析make …

【精通Redis】Redis命令详解

引言 Redis是一个内存数据库&#xff0c;在学习它的内部原理与实现之前&#xff0c;我们首先要做到的就是学会使用&#xff0c;学会其丰富的命令操作。 一、字符串 Redis的字符串类型之前笔者的一篇入门介绍中曾经说过&#xff0c;不是简单的只存人可以阅读的字符串&#xf…

JavaWeb笔记_FilterListener

一.过滤器 1.1 过滤器概述 过滤器主要用来拦截目标资源&#xff08;静态资源或动态资源&#xff09;的请求和响应 &#xff08;类似地铁的安检&#xff09; 我们访问动态或静态资源都要通过URL访问&#xff1a;http://localhost:8080/... 所以过滤器本质上拦截的是URL 1.2 过滤…

select ... for update中锁等级转化

一、结论 select ... for update 除了查询功能&#xff0c;还实现了加锁机制&#xff0c;是一种悲观锁。根据是否使用了主键和索引&#xff0c;决定锁等级是表锁还是行锁。如果采用了&#xff0c;则是行锁&#xff0c;否则是表锁。 二、实例 前提条件&#xff1a;将事务自动…

你敢信?1万块存上5年,到手只有900!

1996年的夏天你走进银行&#xff0c;会看到五年期整存整取的利息&#xff0c;可能高达14%左右。1万块存上5年&#xff0c;到手利息高达——7000元。 今天呢&#xff1f;同样的存款方式&#xff0c;5年后&#xff0c;能拿到的利息只有900元。靠吃银行利息就能躺平的年代&#xf…

分布式事务解决方案(一) 2PC、3PC、TCC、Sega

目录 1.绪论 2.2PC 2.1 基本原理 2.1.1 组成 2.1.2 步骤 1.prepare阶段 2.commit阶段 2.2 2PC 存在的问题 2.2.1 阻塞问题 2.2.2 单点故障问题 1. 事务协调器宕机 2.部分数据不一致问题 2.资源管理器宕机 3. 事务协调器和资源管理管理器同时宕机 2.2 实现 2.2.1…

【AI落地应用实战】Amazon Bedrock +Amazon Step Functions实现链式提示(Prompt Chaining)

一、链式提示 Prompt Chaining架构 Prompt Chaining 是一种在生成式人工智能&#xff08;如大型语言模型&#xff09;中广泛使用的技术&#xff0c;它允许用户通过一系列精心设计的提示&#xff08;Prompts&#xff09;来引导模型生成更加精确、丰富且符合特定需求的内容。 P…

freertos-HAL库-STM32Cubemax生成

打开cubemax选好型号配置RCC&#xff08;外部高速时钟&#xff09;这里查看原理图&#xff0c;我们把按键设为输入&#xff0c;led设为输出创建两个新任务&#xff08;default是系统创建的&#xff09;配置时钟&#xff0c;这里HSE是外部高速时钟&#xff0c;HSI是内部的&#…

打卡第27天------贪心算法

再次祈祷上帝,提前预备好自己,希望我可以在机会来临的时候,抓住机会,成功上岸! 一、理论基础 什么是贪心?例如:有一堆钞票,你可以拿走十张,如果想达到最大的金额,你要怎么拿? 你肯定是每次拿最大的,最终结果就是拿走最大数额的钱了。 每次拿最大的就是局部最优,…

【Python从入门到进阶】61、Pandas中DataFrame对象的操作(二)

接上篇《60、Pandas中DataFrame对象的操作&#xff08;一&#xff09;》 上一篇我们讲解了DataFrame对象的简介、基本操作及数据清洗相关的内容。本篇我们来继续讲解DataFrame对象的统计分析、可视化以及数据导出与保存相关内容。 一、DataFrame的统计分析 在数据分析和处理中…

Selenium Java中的isDisplayed()方法

isDisplayed&#xff08;&#xff09;方法用于确定元素是否可见。本文将详细讨论 的WebElement接口isDisplayed&#xff08;&#xff09;方法。 方法声明- boolean isDisplayed&#xff08;&#xff09;它能做什么&#xff1f;此方法用于判断元素是否显示。这个方法节省了我们…

EasyExcel入门

目录 一、文章简介 二、概念 1.EasyExcel是什么&#xff1f; 2.EasyExcel 能用在哪里&#xff1f; 3.为什么要选用EasyExcel解析excel&#xff1f; 4.如何使用EasyExcel&#xff1f; 三、EasyExcel快速入门 1.环境搭建 2.简单写excel 代码示例 TestFileUtil Employe…

C++(week14): C++提高:(二)C++11线程库

文章目录 一、线程1.C11线程库的概述2.构造函数3.线程启动: 线程入口函数的传递方式4.线程终止5.线程状态6.获取线程id&#xff1a;get_id() 二、互斥锁1.什么是互斥锁2.头文件3.常用函数接口 三、lockguard与unique_lock1.lock_guard2.unique_lock(1)概念(2)函数接口 3.原子数…

Python脚本:使用PyPDF2给一个PDF添加上页数/总页数标签

一、实现代码 import PyPDF2 from PyPDF2 import PdfWriter from PyPDF2.generic import AnnotationBuilder# 指定输入和输出pdf pdf_path rC:\Users\ASUS\Desktop\temp\xxxx.pdf out_path rC:\Users\ASUS\Desktop\temp\xxxx2.pdf# 创建 PdfWriter 对象 writer PdfWriter()…

Python转换Excel文件为SVG文件

SVG&#xff08;Scalable Vector Graphics&#xff09;是一种基于XML的矢量图像格式。这种格式在Web开发和其他图形应用中非常流行&#xff0c;提供了一种高效的方式来呈现复杂的矢量图形。如果我们需要在网页中嵌入Excel表格&#xff0c;或是直接使用Excel工作表制作网页&…