您的位置:

SpringBoot WAR包部署详解

SpringBoot作为一个框架工具,不仅能够帮助开发者快速构建应用程序,还能够使得应用程序更加灵活运用。在实际项目开发中,将SpringBoot应用程序打成WAR包后进行部署是很常见的一种方法,本文将介绍SpringBoot WAR包部署的方法及其相关细节。

一、WAR包部署原理

WAR文件的全称是Web Application Archive,通常也叫Web应用程序压缩包。将这种类型的压缩包部署到web服务器上,就可以让web服务器来帮助我们将其解压并运行。而SpringBoot应用程序的WAR包部署也是类似,它是将整个应用程序打包成一个压缩包,以web应用程序的形式部署到web服务器上。

SpringBoot项目如果需要打成WAR包,需要在pom.xml文件中进行相应的配置。通常在<packaging>节点下设置为war,如下所示:

  <packaging>war</packaging>

在进行WAR包部署之前,需要先将应用程序打成一个可执行的WAR包。可以使用如下Maven指令打包:

  mvn clean package

执行此指令之后,会在target目录下生成一个*.war的可执行WAR包。

二、WAR包部署步骤

Step1:添加SpringBoot启动类

将SpringBoot项目打成WAR包需要在应用程序的启动类上添加一个extends SpringBootServletInitializer的类继承关系,并覆写configure方法。代码如下:

  package com.example.springbootdemo;
  
  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(SpringBootDemoApplication.class);
      }
  
  }

其中SpringBootDemoApplication.class替换成您的SpringBoot应用程序的启动类。

Step2:修改pom.xml文件

在之前的pom.xml文件中添加如下依赖:

  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
  </dependency>
  <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <scope>provided</scope>
  </dependency>

这些依赖的加入是为了引入Tomcat容器以及Servlet规范API。

Step3:修改打包方式

在之前的pom.xml文件中,打包方式是jar包。要修改为war包需要更改属性的设置,具体修改如下:

  <packaging>war</packaging>
  
  ...
  
  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <configuration>
          <jvmArguments>-Dspring.profiles.active=product</jvmArguments>
        </configuration>
      ...

在这里将<packaging>属性设置为war,然后在<build><plugins><plugin>下面添加spring-boot-maven-plugin插件。同时我们将在应用程序中使用profile进行配置,以便在激活时能够根据需要获取不同的配置文件。

Step4:打包WAR包

完成上述修改之后,使用mvn clean package命令进行打包即可。在编译完毕之后,会在target目录生成一个.war文件。

Step5:部署到Tomcat

在Tomcat的$TOMCAT_HOME/webapps目录下,放置新生成的WAR包。Tomcat会自动解压,启动该应用程序。

三、WAR包部署注意事项

1、Port冲突

在Tomcat中部署WAR包时,应该避免端口冲突。启动Tomcat服务器并发布WAR包后,服务器可能会遇到端口占用问题。可以在Tomcat内的server.xml文件中更改端口号解决。除此之外,SpringBoot还支持使用外部的服务端口号,可以在application.properties或application.yml中指定。

2、静态资源访问

在WAR包部署下,src/main/resources/staticsrc/main/resources/public中的静态资源不再存在,会被打包进WAR包的根目录下。所以,URL和classpath访问这些文件时需要使用特定的相对路径,参考下面的代码:

  
  http://localhost:8080/{yourAppName}/{yourResourcePath}
  
  
  ClassPathResource resource = new ClassPathResource("/{yourResourcePath}");

3、数据源配置

在WAR包部署下,数据源的配置需要放在/WEB-INF/classes/application.propertiesapplication.yml文件中。示例如下:

  #Properties
  spring.datasource.url=jdbc:postgresql://localhost:5432/my_db
  spring.datasource.username=user
  spring.datasource.password=pass
  
  #YAML
  spring:
    datasource:
      url: jdbc:postgresql://localhost:5432/my_db
      username: user
      password: pass

4、JSP页面处理

在WAR包部署下,SpringBoot默认不支持使用JSP页面。我们需要进行额外的配置才能使其实现。通常需要在Web项目的配置文件中,添加如下代码:

  @Bean
  public InternalResourceViewResolver jspViewResolver() {
      InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
      viewResolver.setPrefix("/WEB-INF/jsp/");
      viewResolver.setSuffix(".jsp");
      return viewResolver;
  }

同时,也需要在application.properties/application.yml文件中配置视图文件的路径,如下所示:

  #Properties
  spring.mvc.view.prefix=/WEB-INF/jsp/
  spring.mvc.view.suffix=.jsp

  #YAML
  spring:
    mvc:
      view:
        prefix: /WEB-INF/jsp/
        suffix: .jsp

四、小结

通过本篇文章的详细介绍,我们了解到了SpringBoot WAR包部署的整个流程,包括如何打成WAR包、如何部署和相关注意事项。希望这些内容能够帮助您更好地了解War包部署。

最后,附上一个小例子,这个例子可以让你更好地理解本文所讲内容:

  package com.example.springbootdemo;
  
  import org.springframework.boot.SpringApplication;
  import org.springframework.boot.autoconfigure.SpringBootApplication;
  import org.springframework.web.bind.annotation.GetMapping;
  import org.springframework.web.bind.annotation.RestController;
  
  @SpringBootApplication
  @RestController
  public class SpringBootDemoApplication extends SpringBootServletInitializer {
  
      public static void main(String[] args) {
          SpringApplication.run(SpringBootDemoApplication.class, args);
      }
  
      @Override
      protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
          return application.sources(SpringBootDemoApplication.class);
      }
  
      @GetMapping("/")
      public String hello(){
          return "hello, world!";
      }
  
  }