坐标,依赖,仓库

何为Maven坐标

是Maven定义的一组规则,世界上任何一个构建都可以使用Maven坐标唯一标识,Maven坐标的元素包括groupId,artifactId,version,packging,classifier。只需要提供正确的坐标信息,Maven就能找到对应的构建。

坐标详解

坐标定义例子:

<groupId>org.sonatype.nexus</groupId>
<artifactId>nexus-indexer</artifactId>
<version>2.0.0</version>
<packaging>jar</packaging>

groupId:定义当前Maven项目隶属于的实际项目
artifactId:该元素定义实际项目中的一个Maven项目(模块),推荐的做法是使用实际项目名称作为artifactId的前缀
version:该元素定义Maven项目当前所处的版本
packaging:该元素定义Maven项目的打包方式
classifier:该元素用来帮助定义构建输出的一些附属构建

依赖详解

  1. type:依赖的类型,对应于项目坐标定义的packaging。大部分情况下,该元素不必声明,默认值为jar
  2. 依赖范围:依赖范围就是用来控制依赖与这三种classpath(编译classpath,测试classpath,运行classpath)的关系,Maven有以下几种依赖范围:
    2.1 compile:编译测试范围。如果没有指定,就会默认使用该依赖范围。使用此依赖的Maven依赖,对于编译,测试,运行三种classpath都有效
    2.2 test:测试依赖范围,此依赖只对测试classpath有效
    2.3 provided:已提供依赖范围,此依赖范围对编译和测试classpath有效
    2.4 runtime:运行时依赖范围,此依赖对于测试和运行有效
    2.5 system:系统依赖范围,依赖范围和provided完全一致,但是使用此依赖时必须通过systemPath元素显示的指定依赖文件的路径,代码示例如下:
<dependency>
  <groupId>java.sql</groupId>
  <artifactId>jdbc-stdext</artifactId>
  <version>2.0</version>
  <scope>system</scope>
  <systemPath>${java.home}/lib/rt.jar</systemPath>
</dependency>
  1. 传递性依赖和依赖范围
    第一直接依赖的范围和第二直接依赖的范围决定了传递性依赖的范围。如下表所示,最左边一列表示第一直接依赖范围,最上面一行表示第二直接依赖范围,中间的交叉单元格则表示传递性依赖范围:
compile test provided runtime
compile compile -- -- runtime
test test -- -- test
provided provided -- provided provided
runtime runtime -- -- runtime

为了帮助理解,举个例子:account-email项目有一个com.icegreen:greenmail:1.3.1b的直接依赖我们说这是第一直接依赖,其依赖范围是test;而greenmail又有一个javax.mail:mail:1.4的直接依赖,我们说这是第二直接依赖,其依赖范围为compile。显然,javax.mail:mail:1.4是account-email的传递性依赖,对照表可以知道,当第一直接依赖范围为test,第二直接依赖范围是compile的时候,传递性依赖范围是test,因此,javax.mail:mail:1.4是account-email的一个范围是test的传递性依赖

依赖操作

  1. 依赖调解,当传递性依赖造成问题的时候,我们就需要清楚的知道该传递性依赖时从那条依赖路径引入的
    Maven调解的两大原则:
    1.1 路径最近者优先
    1.2 第一声明者优先,顺序最靠前的那个依赖优胜

  2. 可选依赖使用<optional>元素表示依赖为可选依赖,当依赖为可选依赖时,该依赖只对本项目产生影响,如若别的项目依赖本项目,不会依赖本项目的可选依赖。使用可选依赖的原因是某一个项目实现了多个特性,在面向对象设计中,有个单一职责型原则,意指一个类应该只有一项职责,而不是糅合太多的功能

  3. 排除依赖
    假想情况:当前项目有一个第三方依赖,而这个第三方依赖由于某些原因依赖了另外一个类库的SNAPSHOP版本,那么这个SNAPSHOP就会成为当前项目的传递性依赖,而SNAPSHOP的不稳定性会直接影响到当前项目,这时候就需要排除掉该SNAPSHOP,并且在当前项目中声明该类库的某个正式的发布版本
    解决方法:代码中使用exclusions元素声明排除依赖,exclusions可以包含一个或者多个exclusions子元素,因此可次排除一个或者多个传递性依赖
    代码示例如下:

 <dependency>
  <groupId>com.juvenxu.mvnbook</groupId>
  <artifactId>project-b</artifactId>
  <version>1.0.0</version>
  <exclusions>
    <exclusion>
      <groupId>com.juvenxu.mvnbook</groupId>
      <artifactId>project-c</artifactId>
    </exclusion>
  </exclusions>
