MAVEN学习(3)------MAVEN的坐标及依赖

补充:

首先对上一篇最后进行一些补充,关于采用mvn clean package和mvn clean install两者,前者是生成jar,可以通过添加依赖的方式被引用,而后者则是将jar添加到本地仓库中,那么其它的maven构建的project则可以直接使用生成的jar。

另外稍作提醒,笔者在打开jar文件时的新手错误,给广大的新手朋友们也提个醒,请使用java -jar的方式打开文件,否则会出现以下情况,正确方式如下:


-------------------------------------------------------------------------------------------------------------------------------------------

下面进入正题,关于MAVEN的坐标及其依赖。

Maven的坐标,顾名思义,是唯一标识某样东西的方式。前面提到过,Maven在管理项目依赖上面具有十分强大的功能,那么为了能够实现自动化去管理项目的依赖,对于java构建的唯一标识就显得很重要,这里的唯一标识就是坐标,坐标也是管理依赖的底层基础。

对于传统的坐标,相信大家已经十分熟悉了,无论是数学中的三维空间里xyz唯一确定某个点,或者是城市里路名东南西北确定的坐标,甚至是游戏里体现的“经纬度”,坐标的作用无一不是帮助我们唯一确定一个东西。在程序的世界中,java拥有数量庞大的构件,也就是各式各样的jar、war,没有Maven时,大家搜索这些jar会十分吃力,尤其是找到某个jar后发现又需要添加其依赖的jar,不得不在各大网站中下载jar浪费了大量时间。由于没有统一的规则,机器就无法自动去搜索需要的jar、war,而当引入了坐标的概念后,机器就能方便的对每一个jar进行确认和搜索。Maven制定了这样的规则:任意一个构建的坐标均可以用坐标唯一标识,坐标包括groupId,artifactId,version,packaging,classifier等,其中前面提到过了groupId,artifactId,version,这里再提一提packaging和classifier,packaging定义的是Maven项目的打包方式,默认为jar,即我们不使用packaging时打包生成的是jar文件,如果我们使用war打包方式,则最后生成的是.war类型的文件。classifier则可以看做是更细致的后缀,例如官方可能会提供某个包的安卓版本、Ios版本、x86版本等等等等,这时候就会用到classifier作为关键字,总之,所有的坐标都是为了唯一确定一个jar使机器能够找到所需要的jar。

接下来我们提一提对于依赖的范围的设置,依赖的测试范围用元素scope来表示,下面我们会详细地依赖的范围。如图所示,test表示了依赖的范围,那么什么是依赖的范围呢,首先我们理解一个概念叫classpath。相信小伙伴们都接触过classpath这个概念,配置环境变量都需要配置path,而classpath和其功能大同小异,其目的就是要告诉java环境,在哪些目录下可以找到执行所需要的类或者包,理解了classpath这个概念以后,我们需要知道maven在不同阶段所需要的classpath是不一样的,在编译项目主代码时需要一套classpath,在编译和执行测试的时候需要另一套classpath,而实际运行maven项目时,又会使用另外一套的classpath,因此,依赖范围就是用来控制依赖与这三套classpath的关系的。换一种说法,依赖范围就是告诉机器某个依赖什么时候生效什么时候无效。

Maven提供了一下几种依赖范围:

1、Compile:编译依赖范围,对于仅编译、测试、运行三个classpath均有效,是默认的依赖范围,如果不使用scope关键字则默认是compile;

2、Test:测试以来范围,只对测试的classpath有效,在编译和运行时均无法使用该依赖,典型的例子是Junit,仅在编译测试和运行测试时依赖;

3、Provided:已提供依赖范围,顾名思义,即是在运行时容器已经提供了依赖不需要maven重复引入,因此在编译和测试时有效;

4、Runtime:运行时依赖范围,对于测试和运行时有效,但在编译代码时无效, 典型的例子是JDBC驱动的实现,编译时只需要提供JDBC的接口,只有实际测试运行时才需要实现jdbc驱动;

5、System:系统范依赖范围,其依赖与3种classpath的关系与Provided依赖范围完全一致,但必须通过SYSTEMPath元素显示指定依赖文件的路径。因此类依赖不是Maven仓库解析的,而是与本机绑定,因此不可移植,因谨慎使用,这里找了一个例子供大家参考:

6、Import(Maven2.0.9及以上):导入依赖范围,对该类型的依赖笔者也不是很清楚,暂时只知道不会对3种classpath产生实际影响,后面如果学习到再进行补充。

  对于Maven的坐标及依赖就暂时记到这里,后面还有一些关于依赖的传递等内容相对也比较好理解,因为大部分被Maven直接管理了,这里就不做太多的介绍了,大家新的一周愉快~

猜你喜欢

转载自blog.csdn.net/cambridgewoo/article/details/57984061