8.2.1 构建 WAR 文件
实际上,构建 WAR 文件并不困难。如果你使用 Gradle 来构建应用程序,只需应用 WAR 插件即可:
apply plugin: 'war'
随后,在 build.gradle 里用以下 war 配置替换原来的 jar 配置:
war {
baseName = 'readinglist'
version = '0.0.1-SNAPSHOT'
}
两者的唯一区别就是 j 换成了w 。
如果使用 Maven 构建项目,获取 WAR 文件会更容易。只需把 <packaging> 元素的值从 jar 改为 war 。
<packaging>war</packaging>
这样就能生成 WAR 文件了。但如果 WAR 文件里没有启用 Spring MVC DispatcherServlet 的 web.xml 文件或者 Servlet 初始化类,这个 WAR 文件就一无是处。
此时就该 Spring Boot 出马了。它提供的 SpringBootServletInitializer 是一个支持 Spring Boot 的 Spring WebApplicationInitializer 实现。除了配置 Spring 的 DispatcherServlet , SpringBootServletInitializer 还会在 Spring 应用程序上下文里查找 Filter 、 Servlet 或 ServletContextInitializer 类型的 Bean,把它们绑定到 Servlet 容器里。
要使用 SpringBootServletInitializer ,只需创建一个子类,覆盖 configure() 方法来指定 Spring 配置类。代码清单 8-1 是 ReadingListServletInitializer ,也就是我们为阅读列表应用程序写的 SpringBootServletInitializer 的子类。
代码清单 8-1 为阅读列表应用程序扩展 SpringBootServletInitializer
package readinglist;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.context.web.SpringBootServletInitializer;
public class ReadingListServletInitializer
extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(
SpringApplicationBuilder builder) {
return builder.sources(Application.class); ←---指定 Spring 配置
}
}
如你所见, configure() 方法传入了一个 SpringApplicationBuilder 参数,并将其作为结果返回。期间它调用 sources() 方法注册了一个 Spring 配置类。本例只注册了一个 Application 类。回想一下,这个类既是启动类(带有 main() 方法),也是一个 Spring 配置类。
虽然阅读列表应用程序里还有其他 Spring 配置类,但没有必要在这里把它们全部注册进来。 Application 类上添加了 @SpringBootApplication 注解。这会隐性开启组件扫描,而组件扫描则会发现并应用其他配置类。
现在我们可以构建应用程序了。如果使用 Gradle,你只需调用 build 任务即可:
$ gradle build
没问题的话,你可以在 build/libs 里看到一个名为 readinglist-0.0.1-SNAPSHOT.war 的文件。
对于基于 Maven 的项目,可以使用 package :
$ mvn package
成功构建之后,你可以在 target 目录里找到 WAR 文件。
剩下的工作就是部署应用程序了。应用服务器不同,部署过程会有所区别,因此请参考应用服务器的部署说明文档。
对于 Tomcat 而言,可以把 WAR 文件复制到 Tomcat 的 webapps 目录里。如果 Tomcat 正在运行(要是没有运行,则在下次启动时检测),则会检测到 WAR 文件,解压并进行安装。
假设你没有在部署前重命名 WAR 文件, Servlet 上下文路径会与 WAR 文件的主文件名相同,在本例中是/readinglist-0.0.1-SNAPSHOT。用你的浏览器打开 http://server:port/readinglist-0.0.1-SNAPSHOT 就能访问应用程序了。
还有一点值得注意:就算我们在构建的是 WAR 文件,这个文件仍旧可以脱离应用服务器直接运行。如果你没有删除 Application 里的 main() 方法,构建过程生成的 WAR 文件仍可直接运行,一如可执行的 JAR 文件:
$ java -jar readinglist-0.0.1-SNAPSHOT.war
这样一来,同一个部署产物就能有两种部署方式了!
现在,应用程序应该已经在 Tomcat 里顺利地运行起来了。但是它还在使用内嵌的 H2 数据库。开发应用程序时,嵌入式数据库很好用,但对生产环境而言这不是一个明智的选择。让我们来看看如何在部署到生产环境时选择不同的数据源。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论