Maven构件
在Maven中,任何项目输出都可成为构件。
每个构件都有自己的唯一标识,由 groupId,artifactId 和 version 等信息构成。
Maven可以对构件进行版本控制,管理。
Maven构件标识
每个构件都有自己的唯一标识(Maven 行话称之为 "唯一坐标" ),由 groupId,artifactId 和 version 等信息构成。
- groupId:当前Maven构件隶属的组织名。groupId一般分为多段,通常情况下,第一段为域,第二段为公司名称。域又分为 org、com、cn 等,其中 org 为非营利组织,com 为商业组织,cn 表示中国。以 apache 开源社区的 tomcat 项目为例,这个项目的 groupId 是 org.apache,它的域是org(因为tomcat是非营利项目),公司名称是apache,artifactId是tomcat。(必须)
- artifactId:项目的唯一的标识符,实际对应项目的名称,就是项目根目录的名称。(必须)
- version:当前版本。(必须)
- packaging:打包方式,比如 jar,war... (必须)
- classifier:classifier通常用于区分从同一POM构建的具有不同内容的构件。它是可选的,它可以是任意的字符串,附加在版本号之后。
Maven的classifier作用
classifier可以是任意的字符串,用于确定文件。常见的应用场景如下所示:
(1)可用于区分不同JDK版本所生成的jar包
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.2.2</version>
<classifier>jdk15</classifier>
</dependency>
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.2.2</version>
<classifier>jdk13</classifier>
</dependency>
以上配置信息实际上对应的 jar 包是 json-lib-2.2.2-jdk15.jar 和 json-lib-2.2.2-jdk13.jar。
(2)区分项目的不同组成部分,例如,源代码、javadoc、类文件等。
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.2.2</version>
<classifier>jdk15-javadoc</classifier>
</dependency>
以上配置信息对应的是 json-lib-2.2.2-jdk15-javadoc.jar。
提醒:需要注意classifier的位置
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<classifier>jdk15-javadoc</classifier>
<version>2.2.2</version>
</dependency>
对应的是 json-lib-jdk15-javadoc-2.2.2.jar,可能会出现找不到jar包的情况。
Maven构件特性
(1)构件具有依赖传递。例如:项目依赖构件A,而构件A又依赖B,Maven会将A和B都视为项目的依赖。
(2)构件之间存在版本冲突时,Maven会依据 "短路优先" 原则加载构件。此外,我们也可以在 pom.xml 中,使用 <exclusions></exclusions>显式排除某个版本的依赖,以确保项目能够运行。
- (a)项目依赖构件A和B,构件A → C → D(version:1.0.0),构件B → D(version:1.1.0),此时,Maven会优先解析加载D(version:1.1.0)。
- (b)项目依赖构件A和B,构件A → D(version:1.0.0), 构件B → D(version:1.1.0),此时,Maven会优先解析加载D(version:1.0.0)。
(3)构件的依赖范围。Maven在项目的构建过程中,会编译三套 ClassPath,分别对应:编译期,运行期,测试期。而依赖范围就是为构件指定它可以作用于哪套 ClassPath。
- | 编译期 | 测试期 | 运行期 | 说明 |
---|---|---|---|---|
compile | √ | √ | √ | 默认范围 |
provided | √ | √ | 如 servlet-api.jar,运行期由web容器提供。 | |
runtime | √ | √ | 编译期无需直接引用。 | |
test | √ | 如junit.jar。 | ||
system | √ | √ | 必须通过 <systemPath></systemPath> 元素,显示指定依赖文件的路径, 与本地系统相关联,可移植性差。 |
|
import | 表示继承父POM.XML中的依赖范围设置 |
提醒:Maven中的库是个物理概念,存放各种依赖 Jar,而 ClassPath 是个逻辑概念,指定所依赖 Jar 的可见性。