策略一:

对于容器提供的(如: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. 「 hihoCoder 1014 」Trie 树

    标题真直接 题目大意 给你 $n$ 个字符串.存到一个字典中.又给你 $m$ 个询问,每个询问给一个字符串,在字典中查出有多少个字符串是以这个字符串为前缀. 解题思路 模板题啊 在每个点设置一个变量 ...

  2. Python爬虫入门教程第七讲: 蜂鸟网图片爬取之二

    蜂鸟网图片--简介 今天玩点新鲜的,使用一个新库 aiohttp ,利用它提高咱爬虫的爬取速度. 安装模块常规套路 pip install aiohttp 运行之后等待,安装完毕,想要深造,那么官方文 ...

  3. 前端面试题总结一(js变量和函数声明提前相关)

    好久没有更新博客了,^_^写写博客吧!下面是我总结的一些面试题,希望对大家有所帮助 (1)题目如下: alert(a)  var a=1  function a(){    alert(a) } 好多 ...

  4. TensorFlow Ops

    TensorFlow Ops 1. Fun with TensorBoard In TensorFlow, you collectively call constants, variables, op ...

  5. [K/3Cloud] KSQL 关联表更新字段Update语法

    关联表更新字段 UPDATE tmp369faa3f7d224b0595670425008 as t1 SET FStatus=-1 where exists(select 1 from t_BD_S ...

  6. CentOS redis安装配置

    编译依赖安装 yum install gcc-c++ yum install -y tcl 安装步骤 下载:wget http://download.redis.io/releases/redis-5 ...

  7. Android: MediaRecorder start failed

    在某些机型上,MediaRecorder在调用start方法时,会出现start failed的错误,有一种可能是setVideoFrameRate导致的.要解决这个问题,只需要注释掉这条语句就可以了 ...

  8. css3 和 html5 笔记

    1.css3 ie下大部分不兼容 ie9以下 浏览器低版本不兼容 需要写 -webket-transition:1s -moz-transition: 1s -o-transition:1s tran ...

  9. 【CV论文阅读】Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks

    由RCNN到FAST RCNN一个很重要的进步是实现了多任务的训练,但是仍然使用Selective Search算法来获得ROI,而FASTER RCNN就是把获得ROI的步骤使用一个深度网络RPN来 ...

  10. 使用IDA破解TraceMe.exe

    我发现用IDA破解TraceMe.exe比ODeasy多了. 打开IDA 后.直接搜索"序列号".得到 双击跳转到反汇编窗体,按F5转换为类C++代码 signed int __s ...