Dependency(依赖)

在一个maven项目中,依赖是十分重要的一部分,所以单独列出一个章节来说明。

pom.xml文件中,project下直接嵌入的是一个<dependencies>标签,然后里面嵌入若干个<dependency>标签。

这是一个常见的dependency标签:

                            <dependency>

                                          <groupId>org.apache.commons</groupId>

                                          <artifactId>commons-lang3</artifactId>

                                          <version>3.3.2</version>

                            </dependency>

下面是一个“复杂”的dependency标签:

                            <dependency>

                                          <groupId>org.apache.commons</groupId>

                                          <artifactId>commons-lang3</artifactId>

                                          <version>3.3.2</version>

                                          <scope>compile</scope>

                                          <systemPath>./commons-lang3.jar</systemPath>

                                          <exclusions>

                                                        <exclusion>

                                                                      <artifactId>aopalliance</artifactId>

                                                                      <groupId>aopalliance</groupId>

                                                        </exclusion>

                                          </exclusions>

                                          <optional>false</optional>

                            </dependency>

注意其中红色的部分:

<scope>:表明此依赖的作用域。有如下取值:

         compile:默认。表明此依赖在任何时刻都生效。包括编译、测试、运行。

         test   :表明此依赖只在测试时生效。例如junit.jar。最终的打包是不会被包含的。

provided:表明此依赖在目标环境中已经存在。例如servlet-api.jar,它在tomcat里已经提供了,打包时是不需要打到war文件中的。

         runtime:表示此依赖只在目标环境中运行时才需要,编译时不需要,例如mysql-connector.jar等这些数据库驱动。因为这些依赖是具体的实现,是不会被代码直接使用的。

         system      :表示此依赖是来自外部jar,而不是maven仓库。当scope设置为此值时,systemPath属性才会生效,systemPath为一个物理文件路径,来指定依赖的jar其物理磁盘的位置。

 

<systemPath>:见scopesystem的说明。

<exclusion>  :用来排除传递的依赖。例如project1依赖jarAjarA 依赖jarB。当引入jarA时,jarB也会被引入(在maven中,这被称为依赖传递<transferdependency>)。在某些情况下如果不想jarB被引入,则可以使用exclusion标签来进行控制。

<optional>        :默认值为false。此标签也是用于控制依赖传递的。如果将此值设置为true。则默认情况下此依赖不会被传递,除非在引用中显式引用此依赖。例如project1依赖jarAjarA 依赖jarB,在jarA中引用jarB时,jarB被标记为optional,此时在project1的依赖中就不会包含jarB,如需使用jarB,需要显式引用jarB

 

总结:以上配置在通常情况下使用频率为“较频繁”,所以还是需要掌握的。scopesystem不被maven官方推荐的,所以要慎用。exclusion标签可以排除传递的依赖,这样可以解决某些依赖冲突。依赖冲突另一种简单的解决办法就是将冲突的依赖显式引用下,这样maven就会使用指定的这个依赖,而不是自行判断该使用哪个依赖(其实maven对依赖的管理是采用树形结构的,树顶端会覆盖底端的,所以显式引用某个依赖能够解决依赖冲突。依赖冲突还有一种较复杂的办法就是使用dependencyManagement,小伙伴可以自行学习下)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值