文章目录
0. 版本信息
- tomcat版本:9.0.62.0
终端进入tomcat文件夹,输入sudo ./bin/version.sh
即可查看 - Ubuntu版本:18.04
- mysql版本:8.0.28
- vue3
前后端不分离方式下在tomcat9中部署war包。选择部署到根目录。
tomcat运行在端口8848
项目名:LabWebMS
1. 在服务器上安装java
https://zhuanlan.zhihu.com/p/137114682
- 安装
xhf@computer24:~$ sudo apt update
xhf@computer24:~$ sudo apt install openjdk-17-jdk
xhf@computer24:~$ java -version
- JAVA_HOME环境变量
xhf@computer24:~$ sudo update-alternative --config java //找到java安装路径
xhf@computer24:~$ sudo /usr/lib/jvm/java-17-openjdk-amd64/bin/jlink --module-path jmods --add-modules java.desktop --output jre //导出jre
xhf@computer24:~$ sudo vim /etc/profile //修改配置文件,这是系统配置文件,所有用户都可见
在文件最后添加:
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=.:${JAVA_HOME}/bin:$PATH
xhf@computer24:~$ source /etc/profile //使配置生效
xhf@computer24:~$ echo $JAVA_HOME //打印输出
2. 安装mysql
https://blog.csdn.net/weixx3/article/details/80782479
xhf@computer24:~$ sudo apt-get install mysql-server //安装
xhf@computer24:~$ sudo mysql_secure_installation //初始化配置
xhf@computer24:~$ systemctl status mysql.service //检查是否成功
//如果出现绿色的active (running)则代表成功
我的配置:不需要验证密码插件,即密码可以很简单;密码:123456;不移除匿名用户;仅本机可以访问,不允许远程访问;移除test数据库
升级mysql方法:
- 在官网下载.deb文件
- 将文件上传到服务器
- 依次执行以下命令
sudo dpkg -i mysql-apt-config_0.8.22-1_all.deb //将第一个选项改成8.0然后选择ok
sudo apt-get update
sudo service mysql stop
sudo apt-get install mysql-server //这一步将选第二个选项(不要强密码)
sudo service mysql start
sudo mysql -v
3. 数据库迁移
低版本数据库可以迁移到高版本,但是高版本迁移到低版本可能会出错。
- 使用Navicat将labdb转储,生成labdb.sql文件
- 将labdb.sql上传到服务器
xhf@computer24:~$ sudo apt install lrzsz //安装rz sz工具
xhf@computer24:~$ mkdir labMS
xhf@computer24:~$ cd labMS
xhf@computer24:~$ rz //选择labdb.sql文件进行上传,上传位置就是当前目录
- 在服务器上创建数据库
mysql -u root -p
create database labdb;
show databases;
use labdb;
source /home/xhf/labMS/labdb.sql;
在导入的时候遇到了问题,源数据库版本是8.0.27,服务器上mysql版本安装的是5.x,从高版本数据库导入到低版本数据库时会遇到错误。因此尝试升级服务器上数据库,再进行导入。
在数据库导入完成之后,可以用本地Navicat对远程的mysql数据库进行一个连接测试。
使用本地Navicat连接远程mysql服务器,发现报1251错误,这是因为MySQL 8.0的加密方式和5.0不一样,需要更改加密方式。
xhf@computer24:~$ sudo mysql -u root -p //进入mysql
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER; //更改加密方式
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456'; //更改密码
mysql> FLUSH PRIVILEGES; //刷新
完成了上面操作之后,就可以成功用Navicat连接远程数据库了,可以看到里面有之前创建的数据库以及导入进去的数据。
4. 安装Tomcat
参考这个网站进行安装,全程无坑。
我安装的版本,9.0.62
根据上面网站做了1到4步,和第六步
查看JAVA_HOME的方式,终端输入echo $JAVA_HOME
我的tomcat地址:/opt/tomcat/latest
修改tomcat默认端口为8848(与应用保持一致)
为tomcat管理页面添加用户名和密码:https://blog.csdn.net/chenghaibing2008/article/details/79848845
修改conf/tomcat-users.xml
,在倒数第二行添加如下两行
xhf@compute24:/opt/tomcat/latest$ sudo vim logs/catalina.2022-04-12.log
<role rolename="manager-gui"/>
<user username="xhf" password="123456" roles="manager-gui"/>
再输入http://xxxx:8848/manager/html即可看到服务器tomcat的管理页面(将xxxx换成你的服务器ip)
5. 项目打包
1. vue项目打包
在终端输入npm run build
进行打包。生成的静态文件在dist文件夹下面,将dist的所有子目录及文件,全部复制到maven项目的resource/static
目录下即可。
如果你不想将项目部署到根目录下,前端代码需要进行一些修改,看最下面。
2. spring boot项目打包
1. 首先指定打包类型为war,以及打包的名称为项目名
修改pom.xml:在project标签下加入<packaging>war</packaging>
,在build标签下加入<finalName>LabWebMS</finalName>
2. 将内置的tomcat移除出去(实际上这一步做不做都行)
修改pom.xml:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 添加如下标签,表示去除内置的tomcat -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 添加如下依赖,否则打包会报错-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<scope>provided</scope>
</dependency>
修改启动类:将启动类继承SpringBootServletInitializer
,即
@SpringBootApplication
public class LabWebApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(LabWebApplication.class, args);
}
}
3. 打包
终端输入mvn install
,导出的包在target目录下
6. 部署在tomcat根目录下
有两种方式部署,推荐第二种方式
第一种方式:
1、清空ROOT目录
sudo rm -rf /opt/tomcat/latest/webapps/ROOT/*
2、将war包解压到ROOT目录下
sudo unzip LabWebMS.war -d /opt/tomcat/latest/webapps/ROOT
3、重启tomcat
sudo systemctl restart tomcat
第二种方式:
1、仍然清空ROOT目录,同上
2、配置conf/server.xml
在Host节点下新增一个Context节点
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Context path="/" docBase="LabWebMS" debug="true" reloadable="true" />
<!-- SingleSignOn valve, share authentication between web applications
Documentation at: /docs/config/valve.html -->
<!--
<Valve className="org.apache.catalina.authenticator.SingleSignOn" />
-->
<!-- Access log processes all example.
Documentation at: /docs/config/valve.html
Note: The pattern used is equivalent to using pattern="common" -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
3、在本地浏览器上打开tomcat管理程序
浏览器输入http://xxxx:8848/manager/html
,然后使用管理界面上传已经打包好的war文件即可。
7. 我遇到的一些坑
- 由于jdk11 之后下载的jdk包不显示的包含jre,但是很多教程都会让我们配置jre的环境,因此为了安全起见,还是手动导出jre,然后配置jre环境。实际上可能不需要进行配置也可以使用。
- 安装mysql的时候最好和你本地的mysql版本一致,或高于你本地的版本,否则之后导入数据库的时候可能会出现问题(因为只会向下兼容)。当然也可以在服务器上手动创建数据库。
- 我在部署的时候遇到了一个问题,浪费了我一个星期之久,就是在本地运行得好好的,但是部署到数据库的时候。用postman测试后端接口一直报500异常(没有别的异常类型进行对应的时候就会报500异常),一直以为是tomcat配置错误或者我代码哪里配置错了。实际上是后端连接服务器上的数据库出现了问题。mysql8.0之后的安全性提高了。我遇到这个错误是因为MySQL 8.0的加密方式和5.0不一样,导致后端连接不上数据库所以一直报500异常。只需要修改数据加密方式配置就能解决这个问题。所以一个好的习惯是,在部署项目之后,先检查服务器和数据库能不能连上。
- tomcat有自己自带的logger,因此不需要额外使用如log4j2这样的logger。tomcat的日志在logs/catalina.log下查看。
8. 需要注意的地方
- 由于我的前端是个单界面应用,因此实际上所有前端请求都会报404错误,因此需要在后端进行配置,将错误页面映射到index.html上
创建error目录,新建ErrorPageRegistrar如下:
@Component
public class ErrorPageRegistrar implements org.springframework.boot.web.server.ErrorPageRegistrar {
@Override
public void registerErrorPages(ErrorPageRegistry registry) {
ErrorPage error404 = new ErrorPage(HttpStatus.NOT_FOUND, "/index.html");
registry.addErrorPages(error404);
}
}
- 因为我选择在将项目运行在跟路径,因此不需要修改配置,如果不选择在根目录下进行配置的话,还需要进行以下步骤:
由于我使用的是history模式,且使用前后端不分离部署在tomcat下,项目名叫LabWebMS。因此需要配置publicPath以及路由器的base属性。
在router/index.js文件夹下,为router添加base属性,如下所示
const router = createRouter({
history: createWebHistory('/LabWebMS/'),
routes,
});
在vue.config.js文件中,为module.exports添加一条属性:publicPath: '/LabWebMS/',