杰瑞科技汇

Java Web项目目录结构该如何规范?

  1. 传统 Java Web 项目(Maven 多模块项目):这是学习 Java Web 开发的基础,结构清晰,职责分明。
  2. Spring Boot 项目:目前业界的主流,结构更简洁,约定大于配置。

传统 Java Web 项目目录结构 (Maven 多模块)

这种结构通常由一个父 POM (pom.xml) 和多个子模块(如 domain, dao, service, web)组成,我们主要关注 web 模块,因为它最终会被打包成 .war 文件并部署到 Tomcat 等服务器上。

一个典型的多模块项目结构如下:

my-web-project/
├── pom.xml                          # 父 POM,管理所有公共依赖和版本
│
├── my-web-domain/                   # 领域层/实体层模块
│   ├── pom.xml
│   └── src/
│       └── main/
│           └── java/
│               └── com/
│                   └── example/
│                       └── entity/
│                           └── User.java
│
├── my-web-dao/                      # 数据访问层模块
│   ├── pom.xml
│   └── src/
│       └── main/
│           └── java/
│               └── com/
│                   └── example/
│                       └── dao/
│                           └── UserDao.java
│           └── resources/
│               └── mapper/          # MyBatis Mapper XML 文件
│                   └── UserMapper.xml
│
├── my-web-service/                  # 业务逻辑层模块
│   ├── pom.xml
│   └── src/
│       └── main/
│           └── java/
│               └── com/
│                   └── example/
│                       └── service/
│                           ├── UserService.java
│                           └── impl/
│                               └── UserServiceImpl.java
│
└── my-web-web/                      # 表现层/Web 层模块 (最终打包成 WAR)
    ├── pom.xml
    └── src/
        ├── main/
        │   ├── java/
        │   │   └── com/
        │   │       └── example/
        │   │           └── web/
        │   │               ├── controller/
        │   │               │   └── UserController.java
        │   │               ├── filter/
        │   │               │   └── CharacterEncodingFilter.java
        │   │               └── listener/
        │   │                   └── MyContextListener.java
        │   │
        │   ├── resources/
        │   │   └── log4j2.xml       # 日志配置文件
        │   │
        │   └── webapp/              # *** 核心:Web 应用根目录 ***
        │       ├── WEB-INF/         # *** 核心:存放敏感和配置文件的目录 ***
        │       │   ├── web.xml      # *** 核心:Web 应用部署描述符 ***
        │       │   ├── lib/         # *** 核心:存放项目依赖的 JAR 包 ***
        │       │   └── classes/     # *** 核心:存放编译后的 .class 文件 ***
        │       │
        │       ├── index.html       # 静态页面
        │       ├── static/
        │       │   ├── css/
        │       │   ├── js/
        │       │   └── images/
        │       └── META-INF/
        │           └── context.xml
        │
        └── test/
            └── java/
                └── com/
                    └── example/
                        └── web/
                            └── controller/
                                └── UserControllerTest.java

核心目录详解 (以 webapp 为中心)

  1. src/main/webapp:

    • 这是 Web 应用的根目录,所有对外暴露的资源(如 HTML, CSS, JS, 图片等)都放在这里。
    • 当你访问 http://yourdomain.com/ 时,服务器默认会查找此目录下的 index.htmlindex.jsp
  2. webapp/WEB-INF:

    • 这是一个受保护的目录,客户端无法直接通过 URL 访问该目录下的任何文件。
    • web.xml: Web 应用部署描述符,在 Servlet 3.0 之前,这是配置 Servlet, Filter, Listener, Session 配置等的核心文件,现在虽然很多配置可以通过注解完成,但 web.xml 仍然非常重要,尤其是在定义欢迎页面、错误页面、上下文参数等方面。
    • lib/: 存放当前 Web 项目特有的、没有被 Maven 管理的第三方 JAR 包,在现代 Maven/Gradle 项目中,通常依赖都由构建工具管理,这个目录用得较少,但了解其作用很重要。
    • classes/: 存放编译后的 Java 类文件(.class 文件)和资源文件(如 .properties, .xml),在 Maven 项目中,这个目录是自动生成的,src/main/java 下的源代码被编译后会放到这里,src/main/resources 下的文件也会被复制到这里。
  3. src/main/java:

    • 存放所有的 Java 源代码文件,如 Controller, Service, DAO 等,这些代码最终会被编译并放入 WEB-INF/classes 目录。
  4. src/main/resources:

    • 存放非代码的资源文件
      • MyBatis 的 Mapper XML 文件
      • 数据库连接配置文件 (jdbc.properties)
      • 日志配置文件 (log4j2.xml, logback.xml)
      • Spring 的 XML 配置文件 (老式项目)
    • Maven 在构建项目时,会自动将 resources 目录下的所有文件原封不动地复制到 WEB-INF/classes 目录下。

