项目的目录结构
.
├── src/ # 项目源代码和资源根目录
│ ├── main/ # 项目主代码和资源
│ │ ├── java/ # 存放所有 Java 源代码
│ │ │ └── com/ # 对应 groupId 的第一个部分
│ │ │ └── example/ # 对应 groupId 的第二个部分
│ │ │ └── Main.java # 你的主类文件
│ │ └── resources/ # 存放非 Java 源代码的资源文件
│ └── test/ # 存放测试代码和资源
│ ├── java/ # 存放所有测试 Java 代码
│ └── resources/ # 存放测试用到的资源文件
├── .gitignore # Git 版本控制忽略文件
└── pom.xml # Maven 项目对象模型配置文件
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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>fist_my_maven_project</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
pom.xml 文件解释:
文件头
<?xml version="1.0" encoding="UTF-8"?>
,这是 XML 文件的标准头部声明,指定了 XML 版本和文件编码。这是所有 XML 文件的通用格式。
<project ...>
,这是 pom.xml 文件的根标签。所有的 Maven 项目配置都必须包含在这个标签内。xmlns 和 xmlns:xsi: 这两个是 XML 的命名空间声明,指定了 pom.xml 文件所遵循的 XML 模式(Schema)。这是为了让 XML 编辑器或解析器能够正确验证文件的结构。xsi:schemaLocation: 指定了 XML 模式文件的位置。这可以帮助 IDE 自动完成代码和检查语法错误。
<modelVersion>4.0.0</modelVersion>
,这是项目对象模型的版本。目前 Maven 2 和 Maven 3 都使用的是 4.0.0。这是一个固定值,通常不需要修改。
核心坐标
这三个标签定义了项目的唯一标识,它们是 Maven 中最重要的三个概念,被称为项目的坐标(Coordinate):
- com.example:
项目组 ID。它定义了项目所属的组织或项目组。通常使用组织的反向域名来命名,以确保唯一性。
- fist_my_maven_project:
项目 ID。它定义了项目本身的名称,通常与项目根目录的名称相同。
- 1.0-SNAPSHOT:
项目版本号。1.0 是主版本号。-SNAPSHOT 是一个特殊的标识符,它代表这个项目是快照版本(Snapshot Version)。这意味着它是一个正在开发中的版本,不稳定且随时可能更新。当 Maven 部署一个快照版本时,它会不断覆盖远程仓库中的旧版本,方便团队成员获取最新代码。相对地,正式版本(Release Version)没有 -SNAPSHOT 标识,例如 1.0。正式版本是稳定的、不可变的,一旦发布就不会被覆盖。
properties 标签
,这个标签用于定义一些变量。这些变量可以在 pom.xml 的其他地方被引用,类似于编程语言中的变量。这有助于集中管理配置,避免重复。
<maven.compiler.source>8</maven.compiler.source>:定义了项目的源代码编译版本。这告诉 Maven 编译器,你的 .java 文件是按照 Java 8 的语法编写的。
<maven.compiler.target>8</maven.compiler.target>:定义了编译后生成的字节码版本。这告诉 Maven 编译器,生成的 .class 文件需要兼容 Java 8 虚拟机。
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>:定义了项目的源文件编码。这确保了在不同操作系统上编译时,源代码中的中文或其他特殊字符不会出现乱码问题。
GAVP
GAVP 是 Maven 中用来唯一标识一个构件(artifact)的四个关键属性的缩写。这四个字母分别代表:GroupId、ArtifactId、Version、Packaging。
这四个元素共同构成了 Maven 构件的坐标,也叫坐标系(Coordinate System)。通过这个坐标,Maven 可以在仓库中准确地找到任何一个构件(比如一个 JAR 包、WAR 包或 POM 文件)。
- G - GroupId (项目组ID)
作用:定义了构件所属的项目组或组织。
格式:通常使用组织的反向域名来命名,例如 com.google.guava。
目的:确保项目组在全球范围内的唯一性。同一个 GroupId 下可以有多个项目(ArtifactId)。
- A - ArtifactId (项目ID)
作用:定义了项目本身的名称。
格式:通常是小写字母和连字符的组合,例如 guava。
目的:在 GroupId 范围内唯一标识一个项目。ArtifactId 的名称通常就是项目生成的可执行文件(比如 JAR 包)的名称。
- V - Version (版本号)
作用:定义了构件的版本。
格式:可以是任何字符串,但通常遵循某种版本号约定,例如 1.0.0、2.1-SNAPSHOT。
目的:区分不同版本的构件。
管理构件的生命周期:
- SNAPSHOT 版本:表示“快照”,不稳定、正在开发中的版本。当发布到仓库时,Maven 会覆盖同名的快照版本。
- RELEASE 版本:表示“发布”,稳定、不可修改的正式版本。一旦发布到仓库,就永远不会被覆盖。
Version 版本号格式推荐:版本号.次版本号.修订号
,主版本号:当做了不兼容的 API 修改,或者增加了能改变产品方向的新功能;次版本号:当做了向下兼容的功能性新增(新增类、接口等);修订号:修复 bug 或没有影响的代码修改,没有修改方法签名的功能加强,保持 API 兼容性。例如: 初始→1.0.0 修改 bug → 1.0.1 功能调整 → 1.1.1等。
- P - Packaging (打包类型)
作用:定义了项目打包的类型,也就是最终生成的文件的扩展名。
格式:通常是以下几种类型:
- jar:默认值,打包成 Java 库文件。
- war:用于 Web 应用,打包成 Web 归档文件。
- pom:如果项目只是一个聚合父项目,它本身不生成任何可执行文件。
- maven-plugin:如果项目是一个 Maven 插件。
目的:告诉 Maven 如何处理和打包这个项目,以及最终生成什么类型的文件。
举例说明
以我们经常使用的 JUnit 测试框架为例,它的 pom.xml 中可能包含以下依赖声明:
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.9.1</version>
<packaging>jar</packaging>
</dependency>
这个 GAVP 坐标告诉 Maven:
G: org.junit.jupiter 这个组织下的
A: junit-jupiter-api 这个项目
V: 的 5.9.1 这个版本
P: 以 .jar 的形式存在
通过这个唯一的 GAVP 坐标,Maven 就可以在全球任何一个 Maven 仓库中精确地找到并下载这个特定的 JAR 包。这就是 Maven 强大的依赖管理能力的基础。