作为依赖管理工具,Maven定义了坐标用于唯一标识构件在仓库中的位置,构成了依赖管理的底层基础。
Maven构件的坐标包括:
- groupId定义隶属实际项目的名称,一般是隶属组织或公司域名的倒序加上实际项目名称;
- artifactId定义模块的名称,一般是实际项目名称加上子模块名称。一个模块可能包含多个子模块,便于模块化管理;
- version定义模块的版本,主要包括稳定版本和SNAPSHOT版本;
- packaging定义模块的打包方式,常用的打包方式包括:
- jar是普通模块的打包方式,即不在POM文件中显式指定packaging元素时默认的打包方式,生成构件的后缀名为.jar;
- maven-plugin是Maven插件项目的打包方式,生成构件的后缀名为.jar;
- pom是父模块的打包方式,负责组织子模块,只生成目录结构,不生成构件;
- war是Web项目的打包方式,构建成功后可以直接放入Tomcat等Web容器运行,生成构件的后缀名为.war;
可见项目的打包方式和生成构件的后缀名虽然有一定的联系,但不是一一对应关系。 - classifier定义项目的附属构件,包括同时发布的JavaDoc、源代码等,不能在POM文件中显式指定,只能由指定的Maven插件帮助生成,如Maven JavaDoc Plugin、Maven Sources Plugin等。
其中groupId、artifactId和version必须指定,最终构件的文件名形如artifactId-version[-classifier].packaging。
实例
获取Spring Security 3.2.5版本,打开对应的POM文件可以看到如下定义:
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>3.2.5.RELEASE</version>
根据坐标的知识可以得出:
- 组织的域名是springframework.org,实际项目名称是security;
- 模块的名称是spring-security-web;
- 模块的版本是3.2.5.RELEASE,是稳定的发布版本;
- 模块使用默认的打包方式,不包含子模块,生成构件的后缀名为.jar;
- 最终构件的文件名为spring-security-web-3.2.5.RELEASE.jar。
结合文件系统的目录结构,构件在仓库中位于org/springframework/security/spring-security-web/3.2.5.RELEASE/spring-security-web-3.2.5.RELEASE.jar。
问答
1. 为什么要在groupId末尾加上实际项目名称?假设一个公司的多个Maven项目都包含子模块:
A项目
<groupId>org.company</groupId>
<artifactId>projectA</artifactId>
A项目子模块1
<groupId>org.company</groupId>
<artifactId>projectA-module1</artifactId>
A项目子模块2
<groupId>org.company</groupId>
<artifactId>projectA-module2</artifactId>
B项目
<groupId>org.company</groupId>
<artifactId>projectB</artifactId>
B项目子模块
<groupId>org.company</groupId>
<artifactId>projectB-module</artifactId>
如果不在groupId末尾加上实际项目名称,那么两个项目的构件在仓库中都位于org/company目录下,子模块将难以区分。
2. 为什么要在artifactId前面加上实际项目名称?假设在Maven项目声明了多个依赖:
A项目
<groupId>org.company.projectA</groupId>
<artifactId>core</artifactId>
<version>1.0.0</version>
B项目
<groupId>org.company.projectB</groupId>
<artifactId>core</artifactId>
<version>1.0.0</version>
如果不在artifactId前面加上实际项目名称,那么两个构件在Maven Dependency都显示为core-1.0.0.jar,构件将难以区分。
Maven学习笔记之坐标
原文:http://blog.csdn.net/magnificent_tony/article/details/43852451