您的位置:首页 > 运维架构 > Linux

SpringBoot项目Linux部署

2020-06-05 06:59 113 查看

SpringBoot项目部署

Tomcat服务器

要了解SpringBoot项目在Linux上的部署,首先介绍几个概念:
①服务器:安装了服务器软件的计算机
②服务器软件:接受用户的请求,处理请求,做出响应
③web服务器软件:部署web项目,让用户通过浏览器访问这些项目动态资源软件只能在服务器软件中运行,所以又称web容器

常用java相关的web服务器软件有:
①webLogic:大型的JavaEE服务器,支持所有的JavaEE规范。
②webSphere:大型的JavaEE服务器,支持所有的JavaEE规范
③JBOSS:大型的JavaEE服务器,支持所有的JavaEE规范
④Tomcat:中小型的JavaEE服务器,仅支持少量的JavaEE规范的Servlet
Tomcat服务器是一个免费的开放源代码的Web应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用

Tomcat文件结构:

bin目录:
bin目录主要是用来存放tomcat的命令,主要有两大类,一类是以.sh结尾的(linux命令),另一类是以.bat结尾的(windows命令)。
很多环境变量的设置都在此处,例如可以设置JDK路径、tomcat路径
startup 用来启动tomcat
shutdown 用来关闭tomcat
修改catalina可以设置tomcat的内存

conf目录:
conf目录主要是用来存放tomcat的一些配置文件。
server.xml可以设置端口号、设置域名或IP、默认加载的项目、请求编码
web.xml可以设置tomcat支持的文件类型
context.xml可以用来配置数据源之类的
tomcat-users.xml用来配置管理tomcat的用户与权限

webapps目录:
webapps目录用来存放应用程序,当tomcat启动时会去加载webapps目录下的应用程序。可以以文件夹、war包、jar包的形式发布应用。
当然,你也可以把应用程序放置在磁盘的任意位置,在配置文件中映射好就行。

springboot项目打包

springboot项目的部署有jar和war两种打包方式。

jar包:通常是开发时要引用通用类,打成包便于存放管理。springboot使用maven仓库进行jar包管理,maven以坐标(依赖)的形式将jar包保管在pom.xml文件中。

war包:war包是JavaWeb程序打的包,war包里面包括写的代码编译成的class文件,依赖的包,配置文件,所有的网站页面,包括html,jsp等等。一个war包可以理解为是一个web项目,里面是项目的所有东西。

打成什么文件进行部署与项目业务有关,就像提供rest服务(URL定位资源,用HTTP动词(GET,POST,DELETE,PUT)描述操作)的项目需要打包成jar文件,用命令运行很方便。而有大量css、js、html,且需要经常改动的项目,打成war包去运行比较方便,因为改动静态资源可以直接覆盖,很快看到改动后的效果,这是jar包不能比的(举个例子:项目打成jar包运行,一段时间后,前端要对其中某几个页面样式进行改动,使其更美观,那么改动几个css、html后,需要重新打成一个新的jar包,上传服务器并运行,这种改动频繁时很不友好,文件大时上传服务器很耗时,那么war包就能免去这种烦恼,只要覆盖几个css与html即可)

这里我们采用war包的方式进行项目的部署
1)首先找到项目的pom.xml文件,在<project>标签下找到<packaging>标签(没有则创建),将打包方式指定为war包:

<packaging>war</packaging>。

2)再继续在<project>下指定jdk的版本信息

<properties>
<java.version>1.8</java.version>
</properties>

linux上的jdk版本要和项目中jdk版本匹配

3)在<project><build>标签下使用<finalName>用你自己设定的名字作为包名

<finalName>netty<finalName>

4)移除springboot自带的tomcat

<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>

servlet-api是提供编写servlet时要用到 HttpServletRequest和HttpServletResponse等对象的,但是tomcat里也有,运行时要用tomcat自己的,所以引用maven包时,需要添加依赖

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

这个

<scope>provided</scope>
假定对应的依赖会由运行这个应用的JDK或者容器来提供
这样写的意思是,编写springboot时用我们自己引用的包,而运行时用tomcat自己的包,这样就不用冲突了,又能正常开发代码。不带上此依赖,打包时会报错

