Skip to content

项目结构

GAVP

Maven 中的 GAVP 是指 GroupID、ArtifactID、Version 和 Packaging(可选)属性构成,主要是为每个项目在 Maven 仓库中做一个标识,方便后期项目之间引用依赖。

GAVP 遵循的规则:

  • GroupID 格式:com.{公司/BU}.业务线.[子业务线],最多 4 级。

    说明:{公司/BU},例如:alibaba/taobao、alibaba/tmall、alibaba/aliexpress 等 BU 一级;

    正例:com.taobao.tddl / com.alibaba.sourcing.multilang

  • ArtifactID 格式:产品线名-模块名。语义不重复不遗漏,先到仓库中心查证一下。

    正例:tc-client / uic-api / tair-tool / bookstore

  • Version 版本号格式推荐:主版本号.次版本号.修订号

    • 主版本号:当做了不兼容的 API 修改,或者增加了能改变产品方向的新功能;
    • 次版本号:当做了向下兼容的功能性新增(新增类、接口等);
    • 修订好:修复 bug,没有修改方法签名的功能加强,保持 API 兼容;
  • Packaging 规则:指示将项目打包为什么类型的文件。

    • packaging 属性为 jar(默认值),代表普通的 Java 工程,打包后是 .jar 结尾的文件;
    • packaging 属性为 war,代表 Java web 工程,打包后是 .war 结尾的文件;
    • packaging 属性为 pom,代表不会打包,用来做继承的父工程;
xml
<!-- Maven工程的坐标 -->
<groupId>com.geomind.maven</groupId>
<artifactId>maven_java</artifactId>
<version>1.0-SNAPSHOT</version>

<!-- Maven工程的打包方式,默认是jar包 -->
<packaging>jar</packaging>

目录结构

下面是 Maven web 项目的标准目录结构:

myapp/
|-- pom.xml                           # Maven 项目的核心配置文件,用于管理项目依赖、构建配置等
|-- src                               # 源代码和资源文件目录
|   |-- main                          # 项目的主要代码和资源
|   |   |-- java                      # Java 源代码目录
|   |   |   |-- com.geomind.myapp     # 项目的包结构,通常以公司域名反转命名
|   |   |   |   |-- controller        # 控制器层代码,处理 HTTP 请求和响应
|   |   |   |   |-- service           # 服务层代码,包含业务逻辑
|   |   |   |   |-- dao               # 数据访问层代码,负责与数据库交互
|   |   |   |   |-- model             # 数据模型目录,存放实体类
|   |   |-- resources                 # 资源文件目录,存放配置文件、静态资源等
|   |   |   |-- log4j.properties      # Log4j 日志配置文件
|   |   |   |-- spring-mybatis.xml    # Spring 和 MyBatis 的集成配置文件
|   |   |   |-- static                # 静态资源目录
|   |   |   |   |-- css               # CSS 样式文件目录
|   |   |   |   |-- js                # JavaScript 脚本文件目录
|   |   |   |   |-- images            # 图片资源目录
|   |   |-- webapp                    # Web 应用程序目录,存放 Web 相关文件
|   |   |   |-- WEB-INF               # Web 应用的配置目录,包含受保护的资源
|   |   |   |   |-- web.xml           # Web 应用的部署描述文件,配置 Servlet、过滤器等
|   |   |   |   |-- classes           # 编译后的 class 文件目录(通常由构建工具自动生成)
|   |   |   |-- index.html            # Web 应用的入口页面
|   |-- test                          # 测试代码目录
|   |   |-- java                      # 测试用的 Java 源代码目录
|   |   |-- resources                 # 测试用的资源文件目录

项目编译/打包

项目构建是指将源代码依赖库资源文件等转换为可执行或可部署的应用程序的过程。在这个过程中包括编译源代码、链接依赖库、打包和部署等多个步骤。

Maven项目构建流程

使用命令

