- 浏览: 39178 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
lenomon:
可以看看这个demo, M2eclipse 设置 Mave ...
Maven学习笔记(二)——Eclipse插件安装(m2eclipse)
参考书籍Maven实战:可在InfoQ的Minibook出下载相关电子版。
一、坐标
maven坐标为各种构件引入了秩序,任何一个构件都必须明确定义自己的坐标,而一组maven坐标是通过一些元素定义的,它们是groupId,artifactId,version,packaging,chassifier。先看一组坐标定义,如下:
下面详细解释一下各个坐标元素:
1.groupId: 定义当前maven项目隶属的实际项目。首先,maven项目和实际项目不一定是一对一的关系。比如SpringFramework这一实际项目,其对应的maven项目会有很多,如: spring-core,spring-context等。这是由于maven中模块的概念,因此,一个实际项目往往会被划分成很多模块。其次,groupId不应该对应项目隶属的组织或公司。原因很简单,一个组织下会有很多个实际项目,如果groupId只定义到组织级别,而后面我们会看到,artifactId只能定义maven项目(模块),那么实际项目这个层将难以定义。最后,groupId的表示方式与java包名的表示方式类似,通常与域名反向一一对应。
2.artifactId: 该元素定义实际项目中的一个maven项目(模块),推荐的做法是使用实际项目名称作为artifactId前缀,这样做的好处是方便寻找实际构件。在默认情况下,maven生成的构件,其文件名会以artifactId作为开头,如:nexus-indexer-2.0.0.jar,使用实际项目名称作为前缀之后,就能方便从一个lib文件夹中找到某个项目的一组构件。
3.version: 该元素定义maven项目当前所处的版本,如:nexus-indexer-2.0.0.jar的版本是2.0.0。需要注意的是,maven定义了一套完整的版本规范,以及快照(SNAPSHOT)的概念。
4.packaging: 该元素定义maven项目的打包方式。首先,打包方式通常与所生成构件的文件扩展名对应,如:nexus-indexer.2.0.0.jar的packaging为jar,而使用war打包方式的maven项目,最终生成的构件会有一个.war文件,不过这不是绝对的。其次,打包方式会影响到构建的生命周期,比如jar打包和war打包会使用不同的命令。最后,当不定义packaging的时候,maven会使用默认值jar。
5.classifier: 该元素用来帮助定义构建输出的一些附属构件。附属构件与主构件对应,如上例中的主构件是: nexus-indexer-2.0.0.jar,该项目可能还会通过使用一些插件生成如:nexus-indexer-2.0.0-javadoc.jar、nexus-indexer-2.0.0-sources.jar这样一些附属构件,其包含了java文档和源代码。这时候,javadoc和sources就是这两个附属构件的classifier。这样,附属构件也就拥有了自己唯一的坐标。
注意:不能直接定义项目的classifier,因为附属构件不是项目直接默认生成的,而是由附加的插件帮助生成。
上述5个元素中,groupId,artifactId,version是必须定义的,packaging是可选的(默认为jar),而classifier是不能直接定义的。
同时,项目构件的文件名是与坐标相对应的,一般的规则为:artifactId-version[-classifier].packaging,[-classifier]表示可选。
二、依赖
-
依赖与依赖的配置
顾名思义,依赖就是当用到其他模块作为为其服务时而产生的一种关系,通过其坐标找到其对应模块。进而引出有关依赖的配置,如下是一个很常见的POM配置
- groupId,artifactId和version:依赖的基本坐标,对于任何一个依赖来说,基本坐标是最重要的,maven根据坐标才能找到需要的依赖。
- type:依赖的类型,对于项目坐标定义的packaging。大部分情况下,该元素不必声明,其默认值为jar。
- scope:依赖的范围。
- optional:标记依赖是否可选。
- exclusions:用来排除传递性依赖。
-
依赖范围
举例来说,你开发时需要做测试,你需要依赖于junit的jar,但是部署应用时并不需要它,因为单元测试不会在生产环境上跑,也就是说最终打包的jar或者war不包含junit的jar。又如你开发web程序,你的servlet/jsp进行编译需要依赖于servlet-jsp的标准api(J2EE的jar),但是部署时也是不需要它的,因为你的应用服务器肯定有这些东西。
因此,Maven考虑了6中可能的scope供选择:
- compile: 默认的scope。编译、测试、打包全都需要。compile参与依赖传递,就是说,你的项目A依赖于B(依赖scope是compile),项目C依赖于你的项目A,那么C也就依赖于B。
- provided: 表示JDK或者容器会在Runtime时提供这些(jar),如上面说到的servlet api。provided的东西在编译和测试时会用到,不参与传递依赖。
- runtime: 表示编译时不需要,但测试和运行时需要,最终打包时会包含进去。
- test: 只用于测试阶段(测试的编译和测试的运行),典型的就是junit的jar。
- system: 和provided类似,但要求jar是你的系统里已有的,不会在repository里找,如rt.jar,tools.jar这些。
- import: 简单的说,你的项目的pom可以继承另一个项目的pom,从而继承了父项目的依赖关系,但是因为之后single inheritance的限制,所以创造了import,使得你可以“导入”或者说“继承”任何一到多个项目的依赖关系。
如果你要考虑更细一些,你的项目依赖于A(scope1),A依赖于B(scope2),那么你的项目对B的依赖应该算是哪个scope呢?官方文档上有个表格,列举了scope1和scope2的一个矩阵关系(各自都可能是compile/provided/runtime/test),然后最后结果应该是什么。
- 依赖的传递性
传递性依赖:account-mail有一个compile范围的spring-core依赖,spring-core有一个compile范围的commons-logging依赖,那么commons-logging就会成为account-mail的compile范围依赖。 - 依赖调解
maven引入的传递性依赖机制,一方面大大简化和方便了依赖声明,另一方面大部分情况下我们只需要关心项目直接依赖的是什么,而不用考虑这些依赖会引入什么传递性依赖。但有时候,当传递依赖造成问题的时候,我们需要清楚地知道该传递性依赖是从哪条依赖路径引入的。
maven依赖调解的两个原则。(1)第一原则是:路径最近者优先。(2)第二原则是:第一声明者优先。在依赖路径长度相等的前提下,在pom依赖声明的顺序决定了谁会解析使用,顺序最靠前的那个依赖优胜。 -
可选依赖
假设有这样一个依赖关系,项目A依赖于项目B,项目B依赖于项目X和Y,B对于X和Y的依赖都是可选依赖:A-->B,B-->X(可选),B-->Y(可选)。根据传递性依赖的定义,如果所有这三个依赖的范围都是compile,那么X,Y就是A的compile范围传递性依赖。然而,由于这里X,Y是可选依赖,依赖将不会得以传递。换句话说,X,Y将不会对A有任何影响。
为什么要使用可选依赖这一特性呢?可能项目B实现了两个特性,其中的特性一依赖于X,特性二依赖于Y,而且这两个特性是互斥的,用户不可能同时使用两个特性。比如B是一个持久层隔离工具包,它支持多种数据库,包括MySQL,PostgreSQL等,在构建这个工具包的时候,需要这两种数据库的驱动程序,但在使用这个工具包的时候,只会依赖一个数据库。
发表评论
-
系统研究Java--容器(二)--使用Abstract类
2011-02-23 14:34 0这个示例在于演示通过继承java.util.Abstract来 ... -
Maven学习笔记(一)——安装与配置
2011-12-24 17:48 11061. 准备工作 操作系统 ... -
Maven学习笔记(二)——Eclipse插件安装(m2eclipse)
2011-12-24 19:06 1514如何安装Eclipse插件 关于如何安装Ecli ... -
`nonmutating' is not defined (Ice)
2012-02-20 14:40 837说明出处:http://download.zeroc.com/ ... -
Java中的所有异常
2011-02-14 13:33 626原文地址:http://www.knowsky.com/540 ... -
Java中为什么实现了Serializable接口就具备了被序列化的能力以及serialVersionUID的作用
2011-02-14 13:38 703Java 规定的内部机制,实现 Serializable 接口 ... -
系统研究Java--容器(一)
2011-02-14 15:12 783如上图:java完整容器的结构图 个人觉得j ... -
Java中的volatile关键字
2011-02-18 10:09 646我们知道,在Java中设 ... -
系统研究Java--数组(一)
2011-02-22 15:55 637数组不可越界,如果越界将会得到一个表示程序错误的Runtim ... -
Java反射经典实例 Java Reflection Cookbook (初级)
2011-02-23 13:09 361原文地址:http://www.blogjava.net/ji ... -
系统研究Java--容器(二)--使用Abstract类
2011-02-23 14:34 603这个示例在于演示通过继承java.util.Abstract来 ... -
系统研究Java--容器(三)--Collection
2011-02-23 15:36 609<!-- ========== METHOD SUMMA ... -
系统研究Java--容器(五)--部分容器的底层实现
2011-02-23 16:28 846List和存储顺序 从List接口展开的实现类有ArrayL ... -
系统研究Java--容器(四)--Map和Set
2011-02-23 17:59 629Map是Java容器的又一长老 ... -
系统研究Java--容器(六)--Collections工具类
2011-03-01 14:36 794<!-- ========== METHOD SUMMA ... -
系统研究Java--I/O(一)
2011-03-03 16:14 600先占个位置,来两个图 -
abstract class 与 interface 的区别
2011-03-07 11:43 708对于abstract class 和 interf ... -
Java几种常用关键字总结
2011-03-25 11:00 6681.abstract abstract关键字可以用来修 ... -
一个简单的验证码生成工具--servlet版本
2011-05-13 21:20 686需要用到servlet-api.jar package co ... -
Hibernate将Enum枚举类型映射为Int类型
2011-07-01 15:19 1151最近要用Hibernate做一个枚举类型的映射,在MySQL数 ...
相关推荐
maven学习笔记maven学习笔记maven学习笔记
**Maven学习笔记** 在Java开发领域,Maven是一个不可或缺的构建工具,它极大地简化了项目的构建、管理和依赖管理过程。Maven通过使用一个项目对象模型(Project Object Model,POM),XML格式的配置文件,定义了...
** Maven基础入门 ** Maven是一个Java项目管理工具,它主要负责构建、依赖管理和项目信息管理。...在`maven_study_01`的学习笔记中,你可以找到更多关于Maven的基础知识和实践案例,帮助你快速上手并掌握这一工具。
**Maven教程:基础篇——尚硅谷学习笔记 2022年** Maven是一个强大的Java项目管理和构建工具,由Apache软件基金会开发。它通过提供一个标准的项目对象模型(Project Object Model,POM)来简化项目的构建过程,并...
总结,【尚硅谷Maven课程笔记代码资源】是学习和掌握Maven自动化构建的理想材料。它不仅提供了理论知识,还有实际操作的案例,可以帮助开发者快速上手并精通Maven,提高项目管理效率。通过学习这些内容,你将能够更...
** Maven学习笔记详解 ** Maven,作为Java项目管理和构建工具,是开发人员不可或缺的利器。它通过使用一种标准化的项目对象模型(Project Object Model,POM)来管理项目的依赖关系,构建过程以及配置信息。Maven...
maven学习笔记整理
### 个人Maven学习笔记 #### 为什么使用Maven? 在软件开发过程中,尤其是在使用Java进行后端开发时,项目通常会依赖大量的第三方库或框架。如果没有统一的管理工具,这些依赖很容易出现版本冲突的问题,增加了...
在“培训机构传出的maven学习笔记”中,我们可能涵盖以下几个关键知识点: 1. **Maven的基本概念**:理解Maven的核心概念,如POM.xml文件、仓库(本地仓库和中央仓库)、生命周期和构建阶段(如clean、compile、...
【mybatis_maven学习笔记】 在Java开发领域,MyBatis和Maven是两个不可或缺的工具,它们分别在数据访问层和项目构建方面扮演着重要角色。MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射,...
【Maven学习笔记】 Maven是一个强大的项目管理和构建工具,主要应用于Java开发领域。它能够自动管理项目的依赖关系,帮助开发者解决因jar包版本冲突、依赖管理混乱等问题带来的困扰。Maven通过制定一套规范化的项目...
**Maven学习笔记** Maven是一个强大的Java项目管理和构建工具,它简化了项目的构建、依赖管理和文档生成。本文档基于尚硅谷的视频教程,旨在帮助读者深入理解Maven的核心概念和使用方法。 **1. 为什么学习Maven** ...
2. **Maven坐标**:在Maven中,每个依赖由三部分组成,即groupId(表示项目或组织的唯一标识)、artifactId(项目或模块的标识)和version(该组件的版本号)。 3. **依赖的传递性**:如果项目A依赖于B,B又依赖于C...
【Maven学习笔记1】 Maven是一个强大的Java项目管理和构建工具,它可以帮助开发者管理项目的依赖、构建过程、项目信息和报告。本笔记主要涵盖了Maven的基础知识,包括资料收集、安装指南,特别是针对Linux环境下的...
【标题】:“201205_Maven学习笔记1.rar”揭示了关于Maven的深入学习内容,这个压缩包包含了一系列文档,旨在帮助开发者更好地理解和应用Maven这一强大的Java项目管理和构建工具。 【描述】:尽管描述部分是空的,...
内容概要:maven学习笔记,适合刚接触maven的人能让你快速入门。 适用人群:大学生或者初基础maven的人 使用场景及目标:idea集成maven,用来下载依赖包
maven-assembly-plugin 插件打第三方依赖包进 jar,spring 有 org.springframework.beans.factory.parsing.BeanDefinitionParsingException 异常怎么办? maven-shade-plugin 插件打第三方依赖包,spring 有 java....
**Maven项目学习笔记记录** 在软件开发领域,Maven是一个强大的项目管理和构建工具,尤其在Java开发中广泛使用。本笔记将深入探讨Maven的核心概念、主要功能以及实际应用场景,帮助你更好地理解和掌握这一重要工具...