`
JackyCheng2007
  • 浏览: 253589 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Maven Dependency Mechanism - 依赖管理机制

阅读更多
Dependency Mechanism
Java项目开发中肯定需要大量的jar文件,也就是说你要依赖很多已经开发好的jar包。尤其是你要依赖很多开源的东东。有没有感到很迷糊,经常不知道要用到哪些,干脆全部拿来。多么希望用多少来多少,还不用我自己指定。再加上版本的问题,头大。maven号称有奇招。我们来看看maven的依赖管理机制吧。
<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>3.8.1</version>
			<scope>test</scope>
		</dependency>

		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.11</version>
			<scope>compile</scope>
		</dependency>
</dependencies>


Transitive Dependencies 传递性依赖

这个不难理解,大部分的jar都会对别的有依赖。如此下去会不断膨胀。比如Hibernate就依赖很多开源的jar。有很多你都不知道是干什么用的,你只是想用hibernate的功能。依赖环的出现也说不定哦。麻烦。Maven说可以帮你自动管理传递依赖的jar。爽吧。怎么做到的呢?得有两下子才行:
1. Dependency mediation - 依赖调停
调停什么?谁会有冲突?是版本!同一个jar包,又会有不同的版本,因为总是在升级嘛。当你所依赖的jar有不同的版本的时候,该选择那一个呢?那位说了,就选最新的呗。好主意,毕竟大部门软件都向下兼容,但这也不一定哦。看看maven怎么做。maven选择最近的一个版本。什么意思?
比如你的A项目:
A -> B -> C -> D 2.0 and A -> E -> D 1.0,什么意思?A依赖B,。。。一直到依传递依赖到D2.0。同时A还依赖了E到一直到D1.0。这就出现了冲突,你当然也可以再A里面配置指定依赖D2.0。如果你没在A的pom里面配置指定用哪一个。maven会替你找一个近的。哪个近?当然是D1.0,那build A的时候就会选择D1.0。什么原因?这样就好吗?得好好想想?你有什么看法?
有什么好想的?别这么纠结,就指定呗。说的容易,你想想很多时候你是不知道D的存在的,它很可能是个很底层的库,你只熟悉和你最近的项目B和E。

2. Dependency management - 依赖管理
依赖管理就是建议你尽可能的指定依赖的类库的版本。毕竟靠maven调停有一定的风险。

3. Dependency scope  - 依赖有效范围
这个很重要,试想一下,如果不控制,传递依赖可以跑到千里之外。后面再想说怎么用Dependency scope来控制传递到什么时候为止。

4. Excluded dependencies - 排除的依赖
如果我干脆不想引入D,因为我知道我不会用到那一部分功能。那我就可以利用"exclusion" element去排除它。

4. Optional dependencies - 可选的依赖
如果C和E对D都是可选的依赖关系,也就是没有D,C和E都还能工作。那么在C和E里面可以指定D为可选的。那么A就不会引用到D。这也不需要用"exclusion"去排除了。

Dependency Scope
前面说了,既然依赖是传递的,那就得控制传递到什么时候是个头啊。怎么控制?如果是你,你怎么想? 依赖的目的是引用,我用到了他给我的功能,才需要啊。那怎么知道我有没有用到它?什么时候才能知道?你先想到什么了?compile!必须地!
1. compile
编译不了,说什么都白搭。所以必须能使编译通过。所以这个也是默认的scope。编译的时候需要什么就给你添加什么jar。

2. provided
谁来提供?想想看?你的运行环境。最典型的就是web应用,很多jar在web 容器里面就提供了,那我们就没有必要在发布的时候包含它了。不过编译和测试的时候也还是得要,因为这时还没有容器为你提供。这种scope的jar不能被传递?为什么?不同的容器有不同的内容吧。

3. runtime
运行时需要,编译的时候不用。但是test的时候肯定得要,不run怎么test啊。我一时想不出什么例子。你给点?

4. test
仅仅为test的用的,你肯定一下子就能想到junit。别的不多说。

5. system
如果你有一些包你自己的系统里有,你不想让maven从repository里面下载,你可以用这个选项。
<project>
  ...
  <dependencies>
    <dependency>
      <groupId>javax.sql</groupId>
      <artifactId>jdbc-stdext</artifactId>
      <version>2.0</version>
      <scope>system</scope>
      <systemPath>${java.home}/lib/rt.jar</systemPath>
    </dependency>
  </dependencies>
  ...
</project>


6. import
你知道java是不能多继承的,maven也是。如果这样,似乎不太强大,所以maven可以让你用import从别的project中导入依赖。








分享到:
评论
3 楼 JackyCheng2007 2011-03-23  
jin52yang 写道
楼主你好,maven会替你找一个近的。哪个近?
这个最近的是什么意思?可以详细解释一下吗?


A -> B -> C -> D 2.0 and A -> E -> D 1.0,什么意思?A依赖B,。。。一直到依传递依赖到D2.0。同时A还依赖了E到一直到D1.0。
A要经过B和C才依赖到D 2.0,同时A经过E就依赖到D 1.0。这样就说明A到达D 1.0的距离比D 2.0的近。因此在选择D的版本时也就选择了D 1.0。
2 楼 jin52yang 2011-03-23  
楼主你好,maven会替你找一个近的。哪个近?
这个最近的是什么意思?可以详细解释一下吗?
1 楼 sundytu 2011-02-25  
不错的文章!

相关推荐

    maven-dependency-plugin-2.8.jar

    maven-dependency-plugin-2.8.jar

    maven-dependency-plugin-2.8.zip

    Maven依赖插件(maven-dependency-plugin)是Maven生态系统中的一个重要组件,它的主要职责是帮助开发者管理项目依赖。通过此插件,我们可以执行如解析、分析、复制、打包和解压依赖等操作。在版本2.8中,它提供了...

    maven-dependency-versions-check-plugin-2.0.2-sources.jar

    maven-dependency-versions-check-plugin-2.0.2-sources.jar

    maven-dependency-tree-1.2.jar

    maven-dependency-tree-1.2.jar

    maven-dependency-tree-parser-1.0.6.jar

    maven-dependency-tree-parser-1.0.6.jar,用于mvn depenency:tree的记录解析

    maven-dependency-plugin-2.1.jar

    maven-dependency-plugin-2.1.jar

    maven-dependency-analyzer-0.6.jar

    maven-dependency-analyzer-0.6.jar

    maven jar包

    maven-dependency-plugin-2.1.jar maven-dependency-tree-1.0.jar maven-deploy-plugin-2.7.jar maven-deploy-plugin-2.8.1.jar maven-eclipse-plugin-2.9.jar maven-embedder-3.2.1-sources.jar maven-filtering-...

    apache-maven-3.9.6-bin

    例如,maven-compiler-plugin用于编译Java源码,maven-surefire-plugin用于执行单元测试,maven-jar-plugin则负责创建JAR文件。 在实际开发中,Maven的`settings.xml`文件通常放在用户的主目录下的`.m2`目录下,它...

    maven资源 apache-maven-3.3.9-bin.zip

    每个阶段都可以通过特定的插件来执行,例如,`maven-compiler-plugin`用于编译源代码,`maven-surefire-plugin`负责运行单元测试。Maven通过使用Project Object Model (POM)文件来描述项目信息,包括依赖、构建配置...

    apache-maven-3.8.4-bin.zip maven下载鬼慢

    Maven还支持插件机制,允许扩展其功能,例如,你可以使用maven-javadoc-plugin生成API文档,maven-surefire-plugin执行单元测试,或者maven-site-plugin生成项目网站。在pom.xml中定义插件及其配置,即可实现这些...

    apache-maven-3.5.4-bin.tar.gz

    Apache Maven 是一个强大的Java项目管理工具,它基于项目对象模型(Project Object Model,POM)的概念,能够自动化构建、依赖管理和项目信息管理。Maven 3.5.4是Maven的一个稳定版本,包含了多项改进和修复,为...

    maven-dependency-versions-check-plugin-1.0.0.jar

    maven-dependency-versions-check-plugin-1.0.0.jar

    maven版本:apache-maven-3.5.4-bin

    总结起来,"apache-maven-3.5.4-bin"压缩包包含的是一个完整的Maven 3.5.4发行版,它提供了一整套工具和框架,帮助Java开发者实现项目构建、依赖管理和版本控制。通过理解和掌握Maven,开发者可以提高工作效率,降低...

    apache-maven-3.3.9-bin.zip

    总的来说,Apache Maven通过提供一套标准化的构建流程和依赖管理机制,极大地提高了Java开发的效率和项目的可维护性。与Spring框架的结合,使得开发复杂的企业级应用变得更加便捷。通过`apache-maven-3.3.9-bin.zip`...

    maven-dependency-analyzer-1.1.jar

    maven-dependency-analyzer-1.1.jar

    maven-resources-plugin-2.4.1.jar

    maven-resources-plugin-2.4.1.jar

    apache-maven-3.6.2-bin.tar.gz

    总之,`apache-maven-3.6.2-bin.tar.gz`提供了Java项目管理和构建的强大工具,通过解压、配置环境变量以及编写和管理POM,开发者能够高效地处理复杂的项目依赖和构建流程。Maven 3.6.2版本修复了一些已知问题,提高...

    apache-maven-3.5.3-bin.zip apache-maven-3.6.0-bin.tar.gz win linux合集

    本合集包含了两个不同版本的Maven安装包,分别是`apache-maven-3.5.3-bin.zip`和`apache-maven-3.6.0-bin.tar.gz`。3.5.3是Maven的一个稳定版本,而3.6.0则带来了更多的改进和新特性。这两个版本都适用于Windows和...

    apache-maven-3.6.1-bin

    "apache-maven-3.6.1-bin"是Apache Maven 3.6.1版本的二进制发行包,它包含了运行Maven所需的所有文件。 在Maven 3.6.1中,主要知识点包括: 1. **项目对象模型(POM)**:POM是一个XML文件,它定义了项目的基本...

Global site tag (gtag.js) - Google Analytics