🧩 Maven 项目 vs Maven Web 项目 --- 全面对比总结
| 对比项 | Maven 项目(普通 Maven Java 项目) | Maven Web 项目(Maven + Web 应用) |
|---|---|---|
| 项目用途 | 用于开发普通的 Java 应用程序(如控制台程序、工具、算法、后台服务等) | 用于开发 Web 应用程序(运行在 Servlet 容器中,如 Tomcat、Jetty) |
| 打包类型(packaging) | jar(默认) |
war(需要指定) |
| 构建结果 | 生成一个 .jar 包 |
生成一个 .war 包 |
| 运行方式 | 直接运行 jar(如:java -jar myapp.jar) |
需要部署到 Web 容器(Tomcat/Jetty)运行 |
| 目录结构(关键区别) | 标准 Java 结构:\nsrc/main/java\nsrc/main/resources\nsrc/test/java\n |
标准 Web 结构(多了 webapp):\nsrc/main/java\nsrc/main/resources\nsrc/main/webapp/WEB-INF/web.xml\n |
| 是否有 Web 目录 | ❌ 没有 webapp |
✅ 有 src/main/webapp |
| 是否需要 Web 容器运行 | ❌ 不需要 | ✅ 需要(Tomcat / Jetty 等) |
| 是否包含 web.xml | ❌ 无 | ✅ 有(WEB-INF/web.xml 或注解配置) |
| 依赖的 servlet API | 不需要 | 需要添加 jakarta.servlet-api(scope=provided) |
| 项目 archetype(原型) | maven-archetype-quickstart(默认 Java) |
maven-archetype-webapp(Web 原型) |
| 运行示例 | bash\nmvn compile\nmvn package\njava -jar target/myapp.jar\n |
bash\nmvn package\n# 生成 target/myapp.war\n# 部署到 Tomcat 的 webapps 目录\n |
| 主要配置文件 | pom.xml |
pom.xml + WEB-INF/web.xml |
| 典型用途 | 后台逻辑、算法模块、工具包、SDK、API 客户端等 | 网站、管理系统、Web 接口、JSP/Servlet、SSM 框架等 |
| 依赖管理 | Maven 负责 | Maven 负责(加上 Web 特殊依赖) |
| 开发框架常见组合 | 纯 Java、Spring(非 Web)、工具类库 | SSM(Spring + SpringMVC + MyBatis)、JSP、Servlet、Spring Boot(打成 war) |
| 部署方式 | 直接运行 jar | 上传 war 到服务器的 Tomcat、Jetty、WebLogic 等容器中 |
📂 示例对比
✅ Maven 普通项目目录结构
my-app/
├─ src/
│ ├─ main/java/com/example/
│ │ └─ App.java
│ └─ test/java/com/example/
│ └─ AppTest.java
├─ pom.xml
└─ target/
pom.xml(默认 jar)
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>my-app</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- 一般依赖 -->
</dependencies>
</project>
打包后:target/my-app-1.0-SNAPSHOT.jar
✅ Maven Web 项目目录结构
my-webapp/
├─ src/
│ ├─ main/
│ │ ├─ java/com/example/web/
│ │ │ └─ HelloServlet.java
│ │ ├─ resources/
│ │ └─ webapp/
│ │ ├─ WEB-INF/
│ │ │ └─ web.xml
│ │ └─ index.jsp
│ └─ test/java/
├─ pom.xml
└─ target/
pom.xml(打包为 war)
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>my-webapp</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>5.0.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
打包后:target/my-webapp.war
部署:把 war 文件放到 Tomcat/webapps/ 下运行。
🧱 Maven 项目 vs Maven Web 项目 --- 结构与流程对比图
一、项目结构对比
📦 普通 Maven 项目(packaging: jar)
my-app/
├─ pom.xml ← 项目核心配置
├─ src/
│ ├─ main/
│ │ ├─ java/ ← 源码目录
│ │ │ └─ com/example/App.java
│ │ └─ resources/ ← 配置文件(如 log4j.properties)
│ └─ test/
│ ├─ java/ ← 单元测试代码
│ └─ resources/
└─ target/
└─ my-app-1.0.jar ← 输出的可执行 jar 包
📦 Maven Web 项目(packaging: war)
my-webapp/
├─ pom.xml ← 项目核心配置
├─ src/
│ ├─ main/
│ │ ├─ java/ ← 业务逻辑、Servlet 类
│ │ │ └─ com/example/web/HelloServlet.java
│ │ ├─ resources/ ← Spring/MyBatis 等配置文件
│ │ └─ webapp/ ← Web 根目录(HTML、JSP、静态资源)
│ │ ├─ index.jsp
│ │ └─ WEB-INF/
│ │ └─ web.xml ← Web 应用描述符(Servlet 映射等)
│ └─ test/
│ └─ java/
└─ target/
└─ my-webapp.war ← 输出的 Web 应用 war 包
二、构建与运行流程对比
flowchart TD
subgraph A["普通 Maven 项目(jar)"]
A1["1. 编写 Java 代码"] --> A2["2. mvn compile"]
A2 --> A3["3. 生成 class 文件"]
A3 --> A4["4. mvn package"]
A4 --> A5["5. 生成 my-app.jar"]
A5 --> A6["6. java -jar 运行"]
end
subgraph B["Maven Web 项目(war)"]
B1["1. 编写 Servlet / JSP"] --> B2["2. mvn compile"]
B2 --> B3["3. 生成 class 文件"]
B3 --> B4["4. mvn package (war)"]
B4 --> B5["5. 生成 my-webapp.war"]
B5 --> B6["6. 部署到 Tomcat/webapps"]
B6 --> B7["7. 浏览器访问 http://localhost:8080"]
end
三、关键区别速记表
| 对比项 | Maven 项目 | Maven Web 项目 |
|---|---|---|
| 打包类型 | jar | war |
| 输出产物 | 可执行 jar 文件 | 可部署的 war 包 |
| 是否含 Web 目录 | ❌ 无 | ✅ 有 src/main/webapp |
| 是否需容器运行 | ❌ 直接运行 | ✅ Tomcat/Jetty |
| 配置文件 | pom.xml |
pom.xml + WEB-INF/web.xml |
| 典型用途 | 工具类、SDK、后台服务 | 网站、SSM 项目、JSP/Servlet 应用 |
| 运行方式 | java -jar |
部署到 Tomcat |
| 依赖 servlet-api | 不需要 | 必需(scope=provided) |
四、选型建议图
想做什么? 👇
📘 写普通 Java 程序 / 工具?
→ ✅ 普通 Maven 项目(jar)
🌐 写 JSP / Servlet / SSM Web 系统?
→ ✅ Maven Web 项目(war)
🚀 想快速写 Web 接口 / 微服务?
→ ✅ Spring Boot 项目(jar,可直接运行)