这边是上一篇文章的传送门,如果你感兴趣的话可以去看一看呢:传送门へ

继续上回书说到,我终于在服务器上安装并且调通了tomcat的测试界面,今天需要做的工作就是把项目上传到服务器。

至于项目。。

项目文件

公司的负责人告诉我这个是Springboot框架写出来的东西,那么就先找一找怎么用吧。。

Google到了各种各样的方法,好像大多数的文章都是要是用IDEA去弄,但是仔细一看,大多数都是如何从0开始来编写一个项目。但是我手里的这个文件是一个完整的项目文件,并且我因为曾经用IDEA时候受过伤,所以就卸载了,我不想再次安装回来。

根据这篇文章^L1,我发现好像只要把文件达成jar包,直接丢到服务器上就可以了。

那么问题来了,怎样打包呢?反正我是真的不想用IDEA,所以。。只好另辟他境了

因此我又找到了一篇文章^SpringBoot项目打包并部署到云服务器,这里描述的方法非常简单

仅需要使用一条命令即可。

1
mvn clean package

由于我的笔电没有安装相应的环境,而且我又害怕破坏好不容易配置好的服务器。。于是我又将魔爪伸向了我的Ubuntu虚拟机。

在执行过程中,我发现了问题

1
2
3
4
5
6
7
8
9
[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] /home/*******/*******/*******/src/main/java/com/jt/common/util/IPUtils.java:[3,26] 程序包javax.servlet.http不存在
[ERROR] /home/*******/*******/*******/src/main/java/com/jt/common/config/WebAppInitializer.java:[3,21] 程序包javax.servlet不存在
[ERROR] /home/*******/*******/*******/src/main/java/com/jt/common/config/WebAppInitializer.java:[4,21] 程序包javax.servlet不存在
[ERROR] /home/*******/*******/*******/src/main/java/com/jt/common/config/WebAppInitializer.java:[5,21] 程序包javax.servlet不存在
[ERROR] /home/*******/*******/*******/src/main/java/com/jt/common/config/WebAppInitializer.java:[16,31] 找不到 符号
符号: 类 ServletContext
位置: 类 com.jt.common.config.WebAppInitializer

注:上边*******部分为我故意隐藏了本机真实目标地址所修改的,并不代表其输出时的样子。。算了,我还是再放一张截图吧

报错

难道是我没有使用IDEA,maven不乐意了?

于是我又去Google和很久,找到了这篇文章[^L2]

虽然这篇文章是对于IDEA报错的解决方式,但是我坚信可以用于安抚我这位大哥。

诶不对,等会儿。。IDEA也可能会出现这种问题? 啊哈!原来不是我惹大哥生气了

根据这篇文章解决办法,那就是引入servlet-api.jar包就可以了。。

但是我不是IDEA啊!不能直接引入这个包啊

然后我又看到了这篇文章^L3,根据文章描述的内容,我将下边内容在项目的.pom文件中的添加dependency属性(先不要动手,往下看)

1
2
3
4
5
6
7
8
9
10
11
12
13
<groupId>javax.servlet</groupId> 
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>


<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>

然后再次运行mvn clean package命令,结果又双叒叕ruò zhuó报错了

1
2
[ERROR]   The project  (/home/*******/*******/*******/pom.xml) has 1 error
[ERROR] Non-parseable POM /home/*******/*******/*******/pom.xml: Unrecognised tag: 'groupId' (position: START_TAG seen ...</dependency>\n\n\t<groupId>... @81:11) @ line 81, column 11 -> [Help 2]

我发现这个81行貌似是我刚刚加入的那个内容。。

于是我苦苦研究了很久,才发现这个作者提供的内容并不全面,应该粘贴入如下部分的代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
+ <dependency> 
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>

<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>

直接按照文章的指示,粘贴到对应的pom.xml文件的相应位置即可。

