策略一:

对于容器提供的(如:servlet-api-2.3等)和测试需要时的(如:junit-3.81等),可以直接在pom.xml中去掉。

maven的dependency中有一个tag是<scope>option</scope>,其option有以下几个值:

compile, 缺省值,适用于所有阶段,会随着项目一起发布。

provided,类似compile,期望JDK、容器或使用者会提供这个依赖。如servlet-api-2.3.jar。

runtime, 在运行时使用,如JDBC驱动,适用运行和测试阶段。   如plexus-utils-1.1.jar

test     只在测试时使用,用于编译和运行测试代码。不会随项目发布。如Junit-3.8.1.jar

system, 类似provided,需要显式提供包含依赖的jar,Maven不会在Repository中查找它。

如:

<dependency>

<groupId>servletapi</groupId>

<artifactId>servlet-api</artifactId>

<version>2.4</version>

<scope>provided</scope>

</dependency>

<dependency>

<groupId>junit</groupId>

<artifactId>junit</artifactId>

<version>3.8.1</version>

<scope>test</scope>

</dependency>

策略二:

对于第三方jar包,传递依赖到war包的,但发布时并不需要的。

如:我们项目中使用了webwork-2.2.3.jar。可以我们在打包后发现在war下的lib中多了spring-web-1.2.jar,可是我们项目并不需要这个jar啊。

第一种办法:借用<scope>provided</scope>

虽然provided的本意是指jdk或者容器提供的,只是编译中使用,但不会打到war中,但我们也可借用。

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-web</artifactId>

<version>1.2</version>

<scope>provided</scope>

</dependency>

第二种办法: 使用exclusions; (效果与第一种相同)

<dependency>

<groupId>opensymphony</groupId>

<artifactId>webwork</artifactId>

<version>2.2.3</version>

<exclusions>

<exclusion>

<groupId>org.springframework</groupId>

<artifactId>spring-web</artifactId>

</exclusion>

</exclusions>

</dependency>

策略三:

对于我们公司内部开发的jar包,我们都加上<optional>true</optional>,这样可以使引用这些jar的项目不会产生传递依赖。

如:项目mycom-csa中使用了mycom-cas-client-1.0.3.jar,然而mycom-cas-client-1.0.3.jar 又使用了mycom-common-security-1.0.3.jar。所以我们在对mycom-csa打包时会把mycom-common-security-1.0.3.jar打进package中。我们当然可以参考“策略二”,但最好的方法是:可以通知开发mycom-cas-client-1.0.3.jar的同事在mycom-cas-client-1.0.3.jar的pom.xml中对dependency修改为:

<dependency>

<groupId>com.mycom</groupId>

<artifactId>mycom-common-security</artifactId>

<version>1.0.3-SNAPSHOT</version>

<optional>true</optional>

</dependency>

添加<optional>true</optional> ,这样我们再打包时mycom-csa中就不会出现mycom-common-security-1.0.3.jar了。

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

我们知道,maven的依赖关系是有传递性的。如:A-->B,B-->C。但有时候,项目A可能不是必需依赖C,因此需要在项目A中排除对A的依赖。在maven的依赖管理中,有两种方式可以对依赖关系进行,分别是可选依赖(Optional Dependencies)以及依赖排除(Dependency Exclusions)。

一、可选依赖

当一个项目A依赖另一个项目B时,项目A可能很少一部分功能用到了项目B,此时就可以在A中配置对B的可选依赖。举例来说,一个类似hibernate的项目,它支持对MySQLOracle等各种数据库的支持,但是在引用这个项目时,我们可能只用到其对mysql的支持,此时就可以在这个项目中配置可选依赖。

配置可选依赖的原因:1、节约磁盘、内存等空间;2、避免license许可问题;3、避免类路径问题,等等。

示例:

  1. <project>
  2. ...
  3. <dependencies>
  4. <!-- declare the dependency to be set as optional -->
  5. <dependency>
  6. <groupId>sample.ProjectB</groupId>
  7. <artifactId>Project-B</artifactId>
  8. <version>1.0</version>
  9. <scope>compile</scope>
  10. <optional>true</optional> <!-- value will be true or false only -->
  11. </dependency>
  12. </dependencies>
  13. </project>

假设以上配置是项目A的配置,即:Project-A --> Project-B。在编译项目A时,是可以正常通过的。

如果有一个新的项目X依赖A,即:Project-X -> Project-A。此时项目X就不会依赖项目B了。如果项目X用到了涉及项目B的功能,那么就需要在pom.xml中重新配置对项目B的依赖。

二、依赖排除

当一个项目A依赖项目B,而项目B同时依赖项目C,如果项目A中因为各种原因不想引用项目C,在配置项目B的依赖时,可以排除对C的依赖。

示例(假设配置的是A的pom.xml,依赖关系为:A --> B; B --> C):

  1. <project>
  2. ...
  3. <dependencies>
  4. <dependency>
  5. <groupId>sample.ProjectB</groupId>
  6. <artifactId>Project-B</artifactId>
  7. <version>1.0</version>
  8. <scope>compile</scope>
  9. <exclusions>
  10. <exclusion>  <!-- declare the exclusion here -->
  11. <groupId>sample.ProjectC</groupId>
  12. <artifactId>Project-C</artifactId>
  13. </exclusion>
  14. </exclusions>
  15. </dependency>
  16. </dependencies>
  17. </project>

当然,对于多重依赖,配置也很简单,参考如下示例:

  1. Project-A
  2. -> Project-B
  3. -> Project-D
  4. -> Project-E <! -- This dependency should be excluded -->
  5. -> Project-F
  6. -> Project C

