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