在 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的`...
《Dependencies_x64_1.11.zip:深入解析win10系统下的DLL与EXE依赖分析神器》 在Windows 10操作系统中,程序的正常运行离不开动态链接库(DLL)的支持。这些库文件提供了应用程序所需的函数和资源,使得多个程序...
8. **测试与调试**:ClrPhTester.exe可能是一个用于测试Dependencies中与.NET相关的功能的工具,或者是一个针对ClrPhlib.dll的测试套件,帮助开发者验证其功能和性能。 9. **持续更新与社区支持**:由于是在GitHub...
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:这个名字暗示这可能是一个拖放...
编译OBS时,VS2017会查找这些依赖库,并将它们与源代码链接在一起,形成一个完整的可执行文件。如果缺少任何一项,编译过程就可能失败,或者在运行时出现错误。因此,"dependencies2017.zip"的提供,极大地简化了OBS...
以前的Dependencies在win10已经不能满足需求,每次打开都特别慢,在github上找了下类型的工具,终于搜到源码,编译到了最终的成果物,注意在win10体验最佳,需要4.6.1的环境
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...
标题中的“针对缺少dll的分析工具 Dependencies.zip”指的是一个压缩包,其中包含了一款用于解决应用程序因缺失动态链接库(DLL)文件而无法正常运行的问题的工具。在Windows操作系统中,DLL文件是共享代码库,许多...
标签“obs dependencies2013”进一步明确了这个压缩包与OBS项目和2013年版本的关联。这意味着其中的依赖库是针对特定版本的OBS和VS2013的,可能包括如DirectX、FFmpeg、libavcodec等常见的多媒体处理库,以及可能的...
Dependencies_x64是对Windows SDK附带的遗留软件Dependency Walker的重写,但其开发在2006年左右停止。Dependencies_x64可以帮助Windows开发人员排除他们的dll加载依赖性问题。
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 是一个强大的多媒体框架,它支持多种...