Java 程序的部署
因为 Java 的代码具有可移植性,利用 Java 编写的程序,实际上并没有和底层操作系统直接交互,而是运行在 Java虚拟机上(JVM),就是因为 JVM,所以才屏蔽了不同操作系统之间的差异。所以,Java 编写代码后,可以在任何地方运行。
所以,利用 Java 编写的程序可以在 Windows 操作系统上运行,同时,我们不对代码进行任何修改,亦可以在 Linux 系统上运行。
本篇博客,我会详细介绍 Servlet 项目、Spring Boot 项目的云服务器部署。
一、Servlet 项目部署
1. 搭建环境
在部署之前,我们需要将准备工作全部做好,也就是搭建好依赖的环境。
步骤1:安装 JDK
步骤2:安装 Tomcat
步骤3:安装 MySQL
步骤1 安装 JDK
(1) 查找 JDK 版本
yum list | grep jdk
通过上面的命令,进行检索 JDK,选择 " devel " 版本的开发包,因为 " devel " 表示一个完整的开发包。( " devel " => " development " )
(2) 选择 JDK 版本并执行安装
yum install 你需要安装的版本
" install " 后面,应该跟着你选择的安装版本,此外,安装操作,只有 root 用户才能真正执行。
步骤2 安装 Tomcat
(1) 从 Tomcat 官网复制 zip 安装包的链接
(2) 通过命令进行下载安装
weget http://downloads.apache.org/tomcat/tomcat-8/v8.5.82/bin/apache-tomcat-8.5.82.
将链接前面的协议 https 改为 http.
(3) 解压缩
unzip apache-tomcat-8.5.82.zip
如果 Linux 系统没有预装 " unzip " 这样的解压功能,可以通过下面的命令进行安装。
yum install unzip
步骤3 安装 MySQL
必须明确,MariaDB 和 MySQL 可以说是双胞胎,但在 Linux 下,安装前者比安装后者,更为简单。
下面的链接是我老师写的安装步骤,CentOS 7 通过 yum 安装 MariaDB.
如果有小伙伴能够安装成功,请给我老师点个赞…
2. 启动 Tomcat
① 打开 tomcat 下的 bin 目录,并为 sh 文件赋予可执行权限
chmod u+x *.sh
② 启动 tomcat
sh startup.sh
通过下面的命令,查看 Tomcat 是否真正的启动成功。(如果是 LISTEN 表示成功)
netstat -anp | grep 8080 //netstat -anp | grep [端口号]
如果 8080 端口处于 TIME_WAIT 状态,而 8005 处于 LISTEN 状态,我们就需要先将 8005 后台进程杀死。(8005 也是 Tomcat 的一个端口,只是用的少)
sudo kill -9 10284 //sudo kill -9 [PID]
③ 为防火墙添加新的规则
针对更改防火墙的设置,我们必须明确,它默认是在保护你服务器的端口不暴露到公网上,因为暴露端口很危险、也很容易被黑客入侵,所以,要想让 tomcat 能在公网被访问,就需要修改这里的防火墙或安全组的配置。
ECS 服务器对应着安全组;轻量应用服务器对应着防火墙。
不管是安全组还是防火墙,都是被设计用来拦截作用的。
下图是以腾讯的轻量应用服务器为例,如果小伙伴和我的不一样,可以问一问客服,它会帮你解决这一问题。
④ 通过你的公网 IP ,再加上 8080 端口号,往浏览器输入,若成功,tomcat 一切就绪,就会出现下面的页面。
3. 开始部署
步骤1 将 Java 项目打包
以我的项目为例子,先设置 war 包,接着点击 package,最后生成的包在 target 目录下。
步骤2 上传 war 包到 webapps 下
将 war 包复制到 tomcat/webapps 的目录下,直接拖拽即可。过了不到 2分钟,就可以看见 tomcat 会自动将 war 包解压缩。
如果 tomcat 并没有自动解压缩,那么我们就可以通过下面的命令,进行手动解压缩到指定目录。
upzip (war包) -d (目标目录)
我们创建一个 ccc 目录,将解压缩后的文件往其中放即可。
解压缩后的结果:
此外,这里应该注意,webapps 目录下的其他文件不要乱动,否则,最终可能会出现部署的 Web 程序访问不了的情况。
步骤3 为云服务器上的数据库提供数据
使用下面的命令进行和数据库连接,之后,它会让你输入密码,输入的密码不会在命令行上显式出现,但实际上,你已经输入了。
mysql -uroot -p
可以看见,MySQL 和 MariaDB 两者的操作几乎相同,显示效果也吻合。
必须明确:本地数据库和云服务器上的数据库是两码事。
举个例子:这两者的区别就好像联机游戏一样,当一台电脑未联机,那么你只能和人机进行 PK,当你联网后,才能和游戏玩家一起 PK.
所以,之前 war 包在本地运行,访问的是本地的数据库 ( 127.0.0.1 );而现在,war 包在云服务器上运行,访问的就是云服务器的数据库。我们就需要先保证云服务器的数据库上有数据,此外,还得保证我们的代码能够访问云服务器的数据库 ( 保证 ip,端口,用户名,密码 ) 都是正确的,才能准确无误地访问成功。
举个例子:这就好像你登录 QQ 一样,你输入你的账号和密码后,后端是怎么知道你的账号和密码都是正确的呢?所以说,腾讯服务器那里就有一个数据库,数据库中放着一些用户数据,以此来进行验证。
3. 供用户访问
最后的最后,通过浏览器,输入 webapps 目录下的一些文件路径,就可以让别人也进行访问啦!你可以告诉你身边的小伙伴,这就是我做的网站!有了云服务器,往上面部署自己的项目,还是很香的,万一火了呢!!!
目前,我先不公开外网了,我的一些项目功能还未完善…
二、Spring Boot 项目部署
1. 搭建环境
在部署之前,我们需要将准备工作全部做好,也就是搭建好依赖的环境。所有步骤参照上面的步骤即可,这里不需要安装 Tomcat,因为在 Spring Boot 项目中,已经为我们内置了 Tomcat,我们只需要将 Java 项目打包成 jar 包即可。( 但是,如果你还是打成 war 包,依然需要安装 Tomcat. )
步骤1:安装 JDK
步骤2:安装 Tomcat (省略)
步骤3:安装 MySQL
2. 开始部署
步骤1 将 Java 项目打包
在打包之前,需要注意三件事情:
① 在 yml / properties 配置文件中,配置云服务器的端口号 (我的是 8080),此外,也要检查一下云服务器的数据库密码、表名等信息…
② 在 pom.xml 中,将程序打包成 jar 包
③ 将原有的 【target】目录删除掉,以防缓存导致的未加载数据。
经过上面的两个过程后,就可以开始打包了:
步骤2 上传 jar 包
将 windows 系统的 jar 包,复制到你想要存储 Linux 系统的目录下,直接拖拽即可。
步骤3 使用命令运行 jar 包
使用 java 指令运行项目 jar 包。
java -jar ***.jar //***为你的jar包名
或许可能遇到下面的情况,8080 端口已经被占用了。
① 首先,我们得看看是谁正在占用 8080 端口 (如果端口号没被占用,那么此时就不显示任何东西)
netstat -anp | grep 8080 //netstat -anp | grep [端口号]
② 其次,我们找到对应端口号的 PID (如果端口号没被占用,那么此时就不显示任何东西)
sudo lsof -i:8080 //sudo lsof -i:[端口号]
③ 最后,我们使用如下命令把它清理掉,给我们的项目留下运行地空地
sudo kill -9 29409 //sudo kill -9 [PID]
④ 再次使用 java 指令运行项目 jar 包
java -jar ***.jar //***为你的jar包名
当看到如下界面时,一个 Spring Boot 项目才真正的启动起来。
⑤ 实际上,在上面的步骤中,只要我们退出了 Xshell,即使云服务器是开着的,Spring Boot 项目就会被关掉,这也就意味着用户此时不再能够通过公网访问网站了。
所以,我们就可以使用如下命令,即使我们退出了 Xshell,只要云服务器不关闭,用户就能够一直访问网站了。
nohup java -jar ***.jar & //***为你的jar包名
执行此命令后,Linux 的同目录下,多出来一个 " .out " 文件,我们可以通过 vim 命令打开它,里面存放着 Spring Boot 的日志信息,就是我们平时在 IDEA 控制台看到的信息。如果你在项目中,开启了 MyBatis 打印日志,那么它也会显示出来。
⑥ 上面的 " nohup " 命令表示当前进程和终端没有关系,& 表示任务在后台运行。如果我们需要关闭它的后台进程,就可以通过下面的命令列出后台进程:
ps -ef | grep java
之后,也可以使用上面说的 " 杀进程 " 方式关闭后台进程。
sudo kill -9 29409 //sudo kill -9 [PID]
3. 供用户访问
通过下面的格式,让用户访问你的网站:
公网 + 8080:*** // *** 为你的路由 (RequestMapping)