maven中import scope依赖方式解决单继承问题的理解

在maven多模块项目中,为了保持模块间依赖的统一,常规作法是在parent model中,使用dependencyManagement预约义全部模块须要用到的dependency(依赖)java

<dependencyManagement>
        <dependencies>
            <!-- Feign是一种声明式、模板化的HTTP客户端:以HTTP接口的形式暴露自身服务 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-feign</artifactId>
                <version>${spring-cloud-starter-feign.version}</version>
            </dependency>
            <!-- 支持面向方面的编程即AOP,包括spring-aop和AspectJ -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-aop</artifactId>
                <version>${spring.boot.version}</version>
            </dependency>
            <dependency>
                <groupId>org.aspectj</groupId>
                <artifactId>aspectjrt</artifactId>
                <version>${aspectjrt.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

而后,子model根据实际须要引入parent中预约义的依赖spring

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
    </dependencies>

好处:编程

一、依赖统一管理(parent中定义,须要变更dependency版本,只要修改一处便可);maven

二、代码简洁(子model只须要指定groupId、artifactId便可)spring-boot

三、dependencyManagement只会影响现有依赖的配置,但不会引入依赖,即子model不会继承parent中dependencyManagement全部预约义的depandency,只引入须要的依赖便可,简单说就是“按需引入依赖”或者“按需继承”;所以,在parent中严禁直接使用depandencys预约义依赖,坏处是子model会自动继承depandencys中全部预约义依赖;spa

 

可是,问题也出现了:.net

单继承:maven的继承跟java同样,单继承,也就是说子model中只能出现一个parent标签;code

parent模块中,dependencyManagement中预约义太多的依赖,形成pom文件过长,并且很乱;blog

如何让这些依赖能够分类并清晰的管理?继承

 

问题解决:import scope依赖

如何使用:

一、maven2.9以上版本

二、将dependency分类,每一类创建单独的pom文件

三、在须要使用到这些依赖的子model中,使用dependencyManagement管理依赖,并import scope依赖

三、注意:scope=import只能用在dependencyManagement里面,且仅用于type=pom的dependency

示例:

 

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <!-- 重要:版本号要和父模块中预约义的spring boot版本号保持一致 -->
                <version>${spring.boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

 maven编译后,下载了pom文件,在maven的本地仓库下查看pom文件以下:

好处分析:

一、单一职责原则,根据依赖的分类,细化每个单一职责的pom文件

二、解决单继承问题,经过import pom文件达到依赖的目的(典型的非继承模式),从而不用从父类中引用依赖

三、父模块的pom就会很是干净,容易维护

 

参考文章:

Maven实战(三)——多模块项目的POM重构

使用import scope解决maven继承(单)问题

Maven中的import scope

maven之非继承引用dependency

相关文章
相关标签/搜索