在maven的世界里,每一个构件都是由maven坐标唯一标识的,通过这个坐标就可以找到该构件(artifact),当构建项目的时候,例如打包或者install的时候,就会根据该坐标找到该artifact并且下载该artifact。
maven坐标类似于平面几何(x,y),或者立体几何中的(x,y,z),唯一标识一个artifact(构件),可以是jar包,或者是war文件,通常是jar。Maven坐标包括的元素包括groupId,artifactId,version,packing,classifier几个元素,packing默认是jar,当然在聚合项目中,必须是pom,为了复用一些信息,而建造的“父项目”的packing也为pom。Classifier元素可选的,定义了构件输出的一些附属属性,例如主构件是nexus-indexer-2.0.0.jar,该项目可能还通过一些其他插件生成其他附属构件,例如javadoc文档、sources源代码,nexus-indexer-2.0.0-javadoc.jar、nexus-indexer-2.0.0-sources.jar,这里的javadoc和sources就是classifier。groupId,artifactId,version是必须定义的,packing是可选的,默认为jar,classifier是不能直接定义的。同时项目构件的文件名是与坐标相对应的,一般的规则为artifactId-version-[classifier].packing。
典型的maven依赖如下:
<project>
…………
<dependencies>
<dependency>
<groupId>…</groupId>
<artifactId>…</artifactId>
<version>…</version>
<type>…</type>
<scope>…</scope>
<option>…</option>
<exclusions>
<exclusion>
……
</exclusion>
</exclusions>
<dependency>
……
<dependencies>
…………
</project>
groupid、artifactid和version已经在之前的博文介绍过了,下面介绍下下面的几个
type:依赖的类型,对应于项目坐标定义的packing。通常情况下,该元素不必声明,默认情况下为jar
scope:依赖范围。默认为compile
option:标记依赖是否可选
exclusions:用于排除传递性依赖。排除依赖一般应用于传递依赖的排除。假设A依赖B,B又依赖于C,但是这个C是非稳定版本。那么就排除该不稳定的C的依赖。然后直接依赖一个稳定版本的C。
依赖范围:控制依赖与三种classpath(编译、测试、运行)的关系
1、complie范围:对于编译,测试,运行三种classpath均有效,例如spring-core.jar
2、Test范围:只对测试classpath有效,例如junit
3、provided范围:又名已提供依赖范围,对于编译和测试classpath有效,最典型的是 servelt-api,在编译和测试的时候需要提供它,但是运行时,一般容器已经提供了servelt-api,所以在运行时classpath不需要此jar。
4、runtime范围:运行时依赖,对于测试和运行classpath有效,最典型的是JDBC驱动实现,在编译的时候,只需要JDBC驱动提供的接口,到了测试和运行的时候,才需要具体实现JDBC接口的驱动。
5、system范围:系统依赖范围,与provided一样,但是使用该依赖范围的依赖必须使用systemPath显示得制指定依赖文件的路径。由于此类依赖不是通过maven仓库解析的,往往与本地系统绑定,造成系统移植性差,所以慎重使用。
6、import依赖:该依赖范围不会对三种classpath产生实质性的影响,主要与dependencyManagement有关。
传递依赖:以las-im-basis项目为例子。
las-im-basis直接以compile范围依赖spring-core,spring-core直接以compile范围依赖commons-logging,所以las-im-basis以compile范围间接依赖commons-logging。
下面的表左边第一列表示第一直接依赖范围,最上面一行表示第二直接依赖范围,中间的交叉表示的是传递依赖范围
下面介绍几个术语
1、依赖调解
A->B->C->X(1.0),A->D->X(2.0),X是A的传递性依赖,但是有两条路径,到底是哪个版本的X会被maven解析呢,maven遵循路径短者优先,所以X(2.0)会被解析。如果这两个路径长度相同呢,则第一声明者优先,也就是依赖在pom的顺序,顺序前者优先。
2、可选依赖
A->B->X(可选),A->B->Y(可选),则X,Y对A的三种classpath不产生什么实际效果,要想X或者Y对A产生作用,需要显示得在A的pom中声明X或者Y的依赖。可选依赖X、Y在B项目中的pom的表示是<option>true</option>,X、Y在B项目中是互斥的,在某一时刻只能有一个在起作用。
Maven的最佳实践(前人的经验总结)
排除依赖:A->B->C,由于B引用的C为非稳定版本,所以需要排除B依赖的C,在A项目中再依赖一个稳定版本的C,排除依赖用<exclusions>元素。
归类依赖:举例来说如果项目有很多的spring framework的依赖,可以遇见的事这些依赖的版本都是一样的,且以后升级的时候,需要一起升级。这个时候就需要归类了
<project>
……
<properties>
<springframework.version>2.5.6</springframework.version>
</properties>
……
<dependencies>
<dependency>
<groupId>…</groupId>
<artifactId>…</artifactId>
<version>${springframework.version}</version>
</dependency>
</dependencies>
…….
</project>
关于优化依赖
优化依赖。Maven会自动解析所有项目的直接依赖和传递性依赖,并且根据规则确定每个依赖的范围,对于一些依赖冲突,也能进行调节,以确定每个构件只有唯一的版本在依赖中存在,经过上述工作得到的依赖,被成为已解析依赖,在命令行中输入:
mvn dependency:list查看已解析依赖;mvn dependency:tree查看已解析依赖构成的依赖树;mvn dependency:analyze分析已解析的依赖,会得到Used undeclared dependencies列表,但是不能简单将在其中的依赖删掉,因为mvn dependency:analyze只能分析编译主代码和测试代码需要用到的依赖,一些执行测试和运行时需要的依赖就没有办法得到了,所以在Used undeclared dependencies中很有可能有在运行时使用的依赖!例如servlet-api。
- 大小: 15.7 KB
- 大小: 28.1 KB
分享到:
相关推荐
2. **Maven坐标**:在Maven中,每个依赖由三部分组成,即groupId(表示项目或组织的唯一标识)、artifactId(项目或模块的标识)和version(该组件的版本号)。 3. **依赖的传递性**:如果项目A依赖于B,B又依赖于C...
POM文件是Maven项目的核心,它是一个xml文件,用于定义项目的构建配置和管理项目依赖。 首先,我们来看一下Maven项目的POM文件。POM文件定义了项目的基本信息,如项目组ID(groupId)、项目ID(artifactId)、项目版本...
这里的`groupId`、`artifactId`和`version`共同构成了Maven坐标,用于唯一标识一个依赖。Maven会根据这个坐标从中央仓库或其他配置的远程仓库下载对应的JAR文件。 Maven依赖管理遵循“传递性”原则,即如果你的项目...
这里的`groupId`、`artifactId`和`version`共同构成了Maven坐标,用于唯一标识一个项目或库。Maven会根据这些信息从Maven中央仓库或其他指定的远程仓库下载对应的jar文件。 Maven的依赖机制遵循“传递性”原则,这...
Maven是Apache软件基金会开发的一个项目管理工具,它的核心功能之一就是依赖管理。在Java世界里,一个应用程序往往需要依赖多个第三方库,如Spring、Hibernate、Apache Commons等。Maven通过其特有的 pom.xml 文件...
在POM中声明所需依赖,Maven会根据设定的坐标(groupId、artifactId、version)从Maven中央仓库或其他指定的远程仓库下载对应的jar包。例如,`<dependency>`标签用于声明项目依赖,`<dependencies>`标签则用于包含...
通过POM,Maven能够自动下载所需依赖、编译源代码、运行测试、打包和部署应用。 ** Maven的生命周期和阶段 ** Maven拥有三个主要的生命周期:clean、default和site。其中,default生命周期是最常用的,包括了如...
Maven 是一款非常流行的 Java 项目的构建管理和依赖管理工具。它可以帮助开发者自动化构建过程,简化项目管理和部署流程。通过使用 Maven,开发者可以轻松地管理项目的依赖关系,并且能够方便地生成项目报告和文档。...
1. **groupId**:这是所有Maven坐标的第一部分,类似于Java包名,用于唯一标识一个项目或组织。这里的`org.mybatis`表示这个依赖属于MyBatis组织。 2. **artifactId**:这是Maven坐标的一部分,用于标识同一个项目...
Maven是Java开发中的一款项目管理和综合工具...通过以上内容的学习,你将能够熟练地配置和使用Maven,高效地管理你的Java项目。记得实践是检验真理的唯一标准,多动手尝试,结合实际项目,你会对Maven有更深刻的理解。
【Maven 3.0 学习文档】 Maven 是一个强大的项目管理和自动化构建工具,主要应用于Java项目。它的核心理念是Project Object Model (POM),这是一个XML格式的配置文件,用于描述项目的元数据,包括项目的依赖、构建...
这里`groupId`、`artifactId`和`version`共同构成了Maven的坐标,用于唯一标识一个库。 总的来说,理解并掌握Maven的本地仓库和依赖管理对于JavaWeb开发者至关重要,它能够简化项目构建过程,提高开发效率,并确保...
**Maven学习笔记** 在Java开发领域,Maven是一个不可或缺的构建...本学习笔记涵盖了Maven的基础知识,从安装到使用,希望能为你的Maven学习之路提供帮助。在实际开发中,不断实践和探索,你将更加熟练地驾驭Maven。
** Maven基础入门 ** Maven是一个Java项目管理工具,它主要负责构建、依赖管理和项目信息管理。...在`maven_study_01`的学习笔记中,你可以找到更多关于Maven的基础知识和实践案例,帮助你快速上手并掌握这一工具。
在Java开发领域,Maven是一个不可或缺的构建工具,它极大地简化了项目的构建、管理和依赖管理过程。Maven通过一个统一的项目对象模型(Project Object Model,POM),使得开发者可以轻松地定义项目配置,管理依赖...
Maven是一个项目管理和综合工具,用于构建、依赖管理和项目信息管理。在Maven仓库中,每个第三方库都有一个特定的路径结构,通常是根据其groupId来组织的。在这个例子中,'com\'暗示了groupId可能是'...
在描述中提到的`.grails_history`文件可能包含了用户在Grails命令行界面执行的历史命令,这对于开发者回顾和学习过去的操作非常有帮助。而`.m2`目录则是Maven的本地仓库,它存储了所有下载的依赖库,以便于构建过程...
Maven的核心功能之一是依赖管理,它允许用户通过在`pom.xml`文件中声明依赖关系,自动处理项目所需的第三方库。 Maven工程的构建过程中,真正的jar包存放在仓库中,而项目中仅需放置jar包的坐标信息。这样,当需要...