返回介绍

8.2.1 构建 WAR 文件

发布于 2025-04-21 21:10:11 字数 3225 浏览 0 评论 0 收藏

实际上,构建 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 的 DispatcherServletSpringBootServletInitializer 还会在 Spring 应用程序上下文里查找 FilterServletServletContextInitializer 类型的 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 数据库。开发应用程序时,嵌入式数据库很好用,但对生产环境而言这不是一个明智的选择。让我们来看看如何在部署到生产环境时选择不同的数据源。

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。