Spring Boot 项目目录结构

Spring Boot 采用“约定大于配置”的原则,目录结构更简洁,它不再需要 webapp 目录和 web.xml 文件,整个项目通常被打包成一个可执行的 JAR 文件。

一个典型的 Spring Boot 项目结构如下:

my-spring-boot-project/
├── pom.xml                          # Spring Boot 项目的 POM
│
├── mvnw*                            # Maven Wrapper (可选)
├── mvnw.cmd                         # Maven Wrapper (可选)
│
└── src/
    ├── main/
    │   ├── java/
    │   │   └── com/
    │   │       └── example/
    │   │           └── demo/
    │   │               ├── DemoApplication.java   # *** 核心:启动类 ***
    │   │               ├── controller/
    │   │               │   └── HelloController.java
    │   │               ├── service/
    │   │               │   └── HelloService.java
    │   │               └── model/
    │   │                   └── User.java
    │   │
    │   ├── resources/
    │   │   ├── application.properties     # *** 核心:全局配置文件 ***
    │   │   ├── application.yml           # *** 核心:全局配置文件 (YAML格式) ***
    │   │   ├── static/                   # *** 核心:存放静态资源 ***
    │   │   │   ├── css/
    │   │   │   ├── js/
    │   │   │   └── images/
    │   │   ├── templates/                # *** 核心:存放模板文件 (如 Thymeleaf, FreeMarker) ***
    │   │   │   └── index.html
    │   │   └── application-dev.properties # 开发环境配置文件
    │   │
    │   └── ...                          # 其他资源
    │
    └── test/
        └── java/
            └── com/
                └── example/
                    └── demo/
                        └── DemoApplicationTests.java

核心目录详解 (以 resources 为中心)

  1. src/main/java:

    • 存放所有 Java 源代码。
    • DemoApplication.java: 项目的启动类,这个类必须包含 @SpringBootApplication 注解,main 方法是整个应用的入口,Spring Boot 会自动扫描该类及其子包下的所有组件(如 @Controller, @Service)。
  2. src/main/resources:

    • application.properties / application.yml: 核心配置文件,用于配置数据源、服务器端口、日志级别、MyBatis/JPA 等各种 Spring Boot 的属性。
    • static/: 存放静态资源,当访问 http://yourdomain.com/css/style.css 时,Spring Boot 会自动从这里查找 style.css 文件,这与传统 Web 项目的 webapp 目录下的静态资源作用类似。
    • `templates/ 存放模板引擎的文件(如 Thymeleaf, FreeMarker, Velocity),这些文件不能**直接通过 URL 访问,必须通过 Controller 渲染后才能返回给用户。
    • public/: 存放公共静态资源。staticpublic 目录下有同名文件,public 目录下的优先级更高,它和 static 的作用基本一致。
    • static, public, templates 的优先级:templates > static/public

总结与对比

特性 传统 Java Web (WAR) Spring Boot (JAR)
核心目录 src/main/webapp src/main/java (启动类) & src/main/resources
配置文件 web.xml (部署描述符) application.properties / application.yml (全局配置)
静态资源 webapp 目录下 src/main/resources/staticpublic 目录下
模板文件 webapp 目录下 src/main/resources/templates 目录下
依赖管理 手动或在 pom.xml 中声明,依赖最终进入 WEB-INF/lib spring-boot-starter-* 依赖,由 Maven/Gradle 统一管理
部署方式 打包成 .war,部署到外部 Tomcat 打包成可执行 .jar,内嵌 Tomcat,直接运行 java -jar
结构特点 模块化,结构清晰,职责分明 简洁,约定大于配置,快速开发

理解这两种目录结构对于 Java Web 开发至关重要,传统结构让你明白 Web 应用的底层原理,而 Spring Boot 结构则是当前高效开发的实际应用。

分享:
扫描分享到社交APP
上一篇
下一篇