Error:(29,8)java:无法访问javax.servlet.ServletException

一个完整的pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.example</groupId>
<artifactId>netty</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>

<name>netty</name>
<description>Demo project for Spring Boot</description>

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

<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>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

<!--netty-->
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.16.Final</version>
</dependency>

<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>2.0.31-beta</version>
<scope>test</scope>
</dependency>

</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
<finalName>netty</finalName>
</build>

</project>

5)修改启动Application文件继承SpringBootServletInitializer,实现configure方法

为什么继承该类,SpringBootServletInitializer源码注释:
NotethataWebApplicationInitializerisonlyneededifyouarebuildingawarfileanddeployingit.Ifyouprefertorunanembeddedwebserverthenyouwon’tneedthisatall.
注意,如果您正在构建WAR文件并部署它,则需要WebApplicationInitializer。如果你喜欢运行一个嵌入式Web服务器,那么你根本不需要这个。

使用外部Tomcat部署访问的时候,application.properties(或者application.yml)中配置的

server.port=xxxx
server.servlet.context-path=xxxx

将失效,请使用tomcat的端口,tomcat,webapps下项目名进行访问。为了防止应用上下文所导致的项目访问资源加载不到的问题,建议pom.xml文件中标签下添加<finalName>标签。

6)点击IDEA右侧maven,通过Lifecycle-双击package,则可在项目target目录下生成war文件

Linux部署

1)使用Xftp将war包传输到linux的/usr/local/apache-tomcat-8.5.51/webapps/目录下

2)进入/usr/local/apache-tomcat-8.5.51/bin/目录下

3)执行

./startup.sh
启动tomcat,
./shutdown.sh
停止tomcat

Tomcat启动成功,webapps目录下自动解压缩war包,生成以下目录
–根目录
–WEB-INF目录
–web.xml:web项目的核心配置文件
–classes目录:放置字节码文件的目录
–lib目录:放置依赖的jar包

4)在浏览器中进入http://localhost:8080/,正常进入tomcat主页

5)

http://localhost:8080/war包名称/接口
进行测试

6)进入 /usr/local/apache-tomcat-8.5.51/logs/ 目录

7)

tail -f catalina.out
显示日志信息

tail指令 tail [选项] 文件 :默认查看文件后10行
【常用选项】
-n x:查看文件后x行内容
-f:实时追踪该文档的所有更新

到此为止项目已经成功部署。同时我们可以使用tomcat自带的Manager App对项目进行管理。

1)进入/usr/local/apache-tomcat-8.5.51/conf,输入

vim tomcat-users.xml
指令

2)找到被注释掉的用户配置,添加以下代码

<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<role rolename="manager-status"/>
<user username="admin" password="111111" roles="manager-gui,manager-script,manager-jmx,manager-status"/>


role节点代表角色/权限,tomcat有以下四种权限:
manager-gui
允许访问html接口(即URL路径为/manager/html/)
manager-script
允许访问纯文本接口(即URL路径为/manager/text/)
manager-jmx
允许访问JMX代理接口(即URL路径为/manager/jmxproxy/)
manager-status
允许访问Tomcat只读状态页面(即URL路径为/manager/status/)

从Tomcat Manager内部配置文件中可以得知,manager-gui、manager-script、manager-jmx均具备manager-status的权限,也就是说,manager-gui、manager-script、manager-jmx三种角色权限无需再额外添加manager-status权限,即可直接访问路径/manager/status/*。

一个user节点表示单个用户,属性username和password分别表示登录的用户名和密码,属性roles表示该用户所具备的权限。

配置好信息后打开浏览器进入http://localhost:8080/页面,点击Manager APP

输入刚刚配置好的用户名和密码即可进入

参考资料:
https://www.cnblogs.com/banml/p/11767305.html
https://www.cnblogs.com/feng9exe/p/11401768.html
https://blog.csdn.net/zhuyu19911016520/article/details/82884903
https://www.cnblogs.com/lichangyunnianxue/p/9729395.html
https://www.cnblogs.com/northern-light/p/8484294.html

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: