原创

maven详解scope

maven的scope相信很多人都有些迷糊

问题1:scope在哪里?

问题2:scope是什么?

问题3:scope怎么用?

我们来一一解答这些问题。

1.scope在哪里?


我们都知道,dependency里面有三个元素:g,a,v(groupID,artifactID,version)

其实dependency里面还有几个其它的元素。

其中有一个就是scope


2.scope是什么 ?

scope是控制该外部包在程序的运行中的哪个时期被使用,编译,测试,运行这三个阶段中的哪一个。

scope有5个可选值:compile,test,provided,runtime,system

对应的三个阶段对应的可选值:compile,test,runtime

scope的设置可以给最终打包的时候的大小控制


3.scope怎么用?

compile:

compile是我们使用的最多的一个(也是scope的默认的一个,如果不写scope属性,那么就是compile)

complie是指的是编译,测试,运行中都会用到,也就是说,默认的是所有的环节都会用到。

  



test:

test是测试的时候用的,也就是说不参与打包,那么也就是说打包的时候会小一些

比如说junit一般都是test,也就是说在测试环节会用到,但是正式环节不会用到,那么就可以用到test

  


runtime:

runntime表示被依赖项目无需参与项目的编译,不过后期的测试和运行周期需要其参与。与compile相比,跳过编译而已,说实话在终端的项目(非开源,企业内部系统)中,和compile区别不是很大。比较常见的如JSR×××的实现,对应的API jar是compile的,具体实现是runtime的,compile只需要知道接口就足够了。oracle jdbc驱动架包就是一个很好的例子,一般scope为runntime。另外runntime的依赖通常和optional搭配使用,optional为true。我可以用A实现,也可以用B实现。
  

  



provided:

provided指的是打包时不会打包进去,但是会参与编译,测试,运行。在依赖中也不会继承下去。这里的sevlet在tomcat里面有,所以不用打包进去,但是其它地方又会用到。

  


system:

system指的是有些包不能通过gav直接找到,或者是自己写的包。我们有一种作法是加入到classpath里面去。但是那样不利于后面的人理解和操作。

maven提供了一种方式,就是scope写system,同时再加一个元素<systemPath><systemPath/>这里写jar的路径(这样也可以直接引用了)

systemPath案例:<systemPath>${basedir}/WebContent/WEB-INF/lib/hamcrest-core-1.3.jar</systemPath>


正文到此结束
本文目录