本文最后更新于:3 个月前
                  
                
              
            
            
              
                
                
前言 
本文介绍部署项目的常用方法,以及详细的实操流程 均以我个人开发的伙伴匹配系统为例,体验如何快速部署项目  
实操 本地 IDEA 部署 使用 maven 打个 war 包,报了一连串的错误:(2024/03/26早) 
IDEA maven 未配置好,配置一下就行 
有依赖下载失败,换了新的版本解决了 
测试用例有错误,打包时直接忽略掉测试用例就行 
Cannot access defaults field of Properties问题,看下面 
 
Cannot access defaults field of Properties问题的解决-CSDN博客 
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>3.3.1</version>
        </plugin>
    </plugins>
</build>
有必要图文总结下这方面的经验了。
maven 打包、本地起 tomcat 服务器
多环境配置 
要部署项目到线上,首先就要配置多环境:测试环境(test)、开发环境(development)、生产环境(production)等  
前端 
在使用 vite 构建工具构建的前端框架中,项目的启动环境是由启动命令来区分的  
1 2 3 4 5 6 7 8 9 10 11 12 myAxios.interceptors .request .use (function  (config ) {console .log (import .meta .env .MODE );console .log (`我他妈发请求了${config} ` );return  config;function  (error ) {return  Promise .reject (error);
可以看到在本地启动项目时,项目的启动环境为开发环境(development) 执行以下命令来构建、打包项目,打包完成之后,项目目录下会出现一个 dist 目录,里面就是打包构建完成的项目代码:  
注意,serve是一个启动项目的工具,可以使用以下命令安装:  
可以看到,启动构建好的项目时,项目的启动环境为开发环境(production) 所以我们可以在全局请求拦截器中,可以实现:根据不同的项目环境,去请求不同的后端地址:  
1 2 3 4 5 6 7 8 const  myAxios = axios.create ({baseURL :import .meta .env .MODE  === "production" "http://120.55.62.195:8081/api" "http://localhost:8081/api" ,withCredentials : true ,
这就是前端项目的多环境配置了(2023/07/29午)  补充:Ant Design Pro也是我们常用的前端react框架,其多环境配置与vite构建的vue框架十分相似 二者的区别仅在于存储项目启动环境的变量名称不同:  
1 2 3 4 5 6 export const errorConfig: RequestConfig = {
这里再附上 Ant Design Vue 的多环境配置:(2023/12/25早)  
 
1 2 3 4 5 6 7 const  instance = axios.create ({baseURL :env .NODE_ENV  === 'production'  ? 'http://120.55.62.195:8101'  : 'http://localhost:8101' ,withCredentials : true ,timeout : 10000 ,
后端 配置文件 
我这个项目是基于SpringBoot开发的,后端多环境配置十分方便 只需要新增多个不同环境的配置文件,将来部署并启动项目时,只需指定启动环境即可 不同环境的配置文件需要不同的文件后缀名来区分,如下图所示:  
其中,application.yaml用来存放各配置文件中的公共配置,其余各环境配置文件中,主要有区别的有以下两点: 
依赖的环境地址 
服务器配置  
下面给出我在不同环境下的配置文件内容: application.yaml(公共配置)  
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 spring: application: name:  user-center session: timeout:  86640 store-type:  redis mvc: pathmatch: matching-strategy:  ANT_PATH_MATCHER server: port:  8081 servlet: context-path:  /api mybatis-plus: global-config: db-config: logic-delete-field:  isDelete  logic-delete-value:  1  logic-not-delete-value:  0  configuration: log-impl:  org.apache.ibatis.logging.stdout.StdOutImpl 
application-dev.yaml(开发环境配置)  
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 spring: application: name:  user-center datasource: driver-class-name:  com.mysql.cj.jdbc.Driver url:  jdbc:mysql://localhost:3306/memory username:  root password:  Dw990831 session: timeout:  86640 store-type:  redis redis: port:  6379 host:  localhost database:  0 mvc: pathmatch: matching-strategy:  ANT_PATH_MATCHER server: port:  8081 servlet: context-path:  /api 
application-prod.yaml(生产环境配置)  
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 spring: application: name:  user-center datasource: driver-class-name:  com.mysql.cj.jdbc.Driver url:  jdbc:mysql://localhost:3306/memory username:  root password:  Dw990831 session: timeout:  86640 store-type:  redis redis: port:  6379 host:  localhost database:  0 mvc: pathmatch: matching-strategy:  ANT_PATH_MATCHER server: port:  8081 servlet: context-path:  /api 
有关各个配置文件的加载优先级,可以在这篇博客中详细了解:  
直接启动 
利用IDEA工具,检验在各个环境下能否正确启动项目 这里有个问题,如果配置了多环境,直接run/debug项目会报如下错误:  
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ***************************to  configure a  DataSource: 'url'  attribute is not  specified and  no embedded datasource could be configured.to  determine a  suitable driver classthe  following:an  embedded database (H2, HSQL or  Derby), please put  it  on  the  classpath .to  be loaded from  a  particular profile you may need to  activate it  (no profiles are currently active).from  the  target VM, address: '127.0.0.1:8686' , transport: 'socket' with  exit code 1 
这是由于检测到多环境配置文件,需要具体指定项目在那个环境下启动,IDEA内可以如下操作:  
如上图所示,在指定启动环境后,我们的项目在prod(生产环境)下启动成功了  
运行jar包 
这里我们不在直接运行项目,而是先将项目打包成jar包,再运行jar包来启动项目 我们借助ODEA封装的Maven打包工具,一键打包,如下图所示:  
项目打包成功后,生成一个target目录,jar包就在该目录下,执行以下命令运行jar包来启动项目(IDEA/命令行下均可):  
1 java  -jar .\user-center-backend-0 .0 .1 -SNAPSHOT.jar --spring.profiles.active=prod
如上图所示,项目在prod(生产环境下)启动成功 至此,后端多环境配置完成(2023/07/04晚)  
项目部署 介绍 
我们完成了项目的多环境配置,并在本地检验了配置的正确性,那么接下来就要进行项目的部署上线了 部署上线当然需要服务器了,常见的作法当然是租用一台云服务器了 国内很多提供云服务的厂商:阿里云、腾讯云、百度云、亚马逊云、华为云等等,我们这里选用阿里云的ECS云服务器 这台云服务器的相关宝塔面板的安装、云数据库的配置均已完成,详见《宝塔面板:解放手动配置,轻松管理你的服务器》 下面我们正式进行项目的上线、部署  
原生部署 
这种部署方式很繁琐,从项目的打包到部署,所有的工具、依赖以及相关配置都是纯人工进行的,吃力不讨好 所以不建议使用这种方式进行部署项目,不过日后可以考虑操作一遍,再附上详细教程(2023/07/25午)  
宝塔面板部署 后端部署 
还是之前讲过的,部署项目首先要做的,便是正确配置该项目依赖的环境地址,将本地地址改为线上地址: 
打包项目,可以手动打包,也可以利用IDEA工具,方便快捷,最终生成一个jar包:  
成功登录到宝塔面板,在指定路径下上传刚刚打包好的 jar 包:  
选择项目的jar包路径,设置项目端口、项目jdk路径,编写项目执行命令(端口号、启动环境)  
这里如果运行不成功的话,检查项目执行命令是否正确(端口号、启动环境),再者就是检查 jdk是否成功安装、线上资源地址配置是否正确 有关阿里云服务器安装 JDK 和完成相关环境配置的内容,以及线上资源地址的配置流程、注意事项,详见《宝塔面板:解放手动配置,轻松管理你的服务器》 至此,伙伴匹配系统的后端部署成功  
前端部署 
上传成功后,在PHP项目下添加站点,填写可访问的服务器公网IP及其端口,或者一个可访问的域名,正确设置项目根目录路径:  
点击提交即可,宝塔面板已经自动启动了该项目,非常方便快捷高效 注意这里的端口号,一定要在对应服务器和宝塔面板中开放该端口号 至此,前端项目部署完成,一定要注意后端项目中,对新的前端请求地址作允许跨域请求处理:  
至此,Memory-伙伴匹配项目部署完成:(2023/07/29午)  
Docker容器部署 踩坑记录 java和javac版本不一致 
这个问题很常见,是java和javac版本不一致导致的 我们可以尝试检查一下java和javac版本,分别在命令行下输入以下两条命令:  
经查询,发现java版本为8,javac版本为11,为什么会这样呢? 我们配置的环境变量是没有问题的,只需要把path变量下的%JAVA_HOME%/bin变量上移到第一行,即可解决这个问题  
再次查看java和javac版本,发现版本一致,效果如下:  
到这里本应该结束了,但是我发现命令行下运行jar包已经没问题了,项目启动成功,但IDEA环境下却仍启动失败 原因是这样的:即使我们成功修改了 jdk 版本,但是在IDEA环境下,每个项目使用的 jdk 版本仍可能未改变 如下图所示: 我们可以在此修改项目所使用的 jdk 版本,使之与全局 jdk 版本一致  
线上MySQL数据库和Redis的安装配置 
我们一直在反复强调,项目部署中,最重要的当属线上资源地址的配置,而常用的MySQL数据库和Redis配置则更加重要 我们常用的项目部署经常采用宝塔Linux部署方案,所以这部分内容会详细讲解在该方案下的MySQL数据库和Redis配置的要点 这里的介绍比较冗长和细致,所以我认为将这部分内容同样将收录在《宝塔面板:解放手动配置,轻松管理你的服务器》一文中  
宝塔安装配置MySQL 
今天从早到晚,花了整整一天时间,成功部署了伙伴匹配系统的后端,时间大多花在了MySQL和Redis的安装配置上了 有关项目部署的详细流程,可以在《揭秘项目部署上线之路:流程、挑战与解决方案》一文中了解 宝塔面板安装MySQL是很简单的:在软件商店挑选安装对应版本的MySQL即可 然后新建数据库:  
注意这里新增数据库的选项:数据库名、用户名、密码、访问权限和所属服务器 这里的所属服务器默认只能选本地服务器,即你所使用的这台计算机 那我希望将这个数据库添加至我的这台云服务器上,与项目配置保持一致,保证将来项目部署上线时的正常访问 那我们开始着手添加远程服务器吧:  
注意这里的管理员名称和管理员密码,管理员名称默认是root,而密码是登录MySQL时使用的密码: 我们可以在这里查看和修改管理员密码:  
就是在这里,我在云服务器和面板都开放了3306端口的前提下,添加远程服务器的时候,这玩意儿一直报错:  
1 Access  denied for  user  'root' @'localhost'  (using  password : YES)
上面是这个报错出现的原因,简单来说就是你输入的的用户名、密码无误,但全新安装的MySQL默认没有授予给任何用户登录权限 其实这个问题很常见,解决办法很简单,依次执行以下命令:  
1 ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER; #修改加密规则
1 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'; #更新一下用户的密码
1 alter user 'root'@'localhost' identified by '123fzw'; #重置密码
这时,就可以顺利添加上远程服务器了 我们在本地使用 SQLyog 工具来尝试连接下该MySQL数据库:  
这里就不用多讲了吧,填写正确的连接名、服务器地址、用户名、密码、端口号,尝试连接:  
连接成功!至此,宝塔安装MySQL的全流程已经讲述完毕(2023/07/25晚)  
宝塔安装配置Redis 
宝塔安装Redis也很简单,在软件商店里找到对应版本的Redis即可一键安装并成功启动 我要讲述的是,在Java项目部署过程中,遇到的有关远程服务器Redis配置有误而造成的项目部署失败的问题 我在使用宝塔面板的网站服务多次部署Java项目无果后,尝试在终端手动部署,结果发现这样的报错:  
1 2 3 4 5 redis: port:  6379 host:  120.55 .62 .195 database:  0 
看报错信息确定,由于项目中的Redis配置根本不存在,导致Redis访问失败,项目跑不起来,那就在宝塔安装一个Redis就行了 在成功安装了 Redis 后,我尝试添加远程服务器:  
在输入正确的服务器地址、数据库端口和密码后,尝试连接,却提示这样的报错:  
1 [ERR] AUTH <password > called  without  any  password  configured for  the default  user . Are you sure your configuration  is  correct?
什么意思呢?当然是全新安装的Redis默认是不设置连接密码的,而我正在尝试使用用户名、密码连接Redis 那就着手进行Redis的具体配置了:  
如上图所示,配置可访问Redis的IP限制、绑定端口、设置密码等等,再进行添加远程服务器,成功添加 既然远程服务器配置完成了,此时在宝塔面板再次部署项目肯定会出错:因为我们设置了Redis连接密码,而项目中仍未配置 那么回到项目源码中,配置 Redis 和 RedissonConfig:  
1 2 3 4 5 6 redis: port:  6379 host:  120.55 .62 .195 database:  0 password:  Dw990831 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 **@author  邓哈哈2023 /4 /18  20 :36 1.0 @Configuration @ConfigurationProperties(prefix = "spring.redis") @Data public  class  RedissionConfig  {private  String host;private  String port;private  String password;private  Integer database;@Bean public  RedissonClient redissonClient ()  {Config  config  =  new  Config ();String  redisAddress  =  String.format("redis://%s:%s" , host, port);return  Redisson.create(config);
成功部署伙伴匹配系统后端!太感动了(2023/07/25晚)  
经验总结