maven <dependency>中的<scope>:import、test、system 作者:马育民 • 2021-10-16 09:30 • 阅读:10112 # import maven 和Java一样都是 **单继承** 机制,在maven的pom文件中只能有一个`<parent>`标签,继承一个父工程,然后父工程通过`dependencyManagement`管理依赖,子工程选择性继承 ### 问题1 **提出问题:** 在 springboot 应用,要求继承父工程`spring-boot-starter-parent`,如下: ``` <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.3.RELEASE</version> </parent> ``` 但是如果想 **继承其他父工程**,或者 **不想继承父工程**,就无法实现了 **解决问题:** 通过`<scope>import</scope>`导入工程 ``` <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.2.2.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> ``` ### 提出问题2 **提出问题:** 在聚合工程中,一般父工程在`dependencyManagement`管理大量依赖,繁杂混乱,不方便管理 **解决问题:** 为了更清晰的管理,将这些依赖分类写在不同的工程中,用到哪个功能时,就通过`<scope>import</scope>`导入该工程 ### 总结 好处: 1、单一职责原则,根据依赖的分类,细化每一个单一职责的pom文件 2、解决单继承问题,通过import pom文件达到依赖的目的(典型的非继承模式),从而不用从父类中引用依赖 3、父模块的pom就会非常干净,容易维护 # test (测试范围) `test` 范围依赖 **编译** 和 **运行时** 都不需要,只有在 **测试编译** 和 **测试运行** 阶段可用。 ``` <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> ``` # system (系统范围) 不从maven仓库获取该jar,而是通过 `systemPath` 指定该jar的路径 **注意:**该范围是不推荐使用的(你应该一直尽量去从公共或定制的 Maven 仓库中引用依赖)。 原文出处:/show_1IX23D0t2B7z.html