600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > 打包tomcat没有xml文件_Spring Boot 项目打包 War 并部署到 Tomcat

打包tomcat没有xml文件_Spring Boot 项目打包 War 并部署到 Tomcat

时间:2023-05-27 10:32:21

相关推荐

打包tomcat没有xml文件_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,如下:

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

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

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

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

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

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

<?xml version="1.0" encoding="UTF-8"?> xsi:schemaLocation="/POM/4.0.0 /xsd/maven-4.0.0.xsd"> 4.0.0 org.springframework.boot spring-boot-starter-parent 2.2.6.RELEASEcom.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.vintagejunit-vintage-engineorg.springframework.bootspring-boot-maven-plugin

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

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

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

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

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

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

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

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

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

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 方法,如下:

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

4. SpringBoot 的 html 页面

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

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,显示如下:

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

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

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

将 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 IDIMAGE COMMANDCREATED STATUS PORTSNAMES7fa7ab090217tomcat:9.0.33-jdk8-openjdk "catalina.sh run" 4 seconds ago Up 3 seconds0.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 页面了,如下:

注意,上面的 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#

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。