于是再次执行mvn clean package命令,终于看到了黎明前的曙光了(好像有哪里不对

看到没有红色的ERROR之后,我送了一口气。。等会儿!war是什么东西,不应该是jar么?(这张图的红色部分是我的项目名称,不是所谓的红色的ERROR

根据这篇文章^L4,发现war包也是可以轻松部署的

War包一般是在进行Web开发时,通常是一个网站Project下的所有源码的集合,里面包含前台HTML/CSS/JS的代码,也包含Java的代码。

当开发人员在自己的开发机器上调试所有代码并通过后,为了交给测试人员测试和未来进行产品发布,都需要将开发人员的源码打包成War进行发布。

War包可以放在Tomcat下的webapps或者word目录下,随着tomcat服务器的启动,它可以自动被解压。

一句话来说,把生成的war包放到/opt/tomcat/webapp/文件夹中就可以直接通过IP:port/ProjectName/进行访问了。举个例子,将projectName.war包,复制到Tomcat的webapp下。这样当配置好后的访问路径便为:http://ipaddress:8080/projectName/login.jsp。

于是把这个文件先放到虚拟机的/opt/tomcat/webapp/文件夹中,然后访问http://192.168.203.131:8081/Demo/。。。

成功!

我太不容易了,终于弄明白大概方向了。

那接下来的工作就是把源文件放到服务器上生成war包,然后再放到tomcat目录中。。

等一下,既然tomcat只读取war包的内容,我何必再生成一边呢,直接扔war包上去不就行了?

我好聪明(已经傻掉了,明明应当早就想明白的说)

于是扔到服务器上。。关键是怎么传上去呢。。用ftp?太麻烦

这时,我突然想到原来折腾路由器的时候,用了一款叫做WinSCP的应用来修改的hosts文件。就像访问windows下的资源管理器一样可以拥有各种各样的文件管理功能。。下载地址:WinSCP

这个官网有一点迷的就是,写着是无料的软件,但是如果使用Get it from Microsoft方式进行下载的话,需要$9.99。。。有点迷⊙(・◇・)?

既然梅林也是基于linux,ubuntu也是基于linux,那应该可以诶!我太机智了

试了一下,竟然真的可以!

那就方便多了。。

直接开启两个连接,一个连接服务器,一个连接虚拟机,直接把虚拟机的war包文件复制粘贴到服务器的相应位置。。

然后尝试访问http://hostname:8081/projectName/,成功了!!

那么就完成了!

于是我尝试登陆,发现点击登录没反应。。。

这时候才意识到,我竟然没装数据库,能有反应才怪了

那么接下来就是装数据库了

既然如此,我还是用我最熟悉的MySQL好了

比起windows我更喜欢linux的原因就是安装各种东西可以直接一条命令安装好

然后网上随便找了一下,ubuntu安装mysql^L5,想着1分钟安装完成后赶快配置项目

直接

1
2
3
4
#命令1
sudo apt-get update
#命令2
sudo apt-get install mysql-server

下载完成后,使用sudo mysql_secure_installation命令初始化mysql

下面的密码强校验步骤一定要注意!!!

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
48
49
50
51
52
weison@ubuntu19-04:~$ sudo mysql_secure_installation

Securing the MySQL server deployment.

Connecting to MySQL using a blank password.

VALIDATE PASSWORD PLUGIN can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD plugin?

Press y|Y for Yes, any other key for No: N(选择N,不会进行密码的强校验)
Please set the password for root here.

New password:

Re-enter new password:
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : N(选择N,不删除匿名用户)

... skipping.


Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : N(选择N,允许root远程连接)

... skipping.
By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.


Remove test database and access to it? (Press y|Y for Yes, any other key for No) : N(选择N,不删除test数据库)

... skipping.
Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : Y(选择Y,修改权限立即生效)
Success.

All done!

根据这个配置完成之后,我发现自己选错了,那个密码强校验我选择了Y

结果因为这个我完全没有办法创建远程账户

如果你不幸和我一样选择了Y for yes

参考这篇文章[^L6],你可以尝试一下的解决方法

首先登陆到MySQL

1
sudo mysql -uroot -p
1
mysql> SHOW VARIABLES LIKE 'validate_password%';
1
mysql> set global validate_password.policy=LOW;

然后接可以设置简单密码了

继续跟着刚刚的教程操作

因为MySQL默认无法通过远程去连接,而我需要远程来管理,所以我要进行如下设置

1
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root';  

于是又一次报错了

1
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IDENTIFIED BY 'root'' at line 1

根据这篇文章[^L7]的描述,MySQL8不再支持GRANT命令,我需要使用

1
mysql> CREATE USER 'root'@'%' IDENTIFIED BY 'root';

进行配置

顺便一提,'root'@'%'中root代表创建一个新的用户名叫做root的用户,%代表可以通过任意ip地址进行访问。

如果你这里报错

1
2
ERROR 1819 (HY000): Your password does not satisfy the current poli
mysql> mysql_secure_installation

那么恭喜你,请点击上边的你可以点击这里查看解决方法按钮,更换一下安全等级为LOW就可以了(大概)

于是,再都配置好之后,我打开了Navicate,尝试连接数据库,却发现又报了一个错误。。

根据这篇内容[^L8],可以尝试使用下边三行命令配置远程用户

1
2
3
USE mysql;
ALTER USER 'root'@'ipReplace' IDENTIFIED WITH mysql_native_password BY 'pwd';
FLUSH PRIVILEGES;

其中ipReplace替换成你Navicat所在机器的ip地址,如果想全局访问的话,请将其替换为%
其中pwd替换为名称为root的用户的访问密码(root名称也可以改变)

然后再次尝试使用Navicate进行连接,成功了!

于是也到时间下班了hhhhhh

又愉快滴度过了一天

[^L2]: IntelliJ IDEA 出现" java: 程序包javax.servlet不存在、 java: 程序包javax.servlet.annotation"等错误:https://blog.csdn.net/wust_lh/article/details/73469789

[^L7]: How to grant all privileges to root user in MySQL 8.0: https://stackoverflow.com/questions/50177216/how-to-grant-all-privileges-to-root-user-in-mysql-8-0

[^L8]: navicat 连接 mysql 出现Client does not support authentication protocol requested by server解决方案:https://blog.csdn.net/u013700358/article/details/80306560