- 浏览: 793972 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (651)
- Java (39)
- Java 初学者小问题 (66)
- 设计模式 (7)
- 项目管理 (3)
- 数据库 (1)
- 算法 (2)
- Java practices (6)
- Effective Java2读书笔记 (78)
- Linux (2)
- programming ruby 读书笔记 (5)
- Core Java Ninth Edition Volume I 读书笔记 (15)
- Pro Git 读书笔记 (12)
- Git (3)
- Maven in Action 读书笔记 (20)
- Web (12)
- 非技术类书籍 (11)
- 电影 (40)
- Web Cache (1)
- jquery (0)
- 历史 (4)
- Dive Into HTML5 读书笔记 (13)
- 三国演义小学毕业考 (79)
- 高效能人士的7个习惯 读书笔记 (12)
- Java Performance 读书笔记 (3)
- Protocol Buffer 学习笔记 (6)
- Mongo DB 学习笔记 (7)
- Morphia 学习笔记 (7)
- Algorithms -- Princeton 学习笔记 (13)
- String研究 (10)
- Hadoop: The Definitive Guide 读书笔记 (3)
- Java与模式读书笔记 (5)
- Date研究 (3)
- The Roman Empire 听课笔记 (4)
- Algorithms -- Standford 学习笔记 (16)
- Core Java Ninth Edition Volume II 读书笔记 (9)
- Thinking in Java 4th Edition 读书笔记 (21)
- Node : Up and Running 学习笔记 (5)
- Eloquent Javascript (8)
- Smashing Node.js 读书笔记 (1)
- Algorithms II -- Standford 学习笔记 (19)
- Algorithm II -- Princeton 学习笔记 (14)
- 网络安全 (2)
- Javascript (4)
- 正则表达式 (1)
- JAVA 7/8 (15)
- JVM (10)
- NodeJS (1)
- 鸟哥的linux私房菜读书笔记 (14)
- Web Service (1)
- The art of programming (9)
- Introduction to Algorithm 读书笔记 (4)
- Java 源码阅读 (0)
- Spring in Action 读书笔记 (2)
- Java Network Programming 读书笔记 (2)
最新评论
-
心存高远:
谢谢作者分享,刚好看到这里不太明白,现在茅塞顿开。不过runt ...
关于 Maven的传递依赖的理解 -
sxlkk:
851228082 写道甚至在某次技术会议现场遇到《Maven ...
关于 Maven的传递依赖的理解 -
851228082:
851228082 写道a----compile----b-- ...
第五章 坐标和依赖 -
851228082:
a----compile----b-----provided- ...
第五章 坐标和依赖 -
851228082:
甚至在某次技术会议现场遇到《Maven in action》的 ...
关于 Maven的传递依赖的理解
请您先登录,才能继续操作
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 并不是完全没用的依赖,只是在编译主代码和测试代码时没用,但可能会在执行测试和运行时用到。
评论
按照我的理解,编译、测试时,a仍然会依赖c,只是运行时不再依赖,而由容器提供。所以,结果应该是provided
a----provided----b-----compile---c,结果就是provided
这个有点类似,编译、测试时,a依赖b,根据传递性也依赖c。但是打包时a不再依赖b,也就不再依赖c,改由容器提供b和c,所以,结果应该还是provided
以上两种是个人见解。
虽然结果时一样的,但是过程的分析,不一样。
按照我的理解,编译、测试时,a仍然会依赖c,只是运行时不再依赖,而由容器提供。所以,结果应该是provided
a----provided----b-----compile---c,结果就是provided
这个有点类似,编译、测试时,a依赖b,根据传递性也依赖c。但是打包时a不再依赖b,也就不再依赖c,改由容器提供b和c,所以,结果应该还是provided
以上两种是个人见解。
我看书的时候也觉得这表的关系有点不对劲。反正没懂他的表为啥会这样。
发表评论
-
关于 Maven的传递依赖的理解
2012-09-30 09:50 13980今天又回顾了一下 《Maven in Action》的读书笔记 ... -
《Maven in Action》读后感
2012-02-23 23:48 2207今天终于读完了《Maven in Action》一书,真所谓书 ... -
第十八章 Archetype
2012-02-23 23:30 50751. Archetype 是 Maven ... -
第十七章 编写Maven插件
2012-02-23 19:42 44891. 编写 Maven 插件的主要步骤 ... -
第十六章 m2eclipse
2012-02-23 15:44 23741. m2eclipse ( http: ... -
第十五章 生成项目站点
2012-02-21 09:27 22841. Maven 社区提供了大量插件,能让用户 ... -
第十四章 灵活的构建
2012-02-20 16:21 18671. 通过 <propertie ... -
第十三章 版本管理
2012-02-20 15:57 21161. 版本管理( Version Manage ... -
第十二章 使用Maven构建Web应用
2012-02-15 18:38 60381. Web 项目的 POM ... -
第十一章 使用Hudson进行持续集成
2012-02-09 17:09 23091. 持续集成就是快速 且高频率 ... -
第十章 使用Maven进行测试
2012-02-05 22:17 214001. com.google.code. ... -
第九章 使用Nexus创建私服
2011-12-06 23:17 107951. Nexus 分为开源版和企业版,开源 ... -
第八章 聚合与继承
2011-12-06 09:55 20451. 为了能用一条命令来构建一个实际 ... -
第七章 生命周期和插件
2011-12-05 13:36 23031. Maven 的生命周期就是为了对所有的构 ... -
第六章 仓库
2011-12-03 18:44 24051. Maven 在一个工作站上的某个位置统一 ... -
第四章 背景案例
2011-12-02 21:20 14181. 主要场景: 1) 用户访问注册页面 2) ... -
第三章 Maven 使用入门
2011-12-01 18:40 25461. 就像Make的Makefile, Ant的build. ... -
第二章 Maven的安装和配置
2011-12-01 10:01 62331. 设置JAVA_HOME, Path中加入%JAVA_H ... -
第一章 Maven 简介
2011-12-01 09:48 22881. Maven 是优秀的构建工 ...
相关推荐
背景案例第5章 坐标和依赖第6章 仓库第7章 生命周期和插件第8章 聚合与继承第9章 使用nexus创建私服第10章 使用maven进行测试第11章 使用hudson进行持续集成第12章 使用maven构建web应用第13章 版本管理第...
5. **精度优化**:可能采用了先进的机器学习模型,如深度神经网络,提高关键点检测的准确性和鲁棒性。 6. **兼容性**:可能支持多种输入格式和输出格式,适应不同的应用场景。 7. **用户界面**:提供图形用户界面...
在Windows环境下,对C++开发人员来说,进行源码编译PROJ-C++坐标转换库以及其依赖库是一项常见的任务。这涉及到下载源代码、配置编译环境、解决依赖关系等多个步骤,对于初学者可能会遇到不少挑战。下面将详细介绍这...
在实际操作中,如Universal Robots的UR5机器人,用户可以通过示教器以手动方式引导机器人,机器人能记忆并复现这些路径和模式,这依赖于对机器人轴和坐标系的深入理解。 安全操作规程也是学习的重要部分,包括在示...
- 第一象限:x轴正半轴和y轴正半轴之间的区域,坐标(x,y)中x和y都是正数。 - 第二象限:x轴负半轴和y轴正半轴之间的区域,坐标(x,y)中x是负数,y是正数。 - 第三象限:x轴负半轴和y轴负半轴之间的区域,...
第五章主要讲解了三维注册与虚实融合,这是AR的核心技术之一。 虚实融合原理首先涉及到实时的三维注册。AR系统必须能够确定虚拟信息在投影系统中的大小、方向和映射位置,确保从任何角度观察,虚拟物体都能与真实...
5. **坐标变换**:如果需要对坐标进行缩放、旋转或平移,可以使用VB6.0的`ScaleMode`和`Scale`属性。`ScaleMode`定义了坐标单位,如像素或百分比,而`Scale`则允许设置坐标转换的比例因子。 6. **图形移动**:通过...
第5章:坐标和依赖/5.9 最佳实践/5.9.2 依赖属性使用变量 第5章:坐标和依赖/5.9 最佳实践/5.9.3 依赖关系查看 第6章:仓库/6.1 何为Maven仓库 第6章:仓库/6.2 仓库的布局 第6章:仓库/6.3 仓库的分类 第6章:仓库/...
7. **依赖管理和继承**:在大型项目中,可以通过创建父POM来集中管理公共依赖和插件,子项目通过继承父POM来继承这些配置。 8. **版本管理和生命周期**:Maven的版本管理允许我们轻松地升级或降级依赖版本。生命...
第五题再次强调了方向角度的不变性,即在不同位置观察同一目标,其方位角是相同的。 第六题涉及角度的计算和直角三角形的性质。通过计算两村相对于A村的角度差,以及利用勾股定理计算两村之间的距离。 第七题是...
5. **SIS (Spatial Information System)**:由Apache提供的库,为GeoTools提供了元数据处理、时间序列管理和地球参考框架的支持。 6. **NetCDF-Java**:用于读取和写入NetCDF(Network Common Data Form)文件,这...
- 直角坐标Pr[i]在不同坐标系下移动,机器人会到达不同的空间位置,因为直角坐标依赖于坐标系的定义。 4. **用户坐标系建立**: - 用户坐标系可以通过三点法建立,三个点分别指定原点、X轴正向和XY平面,不一定...
首先,CSS3是CSS(层叠样式表)的第三个主要版本,引入了许多新的特性和功能,其中包括动画和过渡。这些特性使得开发者能够创建动态效果,如颜色变化、大小缩放、旋转等,而无需依赖JavaScript或者其他外部库。 在...
本资料涉及的是第四章的内容,主要讲解了两个具体的平面问题的解答,分别是实心圆盘受均布压力作用的问题和半平面体表面受均布水平力的问题。 首先,我们来看实心圆盘的问题。当圆盘的周界受到均布压力q作用时,...
【同济大学第五高等数学下D对坐标曲面积分PPT学习教案】 这篇PPT教程主要介绍了关于有向曲面及曲面积分的数学概念,适用于高等数学的学习,特别是曲面积分这一章节。以下是详细的知识点讲解: 1. **有向曲面及曲面...
《激光SLAM理论与实践第三章》主要涵盖了激光SLAM(Simultaneous Localization and Mapping,同时定位与建图)技术的基础知识,特别是基于C++实现的相关算法和实践应用。SLAM是机器人领域的一个核心问题,它允许无人...
这个项目可能依赖于第三方的GeoCoding服务,如Google Maps API或OpenStreetMap Nominatim API。它们提供RESTful接口,可以接受经纬度并返回对应的行政区域信息。 2. **Spring Boot整合RESTful API**:Spring Boot...