1. 概述

Web应用资源或Web应用存档通常被称为WAR文件。WAR文件用于在应用服务器中部署Java EE web应用。在一个WAR文件内,所有的web组件都被打包成一个单一单元,包括JAR文件、JavaServer Pages(JSP)、Java servlet、Java类文件、XML文件、HTML文件和其他web应用所需的资源文件。

Maven 是一个广泛应用于Java EE项目的流行构建管理工具,用于处理编译、打包和依赖项管理等构建任务。我们可以使用Maven的WAR插件将项目构建为WAR文件。

在这个教程中,我们将探讨如何使用Maven WAR插件与Java EE应用一起工作。为此,我们将创建一个简单的Maven Spring Boot web应用,并从它生成WAR文件。

2. 设置Spring Boot Web应用

让我们创建一个简单的Maven、Spring Boot和Thymeleaf web应用,以展示WAR文件生成的过程。

首先,我们需要在pom.xml文件中添加构建Spring Boot web应用所需的依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
</dependency>

接下来,我们创建MainController类。在这个类中,我们将创建一个简单的GET控制器方法来查看我们的HTML文件:

@Controller
public class MainController {

    @GetMapping("/")
    public String viewIndexPage(Model model) {
        model.addAttribute("header", "Maven Generate War");
        return "index";
    }
}

最后,是时候创建我们的index.html文件了。项目中也包含了Bootstrap CSS文件,我们在index.html文件中使用了一些CSS类:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Index</title>
    <!-- Bootstrap core CSS -->
    <link th:href="@{/css/bootstrap.min.css}" rel="stylesheet">
</head>
<body>
    <nav class="navbar navbar-light bg-light">
        <div class="container-fluid">
            <a class="navbar-brand" href="#">
                Baeldung Tutorial
            </a>
        </div>
    </nav>
    <div class="container">
        <h1>[[${header}]]</h1>
    </div>
</body>
</html>

3. Maven WAR插件

Maven WAR插件负责收集并编译web应用的所有依赖项、类和资源,将其打包成一个web应用存档。

Maven WAR插件有一些预定义的目标:

  • war:这是项目打包阶段默认调用的目标。如果packaging类型为war,则会生成WAR文件。
  • exploded:这个目标通常用于项目开发阶段,以加快测试速度。它会在指定目录下生成展开的web应用。
  • inplace:这是exploded目标的一种变体。它将在web应用文件夹内部生成展开的web应用。

现在,让我们将Maven WAR插件添加到pom.xml文件中:

<plugin>
    <artifactId>maven-war-plugin</artifactId>
    <version>3.4.0</version>
</plugin>

当我们执行mvn install命令时,WAR文件将在target目录中生成。使用mvn:war:exploded命令,我们可以将展开的WAR作为目录生成到target目录内。这是一个普通的目录,WAR文件内的所有文件都包含在展开的WAR目录中。

4. 包含或排除WAR文件内容

通过Maven WAR插件,我们可以过滤WAR文件的内容。 让我们配置Maven WAR插件,使其在WAR文件中包含一个additional_resources文件夹:

<plugin>
    <artifactId>maven-war-plugin</artifactId>
    <version>3.4.0</version>
    <configuration>
        <webResources>
            <resource>
                <directory>additional_resources</directory>
            </resource>
        </webResources>
    </configuration>
</plugin>

执行mvn install命令后,additional_resources文件夹下的所有内容都将出现在WAR文件中。这对于需要向WAR文件添加额外资源(如报告)的情况非常有用。

5. 编辑Manifest文件

Maven WAR插件允许自定义manifest文件。 例如,我们可以将类路径添加到manifest文件中。这对于WAR文件处于更复杂结构以及需要在多个模块之间共享项目依赖的情况非常有帮助。

让我们配置Maven WAR插件,将类路径添加到manifest文件中:

<plugin>
    <artifactId>maven-war-plugin</artifactId>
    <version>3.4.0</version>
    <configuration>
        <archive>
            <manifest>
                <addClasspath>true</addClasspath>
            </manifest>
        </archive>
    </configuration>
</plugin>

6. 总结

在这篇简短的教程中,我们讨论了如何使用Maven构建工具生成WAR文件。我们创建了一个Maven Spring Boot web应用作为示例。为了生成WAR文件,我们使用了一个名为Maven WAR插件的特殊插件。

完整的源代码示例可在GitHub上找到。