A对于E相当于有多重依赖,我们在排除对E的依赖时,只需要在配置B的依赖中进行即可:

  1. <project>
  2. <modelVersion>4.0.0</modelVersion>
  3. <groupId>sample.ProjectA</groupId>
  4. <artifactId>Project-A</artifactId>
  5. <version>1.0-SNAPSHOT</version>
  6. <packaging>jar</packaging>
  7. ...
  8. <dependencies>
  9. <dependency>
  10. <groupId>sample.ProjectB</groupId>
  11. <artifactId>Project-B</artifactId>
  12. <version>1.0-SNAPSHOT</version>
  13. <exclusions>
  14. <exclusion>
  15. <groupId>sample.ProjectE</groupId> <!-- Exclude Project-E from Project-B -->
  16. <artifactId>Project-E</artifactId>
  17. </exclusion>
  18. </exclusions>
  19. </dependency>
  20. </dependencies>
  21. </project>

mvn scope (转)的更多相关文章

  1. scalac error: bad option: '-make:transitive' on mvn package via command line

    1 问题描述: ubuntu环境下用eclipse+maven开发Scala的时候出现错误:scalac error: bad option: '-make:transitive' on mvn pa ...

  2. Command mvn jetty:run

    How to use the command mav jetty:run? There is a simple display as below: Step 1: You should generat ...

  3. MVN使用随笔

    001 创建项目 mvn archetype:generate -DgroupId=com.company.push.monitor -DartifactId=push-monitor -Darche ...

  4. maven源码分析- mvn.bat分析

    第一次知道MAVEN是在2008年,当时想分析geoserver这个开源项目,发现该项目采用了maven进行项目管理,当时粗略的学习了一下.真正在工作中使用是在09年下半年,个人感觉使用起来还是非常好 ...

  5. mvn编写主代码与测试代码

    maven编写主代码与测试代码 3.2 编写主代码 项目主代码和测试代码不同,项目的主代码会被打包到最终的构件中(比如jar),而测试代码只在运行测试时用到,不会被打包.默认情况下,Maven假设项目 ...

  6. mvn 命令

    mvn eclipse:eclipse  用mvn把文件转化成eclipse支持的文件 mvn install   打包jar,放到本地仓库 ,在打包的时候还会执行单元测试,不需要的话运行(不需要打入 ...

  7. mvn详解

    1.前言 Maven,发音是[`meivin],"专家"的意思.它是一个很好的项目管理工具,很早就进入了我的必备工具行列,但是这次为了把project1项目完全迁移并应用maven ...

  8. scope引起的问题

    背景 执行mvn clean test命令提示部分包不存在,但通过eclipse的clean操作后可以执行mvn test命令 解决方法 mvn clean操作为清空编译的class文件,test的话 ...

  9. mvn管理项目jar包

    Maven是一个采用纯Java编写的开 源项目管理工具.Maven采用了一种被称之为project object model (POM)概念来管理项目,所有的项目配置信息都被定义在一个叫做POM.xm ...

随机推荐

  1. kvm--virsh命令行下管理虚拟机

    virsh 既有命令行模式,也有交互模式,在命令行直接输入 virsh 就进入交互模式, virsh 后面跟命令参数,则是命令行模式: (1)基础操作 --- 命令行下管理虚拟机 virsh list ...

  2. Android中ProgressDialog自动消失

    主要函数部分代码: final ProgressDialog proDialog = android.app.ProgressDialog .show(MainActivity.this, " ...

  3. MFC 课程总结

    <基于MFC框架开发>马志国 1491989781 MFC课程的组成 1.1 MFC应用程序的组成部分.执行机制和执行流程(10.5天). 1.2 Windows平台上的数据库访问技术(1 ...

  4. Re0:DP学习之路 数塔 HDU - 2084(基础递推)

    解法 首先是输入的问题,输入的时候还要注意每一层都有多少个 然后是怎么求解,一般求解首先要考虑顺序,是正序还是倒序 如果这个题是正序的话那么最终还需要将最后一行进行一次找max的运算 如果是倒序的话那 ...

  5. MySQL异常:com.mysql.jdbc.PacketTooBigException: Packet for query is too large

    ### Cause: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (1169 > 1024). You ...

  6. buf.readUInt32BE()函数详解

    buf.readUInt32BE(offset[, noAssert]) buf.readUInt32LE(offset[, noAssert]) offset {Number} 0 noAssert ...

  7. 抽象类和接口有什么区别---https://blog.csdn.net/csdn_aiyang/article/details/71171886

    https://blog.csdn.net/csdn_aiyang/article/details/71171886 概念]   抽象类.具体类是相对的,并非绝对的.抽象是一种概念性名词,具体是一种可 ...

  8. java方法的虚分派和方法表

    java:方法的虚分派(virtual dispatch)和方法表(method table) Java方法调用的虚分派 虚分配(Virtual Dispatch) 首先从字节码中对方法的调用说起.J ...

  9. 【BZOJ4199&UOJ131】品酒大会(后缀数组,并查集)

    题意: 两杯“r相似” (r>1)的酒同时也是“1 相似”.“2 相似”.…….“(r−1) 相似”的. n<=300000 abs(a[i])<=10^9 思路:对于i,j两个后缀 ...

  10. nyoj_68_三点顺序_201404152013

    三点顺序 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 现在给你不共线的三个点A,B,C的坐标,它们一定能组成一个三角形,现在让你判断A,B,C是顺时针给出的还是逆 ...