2020idea创建web项目_Spring Boot 项目打包 War 并部署到 Tomcat

之前使用 SpringBoot 所做的开发,都是将项目打包成 Jar 的,但是如果是作为一个 Web 项目,最好是将项目打包成 War。

1. Jar 包和 War 包的区别

1、概念

jar 包:JAR 包是类的归档文件,JAR 文件格式以流行的 ZIP 文件格式为基础。与 ZIP 文件不同的是,JAR 文件不仅用于压缩和发布,而且还用于部署和封装库、组件和插件程序,并可被像编译器和 JVM 这样的工具直接使用。

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

2、目录结构

jar 包里的 com 里放的就是 class 文件,配置文件,但是没有静态资源的文件,大多数 JAR 文件包含一个 META-INF 目录,它用于存储包和扩展的配置数据,如安全性和版本信息。

而 war 包里的 WEB-INF 里放的 class 文件和配置文件,META-INF 和 jar 包作用一样,war 包里还包含静态资源的文件

3、总结起来就是有两点不同:

war 包和项目的文件结构保持一致,jar 包则不一样。

jar 包里没有静态资源的文件(index.jsp)

4、部署项目的区别

部署普通的 spring 项目用 war 包就可以,部署 springboot 项目用 jar 包就可以,因为 springboot 内置 tomcat。

2. 创建 SpringBoot 项目(Packaging 方式指定为 war)

在 IntelliJ IDEA 中点击 File -> New -> Project...,选择 Spring Initializr,点击 Next,如下:

4ddf08e1604c083a8dcc0a5c763a7365.png

在 Project Metadata 界面输入 Group 和 Artifact,注意要将 Packaging 由默认的 Jar 改为 War,如下:

78f2ceeef05ddc3036a32b9553d1a802.png

在 Dependencies 界面,勾选 Web 下的 Spring Web 和 Template Engines 下的 Thymeleaf,如下:

7251f6d15bd233e6278d39e05bbc0f75.png

0891e207f263c6c4463c7d88227adb39.png

注:在 SpringBoot 项目中访问 html 文件时,必须添加 Thymeleaf 依赖,否则无法找到 html 文件,如果在这里没有勾选 Thymeleaf,可以在创建项目后在 pom.xml 中手动加入 Thymeleaf 依赖,如下:

    org.springframework.boot    spring-boot-starter-thymeleaf

输入项目名称,点击 Finish 完成,如下:

98888811505dad1f1a82acdb3ae88f92.png

项目创建完成后,pom.xml 文件的内容如下:

<?xml version="1.0" encoding="UTF-8"?>         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">    4.0.0            org.springframework.boot        spring-boot-starter-parent        2.2.6.RELEASE                com.springboot    web    0.0.1-SNAPSHOT    war    web    Demo project for Spring Boot            1.8                            org.springframework.boot            spring-boot-starter-thymeleaf                            org.springframework.boot            spring-boot-starter-web                            org.springframework.boot            spring-boot-starter-tomcat            provided                            org.springframework.boot            spring-boot-starter-test            test                                                org.junit.vintage                    junit-vintage-engine                                                                                org.springframework.boot                spring-boot-maven-plugin                        

3. SpringBoot Jar 项目和 SpringBoot War 项目的差别

项目创建完成后,来看一下 SpringBoot Jar 项目和 SpringBoot War 项目的差别,注意这些差别也是创建 SpringBoot Jar 项目之后要将项目改成 SpringBoot War 方式打包的关键。

1、pom.xml 中的 packaging 的是 war 而不是 jar,如下:

197365c02103c3474219bb2b588b8791.png

2、pom.xml 文件中含有一个 spring-boot-starter-tomcat 的依赖,如下:

bd87aacdb2aae9372379cc5173bfeaf3.png

这个依赖的作用,按网上的说法是排除 SpringBoot 中内置的 Tomcat 的。

另外,按网上的说法,排除 SpringBoot 中内置的 Tomcat 还有另一种实现方式,如下:

23e964c99820142f46904f7bb9eedd71.png

也就是在 spring-boot-starter-web 依赖中加上上图中红线框中的内容。

3、继承 org.springframework.boot.web.servlet.support.SpringBootServletInitializer 实现 configure 方法

从项目的目录结构看,相比 Jar 项目,War 项目在启动类 Application 同级的目录下多了一个 ServletInitializer 类,如下:

11db1911a0a46cf5234c7cdb929e2f70.png

ServletInitializer 类继承 SpringBootServletInitializer 类,其内容如下:

package com.springboot.web;import org.springframework.boot.builder.SpringApplicationBuilder;import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;public class ServletInitializer extends SpringBootServletInitializer {    @Override    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {        return application.sources(WebApplication.class);    }}

