Maven Web 应用

Maven Web 应用(完整实战 · 2025 最新版)

一句话总结
maven-archetype-webapp + jakarta.servlet + maven-war-plugin = 一键生成可部署 WAR 包,支持 Tomcat / Spring Boot 内嵌


一、项目结构(标准 Web)

my-web-app/
├── pom.xml
├── src/
│   ├── main/
│   │   ├── java/                 ← Servlet(可选)
│   │   ├── webapp/
│   │   │   ├── WEB-INF/
│   │   │   │   └── web.xml       ← 部署描述符
│   │   │   ├── index.jsp
│   │   │   └── css/style.css
│   └── test/
│       └── java/
└── target/                       ← 构建输出

二、创建 Web 项目(2 种方式)

方式 1:命令行快速生成

mvn archetype:generate \
  -DgroupId=com.example \
  -DartifactId=my-web-app \
  -DarchetypeArtifactId=maven-archetype-webapp \
  -DinteractiveMode=false

方式 2:IDEA 一键创建

  1. File → New → Project → Maven
  2. 选择 maven-archetype-webapp
  3. 填写 GAV → Finish

三、完整 pom.xml(最佳实践)

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
         https://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>my-web-app</artifactId>
    <version>1.0.0</version>
    <packaging>war</packaging> <!-- 关键:WAR 包 -->

    <name>My Web App</name>
    <description>一个 Maven 构建的 Web 应用</description>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <jakarta.servlet.version>5.0.0</jakarta.servlet.version>
    </properties>

    <dependencies>
        <!-- Jakarta EE API(Tomcat 提供) -->
        <dependency>
            <groupId>jakarta.servlet</groupId>
            <artifactId>jakarta.servlet-api</artifactId>
            <version>${jakarta.servlet.version}</version>
            <scope>provided</scope>
        </dependency>

        <!-- JSP API(可选) -->
        <dependency>
            <groupId>jakarta.servlet.jsp</groupId>
            <artifactId>jakarta.servlet.jsp-api</artifactId>
            <version>3.1.1</version>
            <scope>provided</scope>
        </dependency>

        <!-- JUnit 测试 -->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>5.10.3</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <finalName>${project.artifactId}</finalName>
        <plugins>
            <!-- WAR 打包插件 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>3.4.0</version>
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml> <!-- 允许无 web.xml -->
                    <warName>${project.artifactId}</warName>
                </configuration>
            </plugin>

            <!-- Tomcat 嵌入运行(开发) -->
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <port>8080</port>
                    <path>/</path>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

四、编写 Web 页面

src/main/webapp/index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Maven Web App</title>
    <link rel="stylesheet" href="css/style.css">
</head>
<body>
    <h1>Hello Maven Web!</h1>
    <p>当前时间: <%= new java.util.Date() %></p>
    <form action="hello" method="post">
        <input type="text" name="name" placeholder="输入姓名">
        <button type="submit">提交</button>
    </form>
</body>
</html>

src/main/webapp/css/style.css

body {
    font-family: Arial, sans-serif;
    text-align: center;
    margin-top: 50px;
    background: #f4f4f4;
}
h1 { color: #007bff; }

五、创建 Servlet(Java 控制层)

src/main/java/com/example/HelloServlet.java

package com.example;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        String name = req.getParameter("name");
        if (name == null || name.isEmpty()) name = "World";

        resp.setContentType("text/html;charset=UTF-8");
        PrintWriter out = resp.getWriter();
        out.println("<h2>Hello, " + name + "!</h2>");
        out.println("<a href='/'>返回</a>");
    }
}

六、配置 web.xml(可选,注解优先)

src/main/webapp/WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
         https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
         version="5.0">

    <display-name>My Web App</display-name>

    <!-- 欢迎页面 -->
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>

七、构建与运行

1. 打包 WAR

mvn clean package

输出:target/my-web-app.war

2. 运行嵌入 Tomcat(开发)

mvn tomcat7:run

访问:http://localhost:8080/

3. 部署到外部 Tomcat

  1. 复制 target/my-web-app.wartomcat/webapps/
  2. 启动 Tomcat → 自动解压并运行

八、Spring Boot Web 替代方案(推荐生产)

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.3.5</version>
</parent>

<packaging>jar</packaging>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>
@SpringBootApplication
public class WebApplication {
    public static void main(String[] args) {
        SpringApplication.run(WebApplication.class, args);
    }
}

运行:

mvn spring-boot:run

九、命令速查

命令作用
mvn clean package打包 WAR
mvn tomcat7:run启动嵌入 Tomcat
mvn war:war仅生成 WAR
mvn jetty:run使用 Jetty 运行

十、IDEA 集成

  1. 右键 pom.xmlMaven → Reimport
  2. 右键项目 → Run ‘tomcat7:run’
  3. 自动打开浏览器 http://localhost:8080

十一、常见问题

问题解决方案
404检查 web.xml 欢迎页
ClassNotFound添加 jakarta.servlet-api
web.xml 必须存在<failOnMissingWebXml>false</failOnMissingWebXml>
端口占用修改 <port>8081</port>

恭喜!你已成功构建 Maven Web 应用!


下一步推荐

方向内容
Spring Boot WebREST API + Thymeleaf
Docker 部署Dockerfile + WAR
Nginx 反向代理静态资源分离
CI/CD 部署GitHub Actions + Tomcat

需要 Spring Boot Web + Docker 完整模板
回复 Spring Web Docker 立即获取 GitHub 链接!

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注