Maven构件

更新于:2020-06-23     浏览:1480 次  

在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 的可见性。