发布jar包到服务器.wmv

解决问题.wmv

1.程序的打包与运行

我们在运行springboot项目的时候,必须要打开idea然后运行,非常不方便,实际开发中会把idea中的程序抽取出来,打成一个jar包发布到服务器上,然后运行这台服务器,这台服务器是可以长期运行的。
2023-05-25 16.31.00.gif

windows版

打包和运行

以之前的这个项目为例,我们目前是把他运行在idea上
image.png
打包依赖spring-boot-maven-plugin插件

  1. <build>
  2. <plugins>
  3. <plugin>
  4. <groupId>org.springframework.boot</groupId>
  5. <artifactId>spring-boot-maven-plugin</artifactId>
  6. <version>${spring-boot.version}</version>
  7. <executions>
  8. <execution>
  9. <id>repackage</id>
  10. <goals>
  11. <goal>repackage</goal>
  12. </goals>
  13. </execution>
  14. </executions>
  15. </plugin>
  16. </plugins>
  17. </build>

找到他的生命周期,选择test然后跳过单元测试,选择package打包,在打包的时候我们不希望执行单元测试,这里一定要跳过单元测试
image.png
image.png
打包执行完毕之后,在target目录中就会出现这个jar包
image.png
在文件夹中打开,打开终端
image.png
使用 java -jar jar包的名称运行jar包,则项目启动成功
image.png
测试一下,正常访问
image.png

端口冲突解决方案

查询端口
netstat -ano
# 查询指定端口
netstat -ano I findstr “端口号“
# 根据进程PID查询进程名称
tasklist I findstr “进程PID号“
# 根据PID杀死任务
taskkill -F -PID “进程PID号“
# 根据进程名称杀死任务
taskkill -f -t -im “进程名称“
image.png
我们的jar包一般不发布在window系统下,都发布在linux系统下,往下看

Linux版

环境准备

基于CentOS7,默认安装了jdk1.8和MySql57, MySql安装教程https://www.yuque.com/dongdong-eu2rj/crt3d8/wyrpuec7x2qsx7qw#yb7q2
把springboot程序打包的时候注意mysql的密码以及数据库名称调整到和linux中一致
使用navicat连接linux中的mysql服务,并准备好库和表
image.pngimage.png
因为要在linux中运行要保证数据库的密码以及数据库名和linux中的mysql一致,
image.png

上传和运行

跳过单元测试打包完毕之后
在linux的/usr/local目录下创建app文件夹

  1. mkdir /usr/local/app

把jar包上传到/usr/local/app目录下
image.png
执行 java -jar jar包名称 运行项目

  1. java -jar springboot06_SMP-0.0.1-SNAPSHOT.jar

image.png
在浏览器访问即可http://192.168.25.144:8080/pages/books.html 一切正常使用,注意访问使用http协议,不要使用https协议
image.png
但是目前这种启动方式会占用整个linux屏幕,属于前台启动,linux不可继续使用了,所以我们可以ctrl+c退出
使用nohup java -jar springboot06_SMP-0.0.1-SNAPSHOT.jar > dongdong.log 2>&1 &命令后台运行

  1. nohup java -jar springboot06_SMP-0.0.1-SNAPSHOT.jar > dongdong.log 2>&1 &

在后台启动jar包并把日志打印到dongdong.log日志文件中,启动一样好使

冬冬的知识加油站: nohup 英文全称 no hang up(不挂起),用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行。 1和2在Linux中的含义 在Linux系统中0 1 2是一个文件描述符: 标准的输入,输出和错误输出分别表示为STDIN,STDOUT,STDERR,也可以用0,1,2来表示。 整理成表格如下: 名称 代码 Linux 下文件描述符(Debian 为例) image.png 其中0表示键盘输入 1表示屏幕输出 2表示错误输出。 二、2>&1的含义 2>&1的含义:将标准错误输出重定向到标准输出。 注意:符号>&是一个整体,不可分开,分开后就不是上述含义了。 三、例子 1)cat test 2>&1 >file : 错误输出到终端,标准输出被重定向到文件file。 2)cat test >file 2>&1 : 标准输出被重定向到文件file,然后错误输出也重定向到和标准输出一样,所以也错误输出到文件file。 3) command >out.file 2>&1 & command >out.file 是将command的输出重定向到out.file文件,输出内容不打印到屏幕上,而是输出到out.file文件中。 2>&1 是将标准出错重定向到标准输出,因为标准输出已经重定向到了out.file文件,所以标准出错也输出到out.file文件中。 最后一个&, 是让该命令在后台执行。
通俗的说,就是把所有标准输出和标准出错都输出到out.file文件。

退出

在后台运行jar包的情况下,就不能ctrl+c退出了,而是需要通过ps -ef | grep “java -jar”查看运行的PID(进程ID)

  1. ps -ef | grep "java -jar"

image.png
使用kill -9 PID杀死进程

  1. kill -9 23946

重新查看,发现进程以杀死即为退出成功
image.png

HTTPS访问(选做)