</dependency>
  1. 优化依赖
    4.1 mvn dependency:list,查看当前项目的已解析依赖
    4.2 mvn dependency:tree,查看当前项目的依赖树
    使用上面两个命令可以帮助我们详细了解项目中所有依赖的具体信息,在此基础上,还有dependency:analyze工具可以帮助分析当前项目的依赖
    注:最好是显示的声明任何项目中直接用到的依赖

仓库的分类

  1. 本地仓库
    不管Linux还是Windows上,每个用户在自己的目录下都有一个路径名为.m2/respository/的仓库目录。以.开头的文件或目录默认是隐藏的,可以使用ls-a命令显示隐藏文件或目录
    有时候,用户会想要自定义本地仓库目录地址,可以编辑文件~/.m2/settings.xml,设置localRepository元素的值为想要的仓库地址
    Install插件的install目标将项目的构建输出文件安装到本地仓库

  2. 私服
    私服是一种特殊的远程仓库,为了节省宽带和时间,应该在局域网内架设一个私有的仓库服务器,用其代理所有外部的远程仓库。内部的项目还能部署到私服上供其它项目使用,一些无法外部仓库下载到的构件也能从本地上传到私服上供大家使用。
    私服主要的作用有: 节省自己的外网宽带,加速Maven构建,部署第三方构建,提高稳定性,增强控制,降低中央仓库的负荷

远程仓库的配置

  1. 在respository元素下,可以使用respository子元素声明一个或者多个远程仓库
  2. 对于releases和snapshots来说,除了enabled,塔门还包含另外两个子元素uodatePolicy和checksumPolicy
    2.1 updatePolicy:配置Maven从远程仓库检查更新的频率
    2.2 checksumPolicy:配置Maven检查检验和文件的策略
    2.3 代码示例:
<snapshots>
 <enabled>true</enabled>
 <updatePolicy>daily</updatePolicy>
 <checksumPolicy>ignore</checksumPolicy>
</snapshots>
  1. 远程仓库的认证需要在settings.xml中配置用户名和密码
<servers>
  <server>
    <id>my-proj</id>
    <username>repo-user</username>
    <password>repo-pwd</password>
  </server>
</servers>
  1. 部署至远程仓库,distributionManagement包含repository和snapshotRepository子元素,前者表示发布版本构建的仓库,后者表示快照版本的仓库。id为该远程仓库的唯一标识,name是为了方便人阅读,关键的url表示该仓库的地址,部署到配置的远程仓库命令是mvn clean deploy
<distributionManagement>
  <repository>
    <id></id>
    <name></name>
    <url></url>
  </repository>
  <snapshotRepository>
    <id></id>
    <name></name>
    <url></url>
  </snapshotRepository>
</distributionManagement>

文章仅供参考,代码并不是全正确,只需要知道在对应的情况,可以做对应的处理,代码是变化的,我相信原理不变


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,509评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,806评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,875评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,441评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,488评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,365评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,190评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,062评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,500评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,706评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,834评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,559评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,167评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,779评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,912评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,958评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,779评论 2 354

推荐阅读更多精彩内容

  • |-1-更新内容[6.从仓库解析依赖的机制(重要)] 1Maven仓库作用 仓库用来存储所有项目使用到构件,在ma...
    zlcook阅读 6,054评论 0 25
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,810评论 6 342
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,654评论 18 139
  • 1.POM文件 modelVersion:POM 模型的版本 groupId:项目属于哪...
    mecury阅读 990评论 0 0
  • 什么才叫好的教育产品?什么样的教学产品能够让师生印象深刻,让教育从业者都充满期待?什么产品可以受到教育局的关注和认...
    meshow阅读 695评论 0 0