使用命令构建有两种方式:

  • 手动CMD命令行:在项目的 pom.xml 所在文件夹下,打开 cmd 窗口,输入下列命令,进行项目构建;
  • IDEA生命周期插件:在 IDEA右侧 M图标的面板,找到对应项目的生命周期,双击执行命令;
命令描述
mvn clean清理编译/打包后的 target 文件夹
mvn test执行测试源码
mvn compile编译项目,生成 target 文件夹
mvn package打包项目,生成 jar/war 包
mvn install项目打包后上传到 Maven 本地仓库
mvn site生成站点
mvn deploy只打包,上传到 Maven 私服仓库

mvn install 的作用?

当 A 项目需要依赖 B 项目时,就需要通过 mvn install 将 B 项目打包并上传到 Maven 本地仓库,然后 A 项目才能够正常引用。

  1. 将 B 项目通过 mvn install 进行打包上传本地仓库;
  2. 在 A 项目中 pom.xml 中,通过引用 B 项目的坐标信息,进行引用依赖;
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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.geomind.maven</groupId>
  <artifactId>maven_web_A</artifactId>
  <version>1.0-SNAPSHOT</version>

  <packaging>war</packaging>

  <!-- 在maven_java_A中通过引入maven_java_B项目的坐标,将其引入当前项目 -->
  <dependencies>
    <dependency>
      <groupId>com.geomind.maven</groupId>
      <artifactId>maven_java_B</artifactId>
      <version>1.0-SNAPSHOT</version>
    </dependency>
  </dependencies>

  <properties>
    <maven.compiler.source>22</maven.compiler.source>
    <maven.compiler.target>22</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
</project>

项目配置

默认情况下,项目构建不需要额外配置,Maven 的 pom.xml 都有对应的默认配置。当然,我们也可以在 pom.xml 中定制一些配置,来修改默认构建的配置。

指定打包文件名称

在 pom.xml 的 <build> 标签中,添加 <finalName> 标签,自定义指定构建打包后的文件名称。

xml
<build>
  <!-- 打包以后的名称就是自定义的名称了 -->
  <finalName>custom-maven_web-1.0-SNAPSHOT</finalName>
</build>

指定打包文件路径

默认情况下,在 src/java 文件夹下添加的 java 类,在 resources 文件夹下添加的项目配置文件,它们都会被打包编译到 target/包名称/classes 文件夹下。

但是,有特殊情况,如果在 java 文件夹下创建配置文件,它会被打包编译到 classes 文件夹下吗?不会的

应用场景:mybatis 中有时候会将用于编写 SQL 语句的映射文件和 mapper 接口都写在 src/main/java 下的包中,此时映射文件就不会被打包,怎么解决呢?

在 pom.xml 中,增加下面的配置:

xml
<build>
  <resources>
    <resource>
      <directory>src/main/java</directory>
      <includes>
        <!-- 打包 src/main/java 任意文件夹下的 *.xml 文件 -->
        <include>**/*.xml</include>
      </includes>
    </resource>
    
    <resource>
      <directory>src/main/resources</directory>
      <includes>
        <!-- 打包 src/main/resources 任意文件夹下的 *.xml 文件 -->
        <include>**/*.xml</include>
      </includes>
    </resource>
  </resources>
</build>

配置三方插件

<build> 标签下引入插件,以 tomcat7 插件为例:

xml
<build>
  <plugins>
    <plugin>
      <groupId>org.apache.tomcat.maven</groupId>
      <artifactId>tomcat7-maven-plugin</artifactId>
      <version>2.2</version>
      <configuration>
        <port>8090</port>
        <path>/</path>
        <uriEncoding>UTF-8</uriEncoding>
        <server>tomcat7</server>
      </configuration>
    </plugin>
  </plugins>
</build>

配置完成后,在 Maven 可视化界面中,找到 Plugins -> tomcat7 -> tomcat7:run 命令,将其执行,此时控制台中会出现 localhost:8090 地址,点击即可看到在 webapp 下创建的 index.html 页面。

Released under the MIT License.