一般一个父pom项目下面常常有好几个子pom项目模块,而且几个子模块依赖的很多jar包,比如groupId/artifactid/version都是相同的,这样有三个弊端:
- 造成jar包重复依赖
- 造成版本号重复依赖
- 升级某个版本号时,要修改好几个子模块
一、在父模块中定义全部dependencies
在父模块中配置dependencies,那样所有子模块都自动继承。
例如在父pom文件中定义好我们需要的全部jar:
<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>
这样子模块只要继承父模块就能直接使用这些jar包,不仅达到了依赖一致的目的,还省掉了大段代码。
然而:这么做是有些不妥的地方,例如某个子模块,比如A不需要父模块log4j的依赖,但也直接继承了,造成了jar包臃肿,多余依赖。
二、在父模块中定义全部dependencyManagement
我们需要一种在父模块中定义好全部的jar包依赖,而子模块需要哪一种指定哪一种,这样既做到了集中式配置,又做到了子模块需要什么配置什么的灵活性。
而dependencyManagement就可以做到。针对这个问题我们可以使用继承机制以及dependencyManagement元素就能解决这个问题。
dependencyManagement只会影响现有依赖的配置,但不会引入依赖。
例如我们可以在父模块中配置如下:
<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>
不要的模块,就不需要引入,而dependencyManagement完美的做到了这点。
现在只需要groupId和artifactId,其它元素如version和scope都能通过继承父POM的dependencyManagement得到,如果有依赖配置了exclusions,那节省的代码就更加可观。
但重点不在这,重点在于现在能够保证所有模块使用的JUnit和Log4j依赖配置是一致的。而且子模块仍然可以按需引入依赖, 如果我不配置log4j
dependency,父模块中dependencyManagement下的log4j依赖不会对子模块产生任何影响。
此时为了应对父模块中引入了大量的jar包依赖造成父模块臃肿,我们需要一种可以把dependencyManagement放到外面去分开管理,这样很清晰很多,才能更好的管理更多的jar。
而import scope依赖能解决这个问题。
我们可以把dependencyManagement放到单独的专门用来管理依赖的POM中,然后在需要使用依赖的模块中通过import scope依赖,就可以引入dependencyManagement。
1、我们可以写这样一个用于依赖管理的子模块POM:
<project> <modelVersion>4.0.0</modelVersion> <groupId>wang.conge.demo</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>
2、然后我们的父模块只需要通过非继承的方式来引入这段依赖管理配置:
<dependencyManagement> <dependencies> <dependency> <groupId>wang.conge.demo</groupId> <artifactid>sample-dependency-infrastructure</artifactId> <version>1.0-SNAPSHOT</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
3、最后我们的子模块需要哪个jar包就引入哪个jar包
<dependency> <groupId>junit</groupId> <artifactid>junit</artifactId> </dependency> <dependency> <groupId>log4j</groupId> <artifactid>log4j</artifactId> </dependency>
完美,有没有?
这样,父模块的POM就会非常简洁,由专门的子模块为pom的POM来管理依赖,也契合的面向对象设计中的单一职责原则。
此外,我们还能够创建多个这样的依赖管理POM,以更细化的方式管理依赖。这种做法与面向对象设计中使用组合而非继承也有点相似的味道。
事实上spring-boot非常的简洁已用,也是使用import的方式来管理那么多的jar包依赖的。
相关推荐
Apache Maven 是一个强大的项目管理和构建工具,主要用于Java应用程序的开发。它通过定义项目的构建过程、依赖关系和项目信息,使得开发人员能够以...在实际使用中,结合Maven的最佳实践,可以进一步优化项目构建流程。
提供最佳实践开发指南。 允许透明迁移到新功能。 在对Maven有所了解之后,让我们继续下一步,安装Apache Maven。 步骤1.下载Apache Maven 转到Apache Maven,然后从左侧栏中的“获取Maven”部分,单击“下载”...
3. **插件更新**:可能包含对内置插件的更新,以支持最新的技术和最佳实践。 4. **更好的用户体验**:可能改进了命令行接口,或者对日志输出进行了优化,使开发者更容易理解和调试构建过程。 为了使用"apache-maven...
10. **最佳实践**:Maven推动了Java社区的一套构建和项目组织的最佳实践,如约定优于配置的原则,使得新项目可以快速启动,遵循统一的标准。 总的来说,Apache Maven 3.5.0是Java开发中不可或缺的工具,它极大地...
Apache Maven 是一个强大的Java项目管理工具,它遵循项目对象模型(Project Object ...通过理解和掌握Maven的工作原理以及如何配置和使用它,可以帮助开发者更好地管理他们的项目,并保持与社区最新的最佳实践同步。
6. **最佳实践**: - 遵循Maven的标准目录结构,如`src/main/java`放置源代码,`src/test/java`放置测试代码。 - 使用`<dependencyManagement>`元素在父POM中管理所有子项目的依赖版本。 - 定期清理本地仓库,...
**Maven的最佳实践:** 1. **约定优于配置**:Maven遵循一套标准目录结构,如`src/main/java`存放源代码,`src/test/java`放测试代码。 2. **依赖管理**:避免硬编码版本号,尽可能利用传递性依赖,保持POM简洁。 3....
Apache Maven 是一个强大的项目管理工具,它主要用于Java项目的构建、依赖管理和项目信息管理。...在实际开发中,结合Maven的最佳实践,如合理的依赖管理和使用插件,能够使项目更加稳定和易于维护。
源码阅读有助于自定义功能或调试,同时也能帮助开发者遵循最佳实践,提升代码质量。这个库通常包括以下几个核心组件: 1. **XML解析器**:提供了解析XML文档的能力,支持DOM(Document Object Model)和SAX(Simple...
**最佳实践:** 1. **保持POM简洁**:避免在POM中直接指定具体版本,尽可能使用父POM或依赖管理来管理版本。 2. **合理使用模块化**:大型项目可以使用多模块结构,每个模块负责一部分功能。 3. **版本管理**:遵循...
为了充分利用Maven,开发者应该遵循一些最佳实践,如保持POM的简洁明了,合理组织模块结构,以及定期更新依赖到最新稳定版本。 总结,Apache Maven 2.2.0是Java开发中的重要工具,它的功能强大,易于使用,大大简化...
深入研究"Maven-parent-25-source-release.zip"源码,开发者不仅能理解Maven的内部工作机制,还能学习到最佳实践,提高项目管理水平。通过阅读和分析源码,开发者可以更有效地定制和扩展Maven,以适应不断变化的项目...
**最佳实践:** 1. 保持POM文件整洁,避免引入不必要的依赖。 2. 使用Maven Profiles适应不同的构建环境。 3. 定期更新Maven,以获取最新的特性、修复和安全更新。 总的来说,Apache Maven 3.6.3是一个强大且广泛...
2. **同步Maven依赖**:当在pom.xml中添加或更新依赖时,插件会自动将这些依赖同步到Eclipse的类路径中。 3. **支持Maven生命周期**:在Eclipse中可以直接运行Maven的生命周期命令,如编译(compile)、测试(test...
这样的定制版可能包括对国内镜像站点的支持,提高依赖下载速度,或者集成了阿里巴巴内部的一些插件和最佳实践。 使用Maven,开发者可以定义项目依赖、构建过程和部署策略,通过统一的构建生命周期和插件机制,极大...
Apache Maven 是一个强大的项目管理和构建工具,主要用于Java项目。它基于项目对象模型(Project Object Model,POM)的概念,能够管理项目的构建、报告和文档。...同时,这也是学习软件工程和项目管理的最佳实践之一。
此外,可能还会涉及Maven的最佳实践,如设置多模块项目、理解和使用Maven的 profiles,以及如何优化Maven的构建性能。总之,这份文档应该能为初学者提供全面的Maven知识,帮助他们更好地集成Maven到自己的开发流程中...
总的来说,通过分析"apache-maven-3.3.9-src.tar.gz"中的源代码,开发者不仅可以深入了解Maven的工作机制,还可以学习到软件构建的最佳实践,如依赖管理、自动化构建流程等,这对于提升Java项目的开发效率和质量...
- **版本控制**:archetype 可以随着项目需求的变化而更新,新版本的 archetype 会包含最新的最佳实践和依赖。 ### Maven Archetype 的配置文件 每个 archetype 都有一个配置文件,通常是 `archetype-metadata.xml...