工程构建
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,代表不会打包,用来做继承的父工程;
目录结构
下面是 Maven web 程序的标准目录结构:
maven_web/
|-- pom.xml # Maven 项目的核心配置文件,用于管理项目依赖、构建配置等
|-- src/ # 源代码和资源文件目录
| |-- main/ # 项目的主要代码和资源
| | |-- java/ # Java 源代码目录
| | | |-- com/example/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/ # 测试用的资源文件目录
项目构建
项目构建是指将源代码、依赖库和资源文件等转换为可执行或可部署的应用程序的过程。在这个过程中包括编译源代码、链接依赖库、打包和部署等多个步骤。
命令构建
在项目的 pom.xml 所在文件夹下,打开 cmd 窗口,输入下列命令,进行项目构建:
命令 | 描述 |
---|---|
mvn compile | 编译项目,生成 target 文件夹 |
mvn package | 打包项目,生成 jar / war 包 |
mvn clean | 清理编译或者打包后的项目结构 |
mvn install | 打包后上传到 Maven 本地仓库 |
mvn deploy | 只打包,上传到 Maven 私服仓库 |
mvn site | 生成站点 |
mvn test | 执行测试源码 |
mvn install
作用?
当我们有 A 项目需要依赖 B 项目时,就需要通过 mvn install 将 B 项目打包并上传到 Maven 本地仓库,然后 A 项目才能够正常引用。
- 将 B 项目通过 mvn install 进行打包上传本地参考;
- 在 A 项目中 pom.xml 中,通过引用 B 项目的坐标信息,进行引用依赖;
xml
<?xml version="1.0" encoding="UTF-8"?>
<!--suppress ALL -->
<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>
<!-- Maven工程的坐标 -->
<groupId>com.geomind.maven</groupId>
<artifactId>maven_java</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- Maven工程的打包方式,默认是jar包 -->
<packaging>jar</packaging>
<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>
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</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<!-- 通过 maven_java 项目的坐标,将其引入当前项目 -->
<dependency>
<groupId>com.geomind.maven</groupId>
<artifactId>maven_java</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>
依赖管理
依赖版本提取
当我们有多个包需要版本一致时,就可以适用依赖版本统一提取的方式,在 properties
中提取,在 dependency
中通过 ${}
统一使用。
xml
<properties>
<maven.compiler.source>22</maven.compiler.source>
<maven.compiler.target>22</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- 名称可以自定义,这样可以统一管理 spring 相关的包版本 -->
<spring.version>6.2.3</spring.version>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>