maven GAVP 的含义
GAVP 是 Maven 坐标系统的核心,它唯一地标识了一个项目、一个依赖项或者一个插件。这四个属性就像是 Maven 世界中的“身份证”,确保了每个构件都能被准确地定位和引用。
1. GAVP 的含义
GAVP 是四个单词首字母的缩写:
- G:
groupId
- 组ID - A:
artifactId
- 构件ID - V:
version
- 版本 - P:
packaging
- 打包方式
它们共同定义了一个 Maven 项目或构件的坐标。
2. 每个属性的详细解释
a. groupId
(组ID)
- 作用: 表示项目所属的组织或公司。它通常遵循 Java 的包名规范,即使用你拥有的域名的反向书写,以确保全球唯一性。
- 格式: 使用点号分隔,例如
com.google.guava
。 - 示例:
- Apache 软件基金会的项目通常以
org.apache
开头,如org.apache.maven
。 - 你自己的公司项目可能叫
com.yourcompany.yourapp
。
- Apache 软件基金会的项目通常以
b. artifactId
(构件ID)
- 作用: 代表项目本身或模块的唯一名称。在一个
groupId
下,artifactId
必须是唯一的。 - 格式: 通常使用连字符分隔的小写字母,例如
maven-compiler-plugin
。 - 示例: 在
org.apache.maven.plugins
这个组下,有maven-compiler-plugin
、maven-surefire-plugin
等不同的构件。
c. version
(版本)
- 作用: 指定项目的当前版本。Maven 的版本管理非常强大,支持快照(SNAPSHOT)、发布版等。
- 格式: 通常遵循
主版本.次版本.增量版本-限定符
的格式,例如1.8.0
,2.5.4
。- SNAPSHOT(快照): 表示该版本处于开发阶段,是不稳定的。Maven 会定期检查远程仓库是否有新的快照版本,例如
1.0.0-SNAPSHOT
。 - Release(发布版): 表示稳定的发布版本,例如
1.0.0
,2.5.4-RELEASE
。
- SNAPSHOT(快照): 表示该版本处于开发阶段,是不稳定的。Maven 会定期检查远程仓库是否有新的快照版本,例如
- 示例:
3.8.1
,1.0-SNAPSHOT
。
d. packaging
(打包方式)
- 作用: 定义了项目构建后生成的构件的类型。如果不指定,默认值是
jar
。 - 常见类型:
jar
: 普通的 Java JAR 包。war
: Web 应用程序包。pom
: 通常用于父 POM 或聚合项目(多模块项目),它本身不生成构件,只用于管理依赖和配置。ear
: 企业级应用程序包(用于 Java EE)。maven-plugin
: Maven 插件。
3. 在 pom.xml
中的体现
一个典型的 pom.xml
文件的开头部分就会定义 GAVP:
<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><!-- G: Group ID --><groupId>com.example</groupId><!-- A: Artifact ID --><artifactId>my-awesome-app</artifactId><!-- V: Version --><version>1.0.0-SNAPSHOT</version><!-- P: Packaging (可选,默认为 jar) --><packaging>war</packaging>...
</project>
4. GAVP 如何构成仓库路径
Maven 使用 GAVP 信息来定位和存储构件在本地仓库或远程仓库中的位置。规则如下:
groupId
中的点(.
)会被替换成路径分隔符(/
),然后加上 artifactId
,version
,最后是构件文件。
构件文件名格式: artifactId-version[-classifier].packaging
[-classifier]
是一个可选的分类器,用于区分具有相同 GAVP 但内容不同的构件,例如jdk8
或sources
(源代码包)。
示例:
对于坐标:
groupId: com.example
artifactId: my-lib
version: 1.0.0
packaging: jar
它在 Maven 仓库中的路径将是:
~/.m2/repository/com/example/my-lib/1.0.0/my-lib-1.0.0.jar
5. 扩展:GAV 与 GAVP
你可能会经常听到 GAV 这个说法。这是因为 packaging
有时被认为是可选的(因为有默认值 jar
),或者它的信息已经隐含在构件的文件名中了。因此,在非严格场合下,人们常用 GAV 来指代 Maven 坐标。
- GAV: 最核心的三个坐标。
- GAVP: 更完整的坐标,包含了打包方式。
总结
属性 | 含义 | 示例 | 必要性 |
---|---|---|---|
groupId | 组织/公司唯一标识 | org.springframework.boot | 必需 |
artifactId | 项目/模块唯一标识 | spring-boot-starter-web | 必需 |
version | 项目版本 | 2.7.0 | 必需 |
packaging | 打包方式 | jar (默认), war , pom | 可选 |
理解 GAVP 是理解 Maven 依赖管理、仓库管理和多模块项目的基础。