`
leonzhx
  • 浏览: 793972 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

请您先登录,才能继续操作

第五章 坐标和依赖

阅读更多

1.   Maven 定义了这样一组规则:世界上任何一个构件都可以使用 Maven 坐标唯一标识, Maven 坐标的元素包括 groupId artifactId version packaging classifier

 

2.   Maven 内置了一个中央仓库的地址( http://repo1.maven.org/maven2 ),该中央仓库包含了世界上大部分流行的开源项目构件, Maven 会在需要的时候去那里下载。

 

3.   groupId 定义了当前 Maven 项目隶属的实际项目。一个实际项目往往会被划分成很多模块,一个模块可能就是一个 Maven 项目。 goupId 不应该对应项目隶属的组织或公司,因为一个组织或公司可能会有多个实际项目。 groupId 的表示方式与 Java 包名类似。

 

4.   artifactId 定义实际项目中的一个 Maven 项目(模块)。推荐使用实际项目名作为 artifactId 的前缀,如: nexus-indexer 。因为默认情况下 Maven 生成的构件会以 artifactId 开头,用实际项目名作为前缀就能方便从一个 lib 文件夹中找到某个实际项目的一组构件。

 

5.   version 定义了当时 Maven 项目所处的版本。

 

6.   packaging 定义了 Maven 项目的打包方式,通常与所生成构件的文件扩展名对应。不同的打包方式会影响构建的生命周期。比如 jar 打包与 war 打包会使用不同的命令。不定义 packaging 的时候,默认为 jar 。( package "maven-plugin" 的构件扩展名是 jar

 

7.  classifier 定义构建输出的一些附属构件。附属构件与主构件对应。如 Java 项目的 javadoc sources TestNG 项目默认是基于 Java 1.4 平台的,而它又提供了一个 jdk5 的附属构件。我们不能直接定义项目的 classifier ,因为附属构件不是项目直接默认生成的,而是由附加的插件帮助生成的。

 

8.  g roupId artifactId version 是必须定义的, packaging 是可选的, classifier 是不能直接定义的。

 

 

9.   项目构件的文件名与坐标相对应,一般为: artifactId-version[-classifier].packaging

 

10.   mvn clean install 会根据 POM 配置自动下载所需要的构件,执行编译、测试、打包等工作,最后将项目生成的构件安装到本地仓库中。

 

11.   根元素 project 下的 dependencies 可以包含一个或者多个项目依赖。一个依赖声明可以包含如下的一些元素:

 

<dependency>

  <groupId>…</groupId>

  <artifactId>…</artifactId>

  <version>…</version>

  <type>…</type>

  <scope>…</scope>

  <optional>…</optional>

  <exclusions>

    <exclusion>…</exclusion>

    …

  </exclusions>

</dependency> 
 

groupId artifactId version 是依赖的基本坐标。 type 为依赖的类型,对应于项目坐标定义的 packaging scope 是依赖的范围。 optional 标记依赖是否是可选的。 exclusions 用来排除传递性依赖。

 

12.   依赖范围包含:

Compile :编译依赖范围。对于编译、测试、运行三种 classpath 都有效。是默认的依赖范围。

Test :测试依赖范围。只对测试 classpath 有效。如 Junit

Provided :已提供依赖范围。只对编译、测试 classpath 有效。如 servlet-api ,运行时容器已提供。

Runtime :运行依赖范围。只对测试和运行 classpath 有效。如 JDBC 驱动实现,编译主代码时只需要 JDK 提供的 JDBC 接口。

System :系统依赖范围。与 Provided 依赖范围一致。但依赖是通过 systemPath 元素显式指定文件的路径,与本机系统绑定,一般无法移植。

Import :导入依赖范围。不会对 3 classpath 产生实际影响。

scope

compile classpath

test classpath

runtime classpath

example

compile

Y

Y

Y

spring-core

test

-

Y

-

Junit

provided

Y

Y

-

servlet-api

runtime

-

Y

Y

JDBC 驱动实现

system

Y

Y

-

本地的Maven 类库文件

 

13.   Maven 会解析各个直接依赖的 POM, 将那些必要的间接依赖,以传递性依赖的形式引入到当前的项目中。假设 A 依赖 B B 依赖 C ,我们称 A B 是第一直接依赖, B C 是第二直接依赖, A C 是传递依赖。下表显示了三者的关系:

第一          第二

compile

test

provided

runtime

compile

compile

-

-

runtime

test

test

-

-

test

provided

provided

-

provided

provided

runtime

runtime

-

-

runtime

疑问:为什么 compile + provided --> no dependency ? provided + provided --> provided ? 个人认为此表完全不对。。。

 

14.   依赖调解第一原则:路径最近:

A->B->C->X(1.0) A->D->X(2.0)  X->2.0

依赖调解第二原则:最先声明:

A->B->X(1.0) A->D->X(2.0) B D 先声明, X->1.0

 

15.   如果项目 B 实现了两个特性,特性一依赖于项目 X ,特性二依赖于项目 Y ,而 X Y 是互斥的。(比如 B 是一个持久层隔离包,支持多种数据库, X MySQL 驱动, Y PostgreSQL 驱动。)那么 X Y B 的可选依赖。如果 A 依赖 B ,则 A 不再传递依赖 X Y 而需要显式地声明 X Y 为其直接依赖。

 

16.   有时候希望排除某些传递依赖(比如传递依赖因版权限制不可用或者传递依赖是个 SNAPSHOT 版本)而显示地声明他们的替代者。可以在 <exclusion> 中声明想排除的传递依赖,而多增加一个 <dependency> 声明它的替代者。 <exclusion> 只用声明 groupId artifactId 就行。

 

17.   对于来自同一个实际项目的多个项目依赖,他们版本应该是一致的,这样,可以先用 <properties> 定义一个版本号变量。如

<properties><spring.version>2.5.6</spring.version></properties>

然后在版本信息的位置使用 ${spring.version} 来引用它。

 

18.   可以执行 mvn dependency:list mvn dependency:tree 查看已解析的依赖( resolved dependency )。

 

19.   可以执行 mvn dependency:analyze 来分析项目中的直接用到但未显示声明的依赖( Used undeclared dependencies )和声明了但未用到的依赖( Unused declared dependencies )。 Used undeclared dependencies 是项目直接用到了,但通过传递依赖引入的项目,这样当项目的直接依赖更新时,传递依赖也会随之更新,从而会导致项目代码与传递依赖不兼容。 Unused declared dependencies 并不是完全没用的依赖,只是在编译主代码和测试代码时没用,但可能会在执行测试和运行时用到。

分享到:
评论
4 楼 851228082 2015-10-27  
851228082 写道
a----compile----b-----provided---c,结果是无依赖

按照我的理解,编译、测试时,a仍然会依赖c,只是运行时不再依赖,而由容器提供。所以,结果应该是provided


a----provided----b-----compile---c,结果就是provided
这个有点类似,编译、测试时,a依赖b,根据传递性也依赖c。但是打包时a不再依赖b,也就不再依赖c,改由容器提供b和c,所以,结果应该还是provided

以上两种是个人见解。


虽然结果时一样的,但是过程的分析,不一样。
3 楼 851228082 2015-10-27  
a----compile----b-----provided---c,结果是无依赖

按照我的理解,编译、测试时,a仍然会依赖c,只是运行时不再依赖,而由容器提供。所以,结果应该是provided


a----provided----b-----compile---c,结果就是provided
这个有点类似,编译、测试时,a依赖b,根据传递性也依赖c。但是打包时a不再依赖b,也就不再依赖c,改由容器提供b和c,所以,结果应该还是provided

以上两种是个人见解。
2 楼 Ranber 2015-04-29  
请问,为什么我的是默认的compile+compile,但是A->B,B->C,但是在A中始终不去远程库下载C,A也依赖不到C
1 楼 huiyibuzai 2012-07-01  
疑问:为什么 compile + provided --> no dependency ? 而 provided + provided --> provided ? 个人认为此表完全不对。。。


我看书的时候也觉得这表的关系有点不对劲。反正没懂他的表为啥会这样。

相关推荐

    Maven实战(高清版)

    背景案例第5章 坐标和依赖第6章 仓库第7章 生命周期和插件第8章 聚合与继承第9章 使用nexus创建私服第10章 使用maven进行测试第11章 使用hudson进行持续集成第12章 使用maven构建web应用第13章 版本管理第...

    笑脸转换坐标CooRD-MG2.0

    5. **精度优化**:可能采用了先进的机器学习模型,如深度神经网络,提高关键点检测的准确性和鲁棒性。 6. **兼容性**:可能支持多种输入格式和输出格式,适应不同的应用场景。 7. **用户界面**:提供图形用户界面...

    Windows上源码编译PROJ-C++坐标转换库及其依赖库

    在Windows环境下,对C++开发人员来说,进行源码编译PROJ-C++坐标转换库以及其依赖库是一项常见的任务。这涉及到下载源代码、配置编译环境、解决依赖关系等多个步骤,对于初学者可能会遇到不少挑战。下面将详细介绍这...

    机器人的运动轴和坐标系(PPT52页).ppt

    在实际操作中,如Universal Robots的UR5机器人,用户可以通过示教器以手动方式引导机器人,机器人能记忆并复现这些路径和模式,这依赖于对机器人轴和坐标系的深入理解。 安全操作规程也是学习的重要部分,包括在示...

    数学七年级下人教新课标第六章平面直角坐标系综合检测题精选.doc

    - 第一象限:x轴正半轴和y轴正半轴之间的区域,坐标(x,y)中x和y都是正数。 - 第二象限:x轴负半轴和y轴正半轴之间的区域,坐标(x,y)中x是负数,y是正数。 - 第三象限:x轴负半轴和y轴负半轴之间的区域,...

    增强现实技术(第五章)37.pptx

    第五章主要讲解了三维注册与虚实融合,这是AR的核心技术之一。 虚实融合原理首先涉及到实时的三维注册。AR系统必须能够确定虚拟信息在投影系统中的大小、方向和映射位置,确保从任何角度观察,虚拟物体都能与真实...

    VB6.0中坐标系的相关概念及用法

    5. **坐标变换**:如果需要对坐标进行缩放、旋转或平移,可以使用VB6.0的`ScaleMode`和`Scale`属性。`ScaleMode`定义了坐标单位,如像素或百分比,而`Scale`则允许设置坐标转换的比例因子。 6. **图形移动**:通过...

    maven window下安装包

    第5章:坐标和依赖/5.9 最佳实践/5.9.2 依赖属性使用变量 第5章:坐标和依赖/5.9 最佳实践/5.9.3 依赖关系查看 第6章:仓库/6.1 何为Maven仓库 第6章:仓库/6.2 仓库的布局 第6章:仓库/6.3 仓库的分类 第6章:仓库/...

    Maven中的依赖

    7. **依赖管理和继承**:在大型项目中,可以通过创建父POM来集中管理公共依赖和插件,子项目通过继承父POM来继承这些配置。 8. **版本管理和生命周期**:Maven的版本管理允许我们轻松地升级或降级依赖版本。生命...

    八年级数学下册第十九章平面直角坐标系19.1确定平面上物体的位置课后练习新版冀教版202005131130

    第五题再次强调了方向角度的不变性,即在不同位置观察同一目标,其方位角是相同的。 第六题涉及角度的计算和直角三角形的性质。通过计算两村相对于A村的角度差,以及利用勾股定理计算两村之间的距离。 第七题是...

    geotools依赖.rar

    5. **SIS (Spatial Information System)**:由Apache提供的库,为GeoTools提供了元数据处理、时间序列管理和地球参考框架的支持。 6. **NetCDF-Java**:用于读取和写入NetCDF(Network Common Data Form)文件,这...

    FANUC机器人坐标变换.pdf

    - 直角坐标Pr[i]在不同坐标系下移动,机器人会到达不同的空间位置,因为直角坐标依赖于坐标系的定义。 4. **用户坐标系建立**: - 用户坐标系可以通过三点法建立,三个点分别指定原点、X轴正向和XY平面,不一定...

    css3地图坐标点闪烁发光特效.zip

    首先,CSS3是CSS(层叠样式表)的第三个主要版本,引入了许多新的特性和功能,其中包括动画和过渡。这些特性使得开发者能够创建动态效果,如颜色变化、大小缩放、旋转等,而无需依赖JavaScript或者其他外部库。 在...

    弹性力学简明教程(第四版)_第四章_课后作业题答案.pdf

    本资料涉及的是第四章的内容,主要讲解了两个具体的平面问题的解答,分别是实心圆盘受均布压力作用的问题和半平面体表面受均布水平力的问题。 首先,我们来看实心圆盘的问题。当圆盘的周界受到均布压力q作用时,...

    同济大学第五高等数学下D对坐标曲面积分PPT学习教案.pptx

    【同济大学第五高等数学下D对坐标曲面积分PPT学习教案】 这篇PPT教程主要介绍了关于有向曲面及曲面积分的数学概念,适用于高等数学的学习,特别是曲面积分这一章节。以下是详细的知识点讲解: 1. **有向曲面及曲面...

    激光SLAM理论与实践第三章

    《激光SLAM理论与实践第三章》主要涵盖了激光SLAM(Simultaneous Localization and Mapping,同时定位与建图)技术的基础知识,特别是基于C++实现的相关算法和实践应用。SLAM是机器人领域的一个核心问题,它允许无人...

    基于spring boot实现根据经纬度坐标返回所在行政区域

    这个项目可能依赖于第三方的GeoCoding服务,如Google Maps API或OpenStreetMap Nominatim API。它们提供RESTful接口,可以接受经纬度并返回对应的行政区域信息。 2. **Spring Boot整合RESTful API**:Spring Boot...

Global site tag (gtag.js) - Google Analytics