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