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/static
或src/main/resources/public
中的静态资源不再存在,会被打包进WAR包的根目录下。所以,URL和classpath访问这些文件时需要使用特定的相对路径,参考下面的代码:
http://localhost:8080/{yourAppName}/{yourResourcePath} ClassPathResource resource = new ClassPathResource("/{yourResourcePath}");
3、数据源配置
在WAR包部署下,数据源的配置需要放在/WEB-INF/classes/application.properties
或application.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!"; } }