如果想要使用https访问,可以先在自己项目中根目录下生成数字证书
生成命令如下:keytool -genkey -alias tomcathttps -keyalg RSA -keysize 2048 -keystore sang.p12 -validity 365
命令解释
• -genkey表示要创一个新的密钥。
• alias表示 keystore 的别名。
• keyalg表示使用的加密算法是RSA种非对称加密算法
• -keysize表示密钥的长度
• -keystore表示生成的密钥存放位直
• validity表示密钥的有效时间,单位为天
在cmd 窗口中直接执行如上命令,在执行的过程中需要输入密钥口令等信息,根据提示输入即可。命令执行完成后,会在当前用户目录下生成一个名为 sang.p12的文件
image.png

  1. server:
  2. port: 8080
  3. ssl:
  4. key-store: classpath:sang.p12
  5. key-alias: tomcathttps
  6. key-store-password: xzjyroot

image.png

因为SpringBoot不支持同时使用HTTP和HTTPS,所以我们可以写一个配置类 把http的80请求转发到https的8080

  1. package com.xuezhi.config;
  2. import org.apache.catalina.Context;
  3. import org.apache.catalina.connector.Connector;
  4. import org.apache.tomcat.util.descriptor.web.SecurityCollection;
  5. import org.apache.tomcat.util.descriptor.web.SecurityConstraint;
  6. import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
  7. import org.springframework.context.annotation.Bean;
  8. import org.springframework.context.annotation.Configuration;
  9. @Configuration
  10. public class TomcatConfig {
  11. @Bean
  12. TomcatServletWebServerFactory tomcatServletWebServerFactory(){
  13. TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory(){
  14. @Override
  15. protected void postProcessContext(Context context){
  16. SecurityConstraint constraint = new SecurityConstraint();
  17. constraint.setUserConstraint("CONFIDENTIAL");
  18. SecurityCollection collection = new SecurityCollection();
  19. collection.addPattern("/*");
  20. constraint.addCollection(collection);
  21. context.addConstraint(constraint);
  22. }
  23. };
  24. factory.addAdditionalTomcatConnectors(createTomcatConnector());
  25. return factory;
  26. }
  27. private Connector createTomcatConnector(){
  28. Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
  29. // 把http的80请求转发到https的8080
  30. connector.setScheme("http");
  31. connector.setPort(80);
  32. connector.setSecure(false);
  33. connector.setRedirectPort(8080);
  34. return connector;
  35. }
  36. }

image.png

总结:

Boot程序打包依赖SpringBoot对应的Maven插件即可打包出可执行的jar包
运行jar包使用java -jar命令
Windows与Linux下执行Boot打包程序流程相同,仅需确保运行环境有效即可

Linux安装MySql

linux安装mysql.wmv

1.卸载MariaDB

在CentOS中默认安装有MariaDB,是MySQL的一个分支,主要由开源社区维护。
CentOS 7及以上版本已经不再使用MySQL数据库,而是使用MariaDB数据库。
如果直接安装MySQL,会和MariaDB的文件冲突。
因此,需要先卸载自带的MariaDB,再安装MySQL。

1.1 查看是否存在MariaDB文件

[root@localhost ~]# rpm -qa|grep mariadb

1.2 卸载

[root@localhost ~]# rpm -e —nodeps 文件名

1.3 检查是否卸载干净

[root@localhost ~]# rpm -qa|grep mariadb
image.png
1、查看当前系统是否安装了mysql

  1. rpm -qa | grep mysql

2.安装MySql

开始安装,安装方式为将安装包下载到本地进行安装

  1. 安装wget,命令中的 -y 的意思是所有的选项都同意。作用时安装过程中如果有询问y/n时自动选择y

    1. yum -y install wget
  2. 使用wget下载安装文件包,这里以mysql5.7为例,如果需要自行使用8.0版本,在下面二选一 ``` wget http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm **冬冬提示:注意二选一选择自己需要的版本* wget https://repo.mysql.com//mysql80-community-release-el7-3.noarch.rpm

  1. 3. 使用yum 下载并安装mysql

yum -y install mysql57-community-release-el7-10.noarch.rpm **冬冬提示:注意二选一选择自己需要的版本* yum -y install mysql80-community-release-el7-3.noarch.rpm

  1. ```
  2. yum -y install mysql-community-server

如果出现公钥尚未安装
image.png
解决方案
运行命令:rpm —import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
在重新安装
运行命令
[root@localhost ~]# yum -y install mysql-community-server

mysql的初始化配置

查看MySQL运行状态:
[root@localhost ~]# systemctl status mysqld.service
首先启动MySQL
[root@localhost ~]# systemctl start mysqld.service
查看MySQL运行状态,运行状态如图:
[root@localhost ~]# systemctl status mysqld.service
image.png
此时MySQL已经开始正常运行,不过要想进入MySQL还得先找出此时root用户的密码,通过如下命令可以在日志文件中找出密码:
[root@localhost ~]# grep “password” /var/log/mysqld.log
image.png
马赛克部分为密码

