您的位置:首页 > 其它

关于maven依赖范围的个人理解

2017-01-07 19:06 190 查看
pom文件中有个元素是scope  表示构建的依赖范围

<maven 实战>这本书原文片段是如下:

        首先需要知道,Maven在编译项目主代码的时候需要使用一套classpath.  在执行测试的时候会使用另外一套classpath.实际运行Maven项目的时候,又会使用一套classpath

我的理解是,maven在编译项目代码的时候 会根据scope 编译需要引入的构件. 比如scope的值为test,那么在编译主项目代码的时候是不会引入该构件值的.

Maven 与以下几种依赖范围:

     compile:编译依赖范围.如果没有指定scope的值,就会默认使用该依赖范围.使用此依赖范围,在编译,测试,和运行的时候都会引用该构件

     test:测试依赖范围.只有在使用maven执行测试的时候才会引用该构件.在编译主代码或者运行项目的时候都不会引用该构件.典型的例子是JUnit,它只有在编译测试代码及运行       测试的时候才需要.

     provided:已提供依赖范围.在编译主项目代码和使用maven进行测试的时候会引用该构件.但在运行时无效.典型的例子是servlet-api,编译和测试项目的时候需要该依赖,但在运       行项目的时候,由于容易已经提供,就不需要Maven重复地引入一遍.

   

     runtime:运行时依赖范围.使用maven进行测试 和 运行项目的时候会引入该构件.在编译主代码是无效.典型的例子是JDBC驱动实现,项目主代码的编译只需要JDK提供JDBC接口,  只有在执行测试或者运行项目的时候才需要实现上述接口的具体JDBC驱动.

    system:系统依赖范围.和provided是效果一样.但是使用system范围的依赖必须通过systemPath元素显示的指定依赖文件的路径.由于此类依赖不是通过Maven仓库解析的,而且

往往与本机系统绑定,可能造成构件的不可移值.systemPath元素可以使用环境变量,如:

  <dependecy>

     <groupId>java.sql</groupId>

     <artifactId>jdbc-stdext</artifactId>

     <version>2.0</version>

     <scope>system</scope>

     <systemPath>${java.home}/lib/rt.jar</systemPath>

</dependency>

      import(Maven2.0.9及以上):导入依赖范围.在编译项目主代码,测试  和 运行的时候都不会引入该构件.

    

   

    

       

     
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  maven