首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

Maven札记4-Maven坐标和依赖

2012-06-27 
Maven笔记4-Maven坐标和依赖??? Maven的坐标元素有:groupId,artifactId,version.packaging,version,classf

Maven笔记4-Maven坐标和依赖

??? Maven的坐标元素有:groupId,artifactId,version.packaging,version,classfier,其中,前三个是必须的,

??? packaging是可选的,而classfier是不能直接定义的。

??? (1) groupId: 定义当Maven项目隶属的实际项目。它的表示方式与Java的包命名方式相同,是域名的反向,

??? 例如org.dmwdp.authority,其中org.dmwdp表示DMWDP公司,authority是权限体系项目。

??? (2) artifactId: 定义实际项目中的模块(Module)。推荐使用实际的项目名称作为前缀,例如权限体系项目下

??? 的角色管理模块:dmwdp-role;默认情况下,Mavne生成的构建是以artifactId作为文件名称的。

??? (3) version:定义Maven项目当前所处的版本。

??? (4) packaging: 定义Maven 项目的打包方式,默认为JAR。

??? (5) classfier: 用来帮助定义构建输出一些附属构件,附属构件与主构件对应。如主构件为:org.dmwdp

??? .authority-1.0.0.jar,则附属构件为org.dmwdp.authority-1.0.0-javadoc.jar或org.dmwdp.authority

??? -1.0.0-sources.jar

??? 同时项目构件的文件名的一般规则时:artifactId-version[-classfier].packaging,上述5个元素中,

??? groupId,artifactId,version是必须定义的,packaging是可选的,默认为jar,而classifier是不能直接定义的。

1. 依赖的配置

??? 标准的依赖配置:

??? <project>

?????????? .....

?????????? <dependencies>

??????????????? <dependency>

?????????????????????? <groupId>...</groupId>

?????????????????????? <artifactId>...</artifactId>

?????????????????????? <version>...</version>

?????????????????????? <type>...</type><!--默认为JAR-->

?????????????????????? <scope>...</scope>

?????????????????????? <optional>...</optional>?? <!--标记依赖是否可选-->

?????????????????????? <exclusions>? <!--排除传递性依赖-->

???????????????????????????? <exclusion>

????????????????????????????????? ...

???????????????????????????? </exclusion>

???????????????????????????? ...

??????????????? </dependency>

?????????? </dependencies>

?????????? ...

??? </project>

2. 依赖范围

??? Maven在编译项目主代码的时候需要使用一套classpath(编译classpath),而在编译和执行测试的时候又会使用

??? 另外一套classpath(测试classpath),而最终运行项目的时候有使用一套classpath(运行classpath)。Maven

??? 的依赖范围就是用来控制依赖与这三种classpaht的关系。

??? (1) compile

??? 编译依赖范围。如果没有指定,就会默认使用该依赖范围。使用此依赖范围的Maven依赖,对于编译、测试、运

??? 行三种classpaht都有效。

??? (2) test

??? 测试依赖范围。只对于测试classpaht有效,如junit.jar.

??? (3) provided

??? 已提供的依赖范围。对于编译和测试classpath有效,但在运行时无效,如servlet-api.jar.

??? (4) runtime

??? 运行时依赖范围。对于测试和运行的classpaht有效,但在编译主代码时无效,如JDBC实现。

??? (5) system

??? 系统依赖范围。与provided的依赖范围完全一致,但是system范围的依赖时必须通过systemPath元素显示的

??? 指定依赖文件的路径。由于此类依赖不是通过Maven仓库解析的,而且与本机系统绑定,可能造成构建不可移??

??? 植,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>

??? (6) import

??? 导入依赖范围,不会对上述三种classpath产生实际的影响。

3. 传递性依赖和依赖范围

??? 下表中最左边一行表示第一直接依赖,最上面一行表示第二直接依赖:

?????????????????? compile????????? test?????????? provided???????????? runtime

??? compile?? compile??????????? -???????????????????? -?????????????????? runtime

??? test???????? test???????????????? -???????????????????? -?????????????????? test

??? provided provided????????? -?????????????? provided???????????? provided

??? runtime?? runtime??????????? -???????????????????? -?????????????????? runtime

??? 说明:当第二直接依赖的范围是compile的时候,传递性依赖的范围与第一直接依赖的范围一致;当第二直接

??? 依赖的范围是test的时候,依赖不会得以传递;当第二直接依赖的范围是provided,值传递第一直接依赖范围

??? 也为provided的依赖,且传递性依赖的范围同样为provided;当第二直接依赖的范围是runtime的时候,传

??? 递性依赖的范围与第一直接依赖的范围一致,但compile例外,此时传递性依赖的范围为runtime.

4. 依赖调解

??? (1) 例如:A->B-C->X(1.0),A->D->X(2.0),针对这种依赖,Maven采用的第一条依赖调解原则是:路径最近

??? 着优先。上述依赖中X(1.0)的路径是3,而X(2.0)的路径是2,因此X(2.0)会被解析使用。

??? (2) 例如:A->B-Y(1.0),A->C-Y(2.0),此时路径长度一样,Maven采用的第二条依赖调解原则是:第一声明者

??? 优先。因此上述依赖中的Y(1.0)会被解析使用。

5. 排除依赖

??? ...

??? <dependencies>

??????? <dependency>

???????????? <groupId>org.dmwdp.authority</groupId>

???????????? <artifacId>project-b</artifactId>

???????????? <version>1.0.0</version>

???????????? <exclusions>

???????????????? <exclusion>

????????????????????? <groupId>com.dmwdp.authority</groupId>

????????????????????? <artifactId>project-c</artifactId>

???????????????? </exclusion>

???????????? </exclusions>

??????? </dependency>

??? </dependencies>

??? ...

6. 优化依赖

??? 查看当前项目已解析依赖:mvn? dependency:list

??? 查看当前项目的依赖树:mvn dependency:tree

??? 当前项目依赖:mvn dependency:analyze

热点排行