如下命令登录数据库:
[root@localhost ~]# mysql -uroot -p
image.png
此时不能做任何事情,因为MySQL默认必须修改密码之后才能操作数据库,如下命令修改密码:
mysql> ALTER USER ‘root’@’localhost’ IDENTIFIED BY ‘new password’;
其中‘new password’替换成你要设置的密码,注意:密码设置必须要大小写字母数字和特殊符号(,/‘;:等),不然不能配置成功。
如果出现如下错误:
image.png
是因为密码的复杂度不符合默认规定
如需修改密码复杂度参考如下命令:
set global validate_password_policy=LOW;
set global validate_password_length=6;
image.png

开启mysql的远程访问

执行以下命令开启远程访问限制(注意:如要开启所有的,用%代替IP):
grant all privileges on . to ‘root’@’%’ identified by ‘password’ with grant option;
注:password—是你设置你的mysql远程登录密码。
然后再输入下面两行命令
mysql> flush privileges;
此步操作,退出mysql也可以。具体参考:
03.springboot - 图30

新建用户(可选)

建立一个新的用户,以方便后期登陆使用,如果是自用也可以不建立新的用户直接用root登陆,但是还是建议弄一个新的

  • 查看现有的用户信息:

    1. SELECT host,user,authentication_string from mysql.user;
  • 新建一个用户:

    1. CREATE user '用户名称'@'%' IDENTIFIED BY '用户密码';
  • 给新建的用户赋予权限,我这里是给的全部的权限,如果不想给他全部的权限也可以单独设置。

    1. GRANT ALL PRIVILEGES ON *.* TO '用户名称'@'%' WITH GRANT OPTION;

    image.png

    更改mysql的语言

    首先重新登录mysql,然后输入status:
    image.png
    可以看到,红色方框处不是utf-8,修改为utf8即可。
    因此我们先退出mysql(ctrl+z),然后再到/etc目录下的my.cnf文件下修改一下文件内容

    1. cd /etc
    2. vi my.cnf

    image.png
    image.png :::info 第1行,2行,25行,26行 ::: ```xml [client] default-character-set=utf8

For advice on how to change settings please see

http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html

[mysqld] #

Remove leading # and set to the amount of RAM for the most important data

cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.

innodb_buffer_pool_size = 128M

#

Remove leading # to turn on a very important data integrity option: logging

changes to the binary log between backups.

log_bin

#

Remove leading # to set options mainly useful for reporting servers.

The server defaults are faster for transactions and fast SELECTs.

Adjust sizes as needed, experiment to find the optimal values.

join_buffer_size = 128M

sort_buffer_size = 2M

read_rnd_buffer_size = 2M

datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock character-set-server=utf8 collation-server=utf8_general_ci

Disabling symbolic-links is recommended to prevent assorted security risks

symbolic-links=0

log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid

  1. 保存更改后的my.cnf文件后,重启下mysql,然后输入status再次查看,你就会发现变化啦

service mysqld restart

  1. ![image.png](https://cdn.nlark.com/yuque/0/2023/png/33672012/1685094856089-e221ca7e-350e-44ec-86d6-da1176431061.png#averageHue=%231a2f40&clientId=uf67dfd16-ca6f-4&from=paste&height=38&id=u84775384&originHeight=48&originWidth=584&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=35196&status=done&style=none&taskId=uea27ad9c-6caf-45c2-a282-9544f318ed9&title=&width=467.2)<br />![image.png](https://cdn.nlark.com/yuque/0/2023/png/33672012/1685095244695-8d4a8ea9-38eb-4664-8302-1f37fbe609cf.png#averageHue=%2328475b&clientId=uf67dfd16-ca6f-4&from=paste&height=463&id=u7c4ea60c&originHeight=579&originWidth=947&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=586505&status=done&style=none&taskId=ufa8c14a1-25f1-42ee-90d4-ab7690448cc&title=&width=757.6)
  2. <a name="xMNV9"></a>
  3. ### 开机自启
  4. 我们确认一下mysql是不是开机自动启动
  5. - 查看是否为开机自动启动,如果是则返回enabled

systemctl is-enabled mysqld.service

  1. - 如果不是开机自动启动则打开它:

systemctl enabled mysqld.service

  1. <a name="V4wAw"></a>
  2. ### centos防火墙配置
  3. 冬冬没开防火墙所以下面所有配置都不需要了
  4. <a name="lgfAX"></a>
  5. ### 1、检查防火墙是否运行,如果没有运行则打开它。
  6. - 检查防火墙是否运行。如果运行中则会返回一个值:running,否则会返回not running:

firewall-cmd —state

  1. - 如果没有运行则开启它:

systemctl start firewalld.service

  1. - 设置防火墙开机自动运行:

systemctl enable firewalld.service

  1. <a name="idqdl"></a>
  2. ### 2、开启端口
  3. - 打开需要开启的端口,mysql的默认端口为3306,我们就打开这个。<br />命令含义:注意命令前的“-”是两个,不是一个<br />—zone #作用域<br />—add-port=80/tcp #添加端口,格式为:端口/通讯协议<br />—permanent #永久生效,没有此参数重启后失效

firewall-cmd —zone=public —add-port=3306/tcp —permanent

  1. - 重启防火墙以生效配置

systemctl restart firewalld.service

  1. - 查看端口是否已经开启

firewall-cmd —list-ports ```