maven---4构件的坐标

96
zlcook
2016.11.16 22:03* 字数 966

需求背景

maven的一大功能时管理项目依赖,为了自动化解析任何一个java构件,Maven就必须将它们唯一标识,这就是通过maven坐标实现。

实现原理

maven定义了这样一组规则:世界上任何一个构件都可以使用maven坐标唯一标识,坐标元素包括:groupId、artifactId、version、packaging、classifier。只要提供正确的坐标就能从仓库中找到相应的构件供我们使用。maven从哪里下载构件呢?答:maven内置了一个中央仓库的地址,该中央仓库包含了世界上大部分流行的开源构件。(当然有一些构件在仓库中找不到,需要自己下载)

坐标详解

任何构件都必须明确定义自己的坐标,而一组maven坐标是通过一些元素定义的,他们是:groupId、artifactId、version、packaging、classifier。
先看一组坐标定义如下:

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

这是nexus-indexer项目的坐标,nexus-indexer是一个对maven仓库编纂索引并提供搜索功能的类库,它是Nexus项目的一个子模块。

  • goupId: 定义了当前maven项目隶属的实际项目,maven项目和实际项目不一定对应,比如SpringFramework这一实际项目,其对应的maven项目会有很多,如spring-core、spring-context等。groupId不应该对应到项目所属公司,因为公司下面会有好多项目。

  • artifactId:该元素定义实际项目中的一个maven项目(模块),推荐使用实际项目名称作为artifactId前缀。如上例nexus-indexer使用nexus作为前缀,这样做的好处是方便需找实际构件,因为maven生成构件名称默认是以artifactId作为开头。

  • version:定义maven项目当前所处版本。

  • packaging:定义maven项目的打包方式,首先打包方式通常与所生成构件的文件扩展名对应,如packaging为jar则构件扩展名为jar。packaging为war最终生成以.war结尾文件,但不是绝对。其次,打包方式会影响到构建项目的生命周期,比如jar打包和war打包会使用不同的命令。默认使用jar。

  • classifier:该元素用来帮助定义构件输出的一些附属构件。附属构件与主构件对应,如上例的主构件是nexus-indexer-2.0.0.jar,该项目可能还会通过使用一些插件生成如nexus-indexer-javadoc.jar、nexus-indexer-source.jar这样一些附属构件,其包含了java文档和源代码。这时候,javadoc和sources就是这两个附属构件的classifier。这样,附属构件也就拥有了自己唯一的坐标。还有一个关于classifier的典型例子是TestNG,TestNG的主构件是基于java1.4平台的,而它有提供了一个classifier为jdk1.5的附属构件。注意,不能直接定义项目的classifier,因为附属构件不是项目直接默认生成的,而是由附加的插件帮助生成的。主构件是项目在package阶段是默认生成,而附属构件需要插件来完成。

上述5元素groupId、artifactId、version是必须的,packaging可选,默认jar,classifier不能直接定义。同时,项目构件的文件名是与坐标对应的,一般的规则为artificatId-version[-classifier].packaging。packing并非一定与构件扩展名对应,比如packing为maven-plugin的构件扩展名为jar。

maven
Web note ad 1