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 一键创建
File → New → Project → Maven- 选择
maven-archetype-webapp - 填写 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
- 复制
target/my-web-app.war到tomcat/webapps/ - 启动 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 集成
- 右键
pom.xml→ Maven → Reimport - 右键项目 → Run ‘tomcat7:run’
- 自动打开浏览器
http://localhost:8080
十一、常见问题
| 问题 | 解决方案 |
|---|---|
404 | 检查 web.xml 欢迎页 |
ClassNotFound | 添加 jakarta.servlet-api |
web.xml 必须存在 | <failOnMissingWebXml>false</failOnMissingWebXml> |
端口占用 | 修改 <port>8081</port> |
恭喜!你已成功构建 Maven Web 应用!
下一步推荐
| 方向 | 内容 |
|---|---|
| Spring Boot Web | REST API + Thymeleaf |
| Docker 部署 | Dockerfile + WAR |
| Nginx 反向代理 | 静态资源分离 |
| CI/CD 部署 | GitHub Actions + Tomcat |
需要 Spring Boot Web + Docker 完整模板?
回复 Spring Web Docker 立即获取 GitHub 链接!