`

maven的scope属性

 
阅读更多

在maven多模块项目中,为了保持模块间依赖的统一,常规做法是在parent model中,使用dependencyManagement预定义所有模块需要用到的dependency(依赖)

复制代码
<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中预定义的依赖

复制代码
<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
    </dependencies>
复制代码

好处:

1、依赖统一管理(parent中定义,需要变动dependency版本,只要修改一处即可);

2、代码简洁(子model只需要指定groupId、artifactId即可)

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

 

但是,问题也出现了:

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

parent模块中,dependencyManagement中预定义太多的依赖,造成pom文件过长,而且很乱;

如何让这些依赖可以分类并清晰的管理?

 

问题解决:import scope依赖

如何使用:

1、maven2.9以上版本

2、将dependency分类,每一类建立单独的pom文件

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

3、注意: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文件如下:

好处分析:

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

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

3、父模块的pom就会非常干净,容易维护

分享到:
评论

相关推荐

    Maven权威指南 很精典的学习教程,比ANT更好用

    Including and Excluding Dependencies by Scope 12.5.4.4. Fine Tuning: Dependency Includes and Excludes 12.5.4.5. Transitive Dependencies, Project Attachments, and Project Artifacts 12.5.4.6. ...

    maven3+struts2+spring+ibatis

    不会新建action对象,每次调用的时候会使用原来的action,所以该类的所有字段会保留,这样异步访问的时候会出问题,所以需要将scope参数设置为prototype(多例),即在相应的action上添加属性:scope="prototype",...

    基于MyEclipse搭建maven+springmvc整合图文教程(含源码0

    当添加进入一个jar包后,有一些属性需要设置,最重要的就是scope,它有以下几种取值: 1. compile,缺省值,适用于所有阶段,会随着项目一起发布。 2. provided,类似compile,期望JDK、容器或使用者会提供这个...

    Spring IOC Bean标签属性介绍(教学视频+源代码)

    1.0 新建一个Maven工程 1.1 pom.xml 1.2 实体类JavaBean 1.2.1 User类 1.3 当Scope="singleton"时 1.4 当 Scope="singleton" 且 lazy-init="true" 时 1.5 当scope="prototype"时 1.6 当scope="prototype" 且 lazy-...

    maven3.0+struts+spring+hibernate

    不会新建action对象,每次调用的时候会使用原来的action,所以该类的所有字段会保留,这样异步访问的时候会出问题,所以需要将scope参数设置为prototype(多例),即在相应的action上添加属性:scope="prototype",...

    lemminx专家:lemminx专家

    特征除了在编辑pom文件时LemMinX提供的基于XSD的帮助之外,此扩展还添加了: 模型错误报告是诊断信息dependency/scope完成和悬停文档(测试,提供,运行时,...) plugins/execution/phase完成和悬停文档(流程资源...

    t淘淘商城项目 商城项目 视频和源码教程 详细

    后台管理系统:管理商品、订单、类目、商品规格属性、用户管理以及内容发布等功能。 前台系统:用户可以在前台系统中进行注册、登录、浏览商品、首页、下单等操作。 会员系统:用户可以在该系统中查询已下的订单、...

    springboot学习思维笔记.xmind

    Bean的Scope Singleton Prototype Request Session GlobalSession SpringEL和资源调用 注入普通字符 注入操作系统属性 注入表达式云算结果 注入其他Bean的属性 注入文件内容 ...

    百度地图开发java源码-swagger2-spring-boot-starter:swagger2-springboot自动化配置框架

    该框架基于swagger2-2.9.2与SpringBoot-2.0.1版本进行搭建,兼容SpringBoot2.x以上版本,不兼容1.x版本,maven依赖如下: &lt;groupId&gt;io.github.wilson-he &lt;artifactId&gt;swagger2-spring-boot-starter &lt;version&gt;...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part2

    2.1 Bean 的Scope 30 2.1.1 点睛 30 2.1.2 示例 31 2.2 Spring EL 和资源调用. 33 2.2.1 点睛 33 2.2.2 示例 33 2.3 Bean 的初始化和销毁 37 2.3.1 点睛 37 2.3.2 演示 38 2.4 Profile 40 2.4.1 点睛 40 2.4.2 演示 ...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part3

    2.1 Bean 的Scope 30 2.1.1 点睛 30 2.1.2 示例 31 2.2 Spring EL 和资源调用. 33 2.2.1 点睛 33 2.2.2 示例 33 2.3 Bean 的初始化和销毁 37 2.3.1 点睛 37 2.3.2 演示 38 2.4 Profile 40 2.4.1 点睛 40 2.4.2 演示 ...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part1

    2.1 Bean 的Scope 30 2.1.1 点睛 30 2.1.2 示例 31 2.2 Spring EL 和资源调用. 33 2.2.1 点睛 33 2.2.2 示例 33 2.3 Bean 的初始化和销毁 37 2.3.1 点睛 37 2.3.2 演示 38 2.4 Profile 40 2.4.1 点睛 40 2.4.2 演示 ...

    JdbcTemplateTool.zip

    自动根据数据库的列将下划线转为驼峰命名规则映射类的属性.@Test public void testList(){  JdbcTemplateTool jtt = super.applicationContext.getBean("jdbcTemplateTool",JdbcTemplateTool.class);  List...

    dockerunit-consul:基于dockerunit consul的服务发现提供程序库

    该模块允许您配置发现阶段以测试服务。 服务发现是dockerunit启动和测试成功执行所必需的。 用法(将dockerunit.consul.version属性设置为您要使用的版本): &lt; dependency&gt; ...&lt; scope&gt;test&lt;/ scope&gt;&lt;/ dependency

Global site tag (gtag.js) - Google Analytics