在 pom 中指明 dependency management 元素的方式maven 结合项目继承来管理依赖。
在多模块应用中,可能多个子项目会有共同的依赖。此时为了正确运行,必须让所有的子项目使用依赖项的同一版本。必须确保应用的各个项目的依赖项和版本一致,才能保证测试的和发布的是相同的成果。因此,应在顶层的 pom 中定义共同的依赖关系。
比如有的依赖的<scope>是写在子项目中的 <dependencies> 下的<dependency> 标签中,
而有的依赖的<scope>是写在父项目中的<dependencyManagement> 中 。
我知道前一种写法是对的,而后一种写法却不知道对不对了,从网上查了下,没有找到非常确切的答案,于是自己验证了一把。
把验证过程给大家说下,大家也可以自己练手。
首先新建三个项目,Parent作为父项目、projectA、projectB作为子项目。
在父项目Parent中依赖项如下:
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.8.1</version> <scope>test</scope> </dependency> </dependencies>
在子项目projectA、projectB中没有写任何依赖,在projectA 下运行命令 mvn help:effective-pom,会发现A下面有 junit 4.8.1的依赖。
如果我把 父项目Parent 中的依赖修改如下:
<dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.8.1</version> <scope>test</scope> </dependency> </dependencies> </dependencyManagement>
子项目ProjectA、projectB下面还是没有任何依赖项,在projectA 下运行命令 mvn help:effective-pom,会发现A下面 没有 junit 4.8.1的依赖。
如果我在projectA 下添加junit的依赖:
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> </dependencies>
再在projectA 下运行命令 mvn help:effective-pom,会发现A下面有了 junit 4.8.1的依赖,并且scope为 test。
那么经过验证,scope写在子项目中的<dependencies> 下的<dependency>中,或是写在父项目中的<dependencyManagement>中,都是可以的。
但有一点需要注意,dependencies 和 dependencyManagement 的区别在于:
dependencies中,即使在子项目中不写该依赖项,那么子项目仍然会从父项目中继承该依赖项。
dependencyManagement 中,如果在子项目中不写该依赖项,那么子项目中是不会从父项目继承该依赖项的;只有在子项目中写了该依赖项,才会从父项目中继承该项,并且version 和 scope 都读取自 父pom,这样就可以保证所有版本一致了。
注意:一个是项目依赖,一个是多模块maven项目时候的依赖管理控制的。
--------------------------------
可以在父模块中配置如下:
<dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactid>junit</artifactId> <version>4.8.2</version> <scope>test</scope> </dependency> <dependency> <groupId>log4j</groupId> <artifactid>log4j</artifactId> <version>1.2.16</version> </dependency> </dependencies> </dependencyManagement>
这段配置不会给任何子模块引入依赖,但如果某个子模块需要使用JUnit和Log4j的时候,我们就可以简化依赖配置成这样:
<dependency> <groupId>junit</groupId> <artifactid>junit</artifactId> </dependency> <dependency> <groupId>log4j</groupId> <artifactid>log4j</artifactId> </dependency>
现在只需要groupId和artifactId,其它元素如version和scope都能通过继承父POM的dependencyManagement得到。
如果有依赖配置了exclusions,那节省的代码就更加可观。但重点不在这,重点在于现在能够保证所有模块使用的JUnit和Log4j依赖配置是一致的。而且子模块仍然可以按需引入依赖,如果我不配置dependency,父模块中dependencyManagement下的spring-aop依赖不会对我产生任何影响。
也许你已经意识到了,在多模块Maven项目中,dependencyManagement几乎是必不可少的,因为只有它是才能够有效地帮我们维护依赖一致性。
使用dependencyManagement还有另外一种方式,那就是我们可以不从父模块继承,而是使用特殊的import scope依赖。
我们知道Maven的继承和Java的继承一样,是无法实现多重继承的,如果10个、20个甚至更多模块继承自同一个模块,那么按照我们之前的做法,这个父模块的dependencyManagement会包含大量的依赖。如果你想把这些依赖分类以更清晰的管理,那就不可能了,import scope依赖能解决这个问题。你可以把dependencyManagement放到单独的专门用来管理依赖的POM中,然后在需要使用依赖的模块中通过import scope依赖,就可以引入dependencyManagement。例如可以写这样一个用于依赖管理的POM:
<project> <modelVersion>4.0.0</modelVersion> <groupId>com.juvenxu.sample</groupId> <artifactId>sample-dependency-infrastructure</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactid>junit</artifactId> <version>4.8.2</version> <scope>test</scope> </dependency> <dependency> <groupId>log4j</groupId> <artifactid>log4j</artifactId> <version>1.2.16</version> </dependency> </dependencies> </dependencyManagement> </project>
然后我就可以通过非继承的方式来引入这段依赖管理配置:
<dependencyManagement> <dependencies> <dependency> <groupId>com.juvenxu.sample</groupId> <artifactid>sample-dependency-infrastructure</artifactId> <version>1.0-SNAPSHOT</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactid>junit</artifactId> </dependency> <dependency> <groupId>log4j</groupId> <artifactid>log4j</artifactId> </dependency> </dependencies>
这样,父模块的POM就会非常干净,由专门的packaging为pom的POM来管理依赖,也契合的面向对象设计中的单一职责原则。此外,我们还能够创建多个这样的依赖管理POM,以更细化的方式管理依赖。这种做法与面向对象设计中使用组合而非继承也有点相似的味道。
相关推荐
三、dependencyManagement与dependencies的区别 1. `dependencyManagement`只声明依赖和版本,不引入依赖。子模块需要显式声明使用哪些依赖。 2. 如果子模块没有在`dependencies`中声明依赖,它将不会从父POM的`...
8. **测试与调试**:ClrPhTester.exe可能是一个用于测试Dependencies中与.NET相关的功能的工具,或者是一个针对ClrPhlib.dll的测试套件,帮助开发者验证其功能和性能。 9. **持续更新与社区支持**:由于是在GitHub...
《Dependencies_x64_1.11.zip:深入解析win10系统下的DLL与EXE依赖分析神器》 在Windows 10操作系统中,程序的正常运行离不开动态链接库(DLL)的支持。这些库文件提供了应用程序所需的函数和资源,使得多个程序...
Spring dependencies开发架包,Spring dependencies包, spring3.0.2.dependencies.jar全部包,Spring dependencies包, spring3.0.2.dependencies.jar全部包
Depends有32位(x86)和64位(x64)两个版本,确保与目标系统匹配,以便正确解析依赖关系。在压缩包中,"depends22_x86"和"depends22_x64"很可能是这两个版本的Depends工具。 接下来,Dependencies是另一个现代的...
1. **安装与启动**:下载并安装Dependencies-win10压缩包,运行Dependencies可执行文件。 2. **加载DLL**:通过拖放或者点击文件图标,将需要分析的DLL导入到软件中。 3. **查看依赖**:Dependencies会自动列出所有...
Dependencies是一款优秀免费的解析软件。 开发人员经常接触到库文件DLL,想要知道DLL中有哪些函数功能,往往需要依赖h头文件,或者通过VS自带的dumpbin工具。 而有了这款软件,将可以更加直观地了解DLL的信息,包括...
压缩包中的文件包含了一些可能与"Dependencies-for-win10"相关的组件和资料: 1. ClrPhlib.dll:这可能是一个用于.NET框架的库文件,可能包含了某些特定功能的实现。 2. Dragablz.dll:这个名字暗示这可能是一个拖放...
以前的Dependencies在win10已经不能满足需求,每次打开都特别慢,在github上找了下类型的工具,终于搜到源码,编译到了最终的成果物,注意在win10体验最佳,需要4.6.1的环境
编译OBS时,VS2017会查找这些依赖库,并将它们与源代码链接在一起,形成一个完整的可执行文件。如果缺少任何一项,编译过程就可能失败,或者在运行时出现错误。因此,"dependencies2017.zip"的提供,极大地简化了OBS...
标题中的“针对缺少dll的分析工具 Dependencies.zip”指的是一个压缩包,其中包含了一款用于解决应用程序因缺失动态链接库(DLL)文件而无法正常运行的问题的工具。在Windows操作系统中,DLL文件是共享代码库,许多...
Dependencies_x64是对Windows SDK附带的遗留软件Dependency Walker的重写,但其开发在2006年左右停止。Dependencies_x64可以帮助Windows开发人员排除他们的dll加载依赖性问题。
in nature, so managing dependencies is something the developer needs to take into account. In an OSGi framework, services are deployed using bundles and these bundles feature two types of dependencies...
标签“obs dependencies2013”进一步明确了这个压缩包与OBS项目和2013年版本的关联。这意味着其中的依赖库是针对特定版本的OBS和VS2013的,可能包括如DirectX、FFmpeg、libavcodec等常见的多媒体处理库,以及可能的...
Dependencies和depends walker用法相同,可以检测出当前dll文件的依赖关系,Dependencies并且更为明显的显示出对应依赖库的绝对路径,查询问题更为方便快捷。 问题案例: 无法加载 DLL“XXXTest.dll”: 找不到指定的...
[最新] Dependencies 工具(.net版本的), 比MFC的速度快很多
3. **界面友好**:与早期的depends相比,Dependencies可能提供了更直观、用户友好的界面,使得查看和理解依赖关系变得更加容易。这有助于减少调试时间,提高开发效率。 4. **高级特性**:除了基本的依赖分析,可能...
《Ant依赖库jar.zip详解与应用》 在Java开发领域,构建工具扮演着至关重要的角色,其中Apache Ant是广泛使用的工具之一。Ant以其灵活性和可扩展性,深受开发者喜爱。本文将详细介绍“ant-dependencies.jar.zip”这...
为了能正常运行,OBS 需要与一系列外部库协同工作,这些库提供了音频处理、视频编码、网络传输等功能。在本压缩包中,包含了以下几个关键的第三方库: 1. **FFmpeg**: FFmpeg 是一个强大的多媒体框架,它支持多种...