您的位置:首页 > 其它

Maven Dependency Mechanism (Maven依赖机制)

2018-10-31 22:51 87 查看

Transitive

Transitive 的意思在很多翻译网站上是:

transitive
英[ˈtrænsətɪv] 美[ˈtrænsɪtɪv, -zɪ-]
adj. 过渡的; (指动词) 及物的; 转变的; <数><逻>可递的;
n. <语>及物动词;

[例句]The verbs were subdivided into transitive and intransitive categories.

 

在数学中,Transitive 表示传递性, 如

已知 a > b, b > c,

则可以得到 a > c, 这是传递性

 

Transitive Dependencies

Maven 中的依赖具有传递性

如果项目A 依赖于项目B,而项目B依赖于项目C,则项目A也依赖于项目C

使用符号“->"来表示项目间的依赖关系: A->B ,项目A依赖于项目B

 Transitive Dependencies 的几个关键点:

  1. Dependency Mediation, 依赖调解
  2. Scope, 作用域
  3. Exclude, 不包括
  4. Optional

例子:

<dependency>
            <groupId>com.yin</groupId>
            <artifactId>maven-project-1</artifactId>
            <version>0.0.1-SNAPSHOT</version>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <artifactId>com.xxxx</artifactId>
                    <groupId>xxxx-project</groupId>
                </exclusion>
            </exclusions>
            <optional>true</optional>
</dependency>

 

Dependency Mediation

路径长度相同,版本不同

A->B->E1.0 

A->C->E2.0

此时会选择E2.0, 因为它的版本更新。

 路径长度不同,选择路径长度更小的

A->B1.0,

A->C->B2.0

此时选择B1.0, 因为它的路径更短

 Scope

Compiler, 默认scope,编译时和运行时都需要

Test, 仅测试编译和测试时需要

Provider, 编译时需要,运行时不需要

Runtime, 与Provider相反,运行时需要,编译时不需要

 

Exclude

如果A->B->C, 而A并不想将C作为依赖,可以配置Excludesions

 

Optional

切断依赖的传递性

 

Dependency Manager

考虑项目A和项目B有多个相同的依赖,为了避免重复配置,可以:

创建一个新的项目C,将A/B相同的依赖写在C中,然后

B->C, A->C

或者使用Dependency Manager和<parent></parent>父项目。

父项目如下,配置了packing是POM,以及depedencyManager

<project>

     <groupId>..</>

     <artifactId>....

    <version>....

    <packing>POM</packing>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.apache.velocity</groupId>
                <artifactId>velocity</artifactId>
                <version>1.5</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

</project>

子项目如下:

<project>

    <parent>

         <groupId>

         <artifactId>

        <version>

    </parent>

    <dependencies>

           <depedency>

                 <groupId>org.apache.velocity</groupId>
                <artifactId>velocity</artifactId>   // 由于在父project中定义了该依赖的version是1.5,这里将不再需要声明version

                                                                 // 注意:父项目的Dependency Manager配置的依赖不会自动成为子项目的依赖

           </depedency>

    <dependencies>

</project>

如果项目A是项目B的父项目,而A中的Dependency Manager声明了依赖C使用verison1.0 ,但项目B有自己的Dependency Manager声明了依赖C使用version2.0,则项目B的配置会覆盖父项目的配置。

总结一下就是:子项目会继承父项目的<dependencies> 和 <dependencyManager> ,然后子项目可以覆盖里面的dependency

 

Import Dependency,依赖导入

在前面讲了父项目跟子项目,这是一种类似“单继承”的模式。

Maven还有类似“多继承”的设置,或者叫“一个项目可以导入多个公共library项目”。

首先library项目的写法与前面的父项目的写法一致。

之后,在引用此library的项目中需要配置:

<project>

    // 这里不再使用<parent>来导入别的项目

   <dependencyManager>

      <dependencies>
            <dependency>

                  <groupId>

                  <artifactId>

                  <version

                  <type>POM</type>

                 <scope>import</scope> // 这2个配置很重要。

                                                        // 注意:library中的依赖也不是自动成为当前项目的依赖。这点与配置父项目是一样的。

            </dependency>

       </de 4000 pendencies>

  </dependencyManager>

</project>

 

 

 

 

 

 

 

 

 

 

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