另外,按网上的说法,除了上面单独写一个 ServletInitializer 类外,还可以在启动类 Application 中继承 SpringBootServletInitializer 类并实现 configure 方法,如下:

5cfc12fde313473ee1f9b4aa3bcbff5e.png

以上是 SpringBoot War 项目和 Jar 项目的差别,同时也是将 Jar 打包方式改为 War 打包方式的三个步骤。

4. SpringBoot 的 html 页面

在项目目录结构的 main/resources/templates 下创建一个 welcome.html 文件,如下:

c018e330ac26d603f660b2e3d9248ba4.png

welcome.html 文件的内容如下:

          第一个 SpringBoot HTML页面        

Welcome to Spring Boot!!!

然后在配置文件 application.yml 中添加 thymeleaf 相关的配置,如下:

server:  port: 8080spring:  thymeleaf:    prefix: classpath:/templates/

接着创建 controller/WecomeController.java 类,实现跳转到 welcome.html 的接口,如下:

package com.springboot.web.controller;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import java.util.HashMap;@Controllerpublic class WelcomeController {    @RequestMapping("/welcome")    public String welcomeHtml(HashMap map) {        map.put("parameter", "欢迎进入 HTML 页面");        return "/welcome";    }}

直接在 IntelliJ IDEA 中运行,然后在浏览器地址栏输入 http://localhost:8080/welcome,显示如下:

3aa253c4dc9de791f6dd84366f9d758f.png

5. 打包生成 war 文件,部署到 Tomcat

展开右侧边栏的 Maven Projects,双击 web/Lifecycle 下的 package,如下:

1f2bbc978eef7deb7866a2fc3abe225d.png

编译结束没有出错,就会在项根目录下的 target 文件夹下看到生成的 war 文件 web-0.0.1-SNAPSHOT.war,如下:

4c25c05b9f45bda366acafb61432bb49.png

bae02249f4a9ff4b0e3c3ab49d274184.png

将 web-0.0.1-SNAPSHOT.war 上传至云服务器的 tomcat-web 目录下的 webapps 目录,然后用下面的命令创建 tomcat 容器,同时将当前目录下的 webapps/web-0.0.1-SNAPSHOT.war 挂载到容器内的 /usr/local/tomcat/webapps/web-0.0.1-SNAPSHOT.war,如下:

[root@VM_0_14_centos tomcat-web]# docker run -d -p 8080:8080 --name tomcat-web --network my-network -v $PWD/logs:/usr/local/tomcat/logs -v $PWD/webapps/web-0.0.1-SNAPSHOT.war:/usr/local/tomcat/webapps/web-0.0.1-SNAPSHOT.war tomcat:9.0.33-jdk8-openjdk[root@VM_0_14_centos tomcat-web]# docker psCONTAINER ID     IMAGE                  COMMAND          CREATED        STATUS         PORTS               NAMES7fa7ab090217     tomcat:9.0.33-jdk8-openjdk   "catalina.sh run"   4 seconds ago    Up 3 seconds     0.0.0.0:8080->8080/tcp   tomcat-web[root@VM_0_14_centos tomcat-web]#

然后打开浏览器,在地址栏输入 http://212.64.47.192:8080/web-0.0.1-SNAPSHOT/welcome,就可以访问到 welcome.html 页面了,如下:

6c2e0ef21a2500ba987ee9733509fb94.png

注意,上面的 URL 与直接在 IntelliJ IDEA 中运行时是不同的,必须在 RequestMapping 的 /welcome 前面带上 war 文件的名称,即 web-0.0.1-SNAPSHOT。因为在 Tomcat 容器创建后,在 webapps 目录内会将 web-0.0.1-SNAPSHOT.war 解压得到一个 web-0.0.1-SNAPSHOT 目录,如下:

root@0bfd6dcbe71d:/usr/local/tomcat# ls webapps/ -lhatotal 19Mdrwxr-xr-x  1 root root  4.0K Apr  1 14:34 .drwxr-sr-x  1 root staff 4.0K Oct 19 02:16 ..drwxr-xr-x  3 root root  4.0K Oct 19 02:16 ROOTdrwxr-xr-x 15 root root  4.0K Oct 19 02:16 docsdrwxr-xr-x  6 root root  4.0K Oct 19 02:16 examplesdrwxr-xr-x  5 root root  4.0K Oct 19 02:16 host-managerdrwxr-xr-x  5 root root  4.0K Oct 19 02:16 managerdrwxr-x---  5 root root  4.0K Apr  1 14:34 web-0.0.1-SNAPSHOT-rw-r--r--  1 root root   19M Apr  1 14:33 web-0.0.1-SNAPSHOT.warroot@0bfd6dcbe71d:/usr/local/tomcat#

9f0729d8e570e8ac7f44419c61197df3.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值