`

02 坐标和依赖

阅读更多

一、坐标
Maven中的坐标用来标识构件。Maven中的任意构件都有一个唯一的坐标,Maven可以通过这个坐标在仓库中查找相关构件,我们开发自己的项目时也需要一个坐标。
坐标由groupId、artifactid、version、packaging、classifier构成,如:

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

 

1.groupId:
      定义当前Maven项目隶属的实际项目。首先,Maven和实际的项目不是一定的一一对应的关系。比如SpringFramework这个开源项目,由多个Maven项目如:spring-core、spring-context等。其次,groupId不应该对应到项目隶属的组织或公司。因为一个组织很可能会有多个实际项目。最后,groupId和表示方式和Java包名的表示方式类似。通常是域的反写。

 

2.artifactId
     定义实际项目中的一个Maven项目(模块),推荐的做法是使用实际项目的名称作为artifactId的前缀。这样的好处是方便寻找。

 


3.version
     定义Maven项目当前所处的版本。

 

4.packaging:(可选)
     定义Maven项目的打包方式。首先,打包方式通常与生成构件的文件扩展名对象。如上例生成的文件名为nexus-indexer-1.0.0.jar。使用war打包方式最终会生成一个.war文件。但这个不是绝对的。其次,打包方式会影响到项目构建的生命周期。例如jar打包和war打包会使用不同的命令。最后,当不定义packaging时,默认是jar。

 

5.classifer:(不可直接定义)
      该元素用来定义主构建的一些附属属性。附属属性与主构件对应。如上例中的nexus-indexer-1.0.0.jar是主构件。该项目还有一些附属构件如:nexus-indexer-1.0.0-source.jar、nexus-indexer-1.0.0-javadoc.jar。这时source和javadoc就是这两个构件的classifier。
注意:不能直接定义项目的classifer,因为附属构件项目的直接默认生成的,而是由附加的插件帮助生成的。

 

 

二、依赖
    声明依赖使用pom.xml的project根元素下dependencies元素。如:

 

    ...
	<dependencies>
		<dependency>
			<groupId>...</groupId>
			<artifactId>...</artifactId>
			<version>...</version>
			<type>...</type>
			<scope>...</scope>
			<optional>...</optional>
			<exclusions>
				<exclusion>
					...
				</exclusion>
				...
			</exclusions>
		</dependency>
		...
	</dependencies>
</project>

     每个dependencies可以包含任意个dependency元素,以声明一个一个依赖。每个依赖可用的属性有:
groupId、artifactId和version:依赖的基本坐标
type:依赖的类型,对应于项目坐标中的packaging。大部分情况下,该元素不必指定,其默认值是jar
scope:依赖范围
optional:标记依赖是否可选。
exclusions:用来排除传递性依赖。

 

 

三、依赖范围
      首先Maven在编译项目主代码时需要使用一套classpath;其实在编译的执行测试代码时会使用另一套classpath;最后,实际运行Maven项目时,又会使用一套classpath。
      依赖范围就是用来控制依赖与这三种classpath的关系。Maven有以下几种依赖范围:

  • compile:默认依赖范围。对于编译、测试和运行三种classpath都有效。 
  • test:只对于测试classpath有效
  • provided:只对编译和测试classpath有效,但在运行时无效。
  • runtime:对于测试和运行classpath有效,但在编译主代码时无效。
  • system:该依赖范围与三种classpath的关系和provided依赖范围完全一致。但是,使用system范围的依赖时,必须通过systemPath元素显式地指定依赖文件的路径。由于此类依赖不是通过Maven仓库获取的,而且往往与本机系统绑定,可能会造成不可移植,因此应该谨慎使用
  • import:该依赖范围不会对三种classpath产生实际影响。在继承和依赖管理时再介绍。

 


四、传递性依赖
     假设A依赖于B,B依赖于C,C就是A的传递性依赖。B是A的第一直接依赖,C是B的第二直接依赖。
     依赖范围不仅可控制依赖与三种classpath的关系,还会对传递性依赖产生影响。 第一直接依赖和第二直接依赖的范围会影响传递性依赖的范围。
当第二直接依赖的范围是compile时,传递性依赖的范围与第一直接依赖的范围一致;
当第二直接依赖的范围是test的时候,依赖不会传递;
当第二直接依赖的范围是provided时,只传递第一直接依赖范围也为provided的依赖,且传递性依赖的范围同样为provided;
当第二直接依赖的范围是runtime时,传递性依赖的范围与第一直接依赖的范围一致,但compile除外,此时传递性依赖的范围为runtime。

 


五、依赖调解
      Maven的依赖传递机器大大简化了依赖声明。大部分情况下,我们只需要关心项目的直接依赖,而不用考虑这些直接依赖会引入什么传递性依赖。但有时候,传递性依赖造成问题时,我们就需要清楚地知道传递性依赖是从哪条路径引入的。

例如,项目A的依赖关系为:A->B->C->X(1.0)、A->D->X(2.0)。X是A的传递性依赖,但是两条路径上的X版本不一致。
      Maven的依赖调解第一原则是:路径最近者优先,第二原则是:第一声明者优先。

 


六、可选依赖
      在声明依赖时可使用<optional>true<optional>标准,这表明是可选依赖,它们只会对当前项目产生影响,其他项目依赖于B时候,这两个依赖不会被传递。如果真要使用这个依赖,需要在项目中直接声明。
理想情况下,是不应该使用可选依赖的,使用可靠依赖的原因是某一个项目实现了多个特性,依据单一职责原则,更好的做法是他建多个Maven项目,用户根据需要选择使用哪个Maven项目。

 


七、最佳实践
1.排除依赖
      传递性依赖简化项目依赖的管理的同时,也可能会带来一些问题。例如,第当前项目有一个第三方依赖,而这个第三方依赖由于某些原因依赖了另一个类库的SNAPSHOT版本,而SNAPSHOT是不稳定的版本。这里就需要排除掉该SHAPSHOT版本,并在当前项目中声明该类库的某个正式版本。还有一些情况,比如Sun JTA API等由于版权因素,我们希望使用其他版本实现来代替。这时就可以使用:

 

<dependency>
	<exclusions>
		<exclusion>
			<groupId></groupId>
			<artifactId></artifactId>
		</exclusion>
	</exclusions>
</dependency>

 

     排除依赖不需要指定版本号

 

2.归类依赖
      在我们一些框架如Spring FrameWork时,会有很多依赖,它们的版本号是相同的。这时我们可以声明一个变量,然后在其他地方使用这个变量 。
声明变量如下:

<project>
<properties>
	<property>
		<springframework.version>2.5.6</springframework.version>
	</property>
</properties>
</project>

 

      使用方法如下:

<version>${springframework.version}</version>

 

 3.依赖分析优化
mvn dependency:list 查看解析后的最终依赖
mvn dependency:tree 查看解析后的依赖树
mvn dependency:analyze 帮助分析当前项目的依赖 
该命令的结果主要有两个部分:
首先是Used undeclared dependencies,指项目中使用到的,但是没有显式声明的依赖。
其次是Unused declared dependencies,指项目中未使用的显式依赖。

分享到:
评论

相关推荐

    三. 坐标和依赖

    坐标和依赖”通常指的是在软件开发中管理项目依赖关系的概念,尤其是在Java或Maven等环境中。这里的"坐标"通常是指一个项目依赖的具体版本和它的来源,比如groupId、artifactId和version,这三个元素组合在一起就...

    WGS84、GCJ02、BD09坐标系shp数据的互转工具合集

    本压缩包提供了一套完整的工具,专门用于处理WGS84、GCJ02和BD09三种坐标系之间的shp数据互转,无需依赖任何其他GIS软件,使得转换工作更为便捷。 **WGS84坐标系**,全称为“World Geodetic System 1984”,是一种...

    WGS84、GCJ02、BD09坐标系shp数据的互转.docx

    由于这三种坐标系之间的差异,在实际工作中常常需要进行坐标转换以确保数据的一致性和准确性。 #### 工具简介 本文所介绍的工具是一款专门用于处理WGS84、GCJ02、BD09坐标系下的shapefile(shp)数据的转换软件。...

    WGS84转google坐标(GCJ02) C#

    WGS84转google坐标;WGS84/GCJ02/BD09与墨卡托转换;地球坐标系 (WGS-84) 到火星坐标系 (GCJ-02) 的转换算法;WGS-84 到 GCJ-02 的转换(即 GPS 加偏)算法 火星坐标与地图坐标转换 C#版

    万维坐标转换工具万维坐标转换工具万维坐标转换工具

    3. 参数模型:坐标转换往往依赖于一定的数学模型,如七参数法(三个平移参数、三个旋转参数和一个尺度参数)、三参数法(两个平移参数和一个尺度参数)或四参数法。这些参数通常由已知控制点的坐标来确定,以确保...

    c# GPS坐标与火星坐标互转

    火星坐标,通常指的是GCJ-02坐标系统,是由中国国家测绘局采用的一种加密方式,主要应用于中国的电子地图服务,如高德地图。Google坐标,即Web Mercator坐标系统,是谷歌地图采用的标准,它是一种投影坐标系,便于...

    火星坐标转84坐标

    "火星坐标转84坐标"指的是将中国特有的火星坐标系统(GCJ-02,也称作火星加密坐标系)转换为国际广泛认可的WGS-84坐标系的过程。这个过程是为了确保地理定位的准确性,因为不同坐标系之间的差异可能导致位置信息的...

    xy.zip_xy大地坐标转换经纬度_坐标 转换_坐标转换_经纬度 坐标

    在"xy.sln"和"xy.suo"这两个文件中,".sln"扩展名通常代表Visual Studio解决方案文件,它包含了项目、依赖项和编译设置。".suo"则是Visual Studio用户选项文件,存储了用户特定的配置,如窗口布局和断点。这些文件...

    火星坐标互转Java版

    总结起来,"火星坐标互转Java版"是一个关于地理坐标转换的项目,它涉及到中国特有的火星坐标系与WGS-84坐标系之间的转换,使用Java编程语言实现,并依赖于特定的偏移量数据文件。对于从事GIS开发或地图应用开发的...

    java GPS坐标系转百度坐标系

    GPS坐标系转换成百度坐标系 经过验证很准确 希望能给你有所帮助。

    提供了百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换.zip

    这里提到的“提供了百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换.zip”是一个压缩包,其中包含的资源可以帮助开发者在JavaScript环境中实现这三种坐标系之间的相互转换。下面我们将...

    GPS坐标转百度坐标及纠偏

    “GpsToBaidu.dproj”是Delphi项目文件,记录了项目的设置和依赖;“GPS坐标转百度坐标API例.txt.html”很可能是一个HTML文档,提供了关于如何使用转换API的示例和说明。 在实际操作中,GPS坐标转百度坐标通常涉及...

    屏幕坐标向OpenGL坐标的转换

    这一过程主要依赖于OpenGL提供的模型视图矩阵和投影矩阵。 1. **获取模型视图矩阵和投影矩阵**:分别通过`glGetDoublev(GL_MODELVIEW_MATRIX, dModelViewMatrix)`和`glGetDoublev(GL_PROJECTION_MATRIX, ...

    C# 坐标正反算

    在IT行业中,坐标正反算是...理解和掌握这一技术,对于开发地图应用、导航系统或者任何依赖地理位置信息的软件都是非常关键的。在实际操作中,开发者不仅需要理解理论,还要能够熟练运用C#语言来实现这些复杂的计算。

    GPS坐标转换为百度地图坐标(JS)

    在IT行业中,尤其是在地理信息系统(GIS)领域,坐标转换是一个重要的环节。GPS(全球定位系统)使用的是WGS84坐标系,而国内常见的百度地图则使用的是BD09坐标系。由于这两种坐标系的不同,当我们在GPS设备上获取到...

    C#绘制坐标轴 C#绘制坐标轴 C#绘制坐标轴

    在WPF中,我们可以使用`System.Windows.Shapes`和`System.Windows.Media`命名空间,其中`Path`、`Line`、`TextBlock`等元素可以用来绘制坐标轴。WPF的绘制方式更偏向于声明式,通过XML样式的XAML来布局和定义图形。...

    Baidu纠偏库,百度地图坐标修改,坐标纠偏

    1. 理解不同的坐标系统和它们之间的转换关系,如WGS84(全球通用坐标系)、GCJ-02和BD-09。 2. 掌握库的接口和使用方法,如何调用纠偏函数进行坐标转换。 3. 注意纠偏库的版本更新,确保使用的库是最新的,以获取...

    七参数坐标转换Java语言代码

    这些参数的确定通常依赖于已知对应点在两个坐标系中的坐标。 在大地坐标系中,坐标通常表示为经纬度和海拔高度,而空间直角坐标系则使用笛卡尔坐标(X、Y、Z)。转换过程通常包括以下步骤: 1. **参数预处理**:...

Global site tag (gtag.js) - Google Analytics