Martin的文章并没有涉及到依赖管理的内容,但在Java的世界中,依赖管理是开发人员不得不面对的问题。无论是外部的开源类库依赖,还是项目内部的模块间依赖,都需要有效地管理。可以说依赖管理是持续集成核心的内容之一。Maven通过其依赖管理机制和随处可用的中央仓库有效地解决了这个问题,用户只需要在POM中声明项目所需要的依赖,Maven就能在构建的时候自动从仓库解析依赖。
不过仅仅这样是不够的,我们知道,持续集成的最大好处在于降低风险,简单地来说就是尽早暴露问题,能让开发人员及早发现并修复,从而降低修复成本。可是,如果每个人都从中央仓库重复下载依赖,这是非常耗时的,集成的反馈周期肯定会延长。我已经无数次听到有人抱怨“Maven在下载整个Internet!”。构建要快!持续集成反馈要快!Maven你不能拖慢这个流程。
幸运的是开源世界有很好的解决方案,只要使用Maven仓库管理器软件如Nexus建立一个私有的Maven仓库,问题就能迎刃而解。原理很简单,这个位于局域网内的Maven仓库能够代理所有外部仓库,从而避免所有人从Internet重复下载依赖文件。这样Maven解析依赖的时候仅限于局域网,构建速度就大大地加快了。例如大家都需要使用junit-4.8.2.jar
,当第一个人向私有仓库请求的时候,私有仓库从中央库下载并缓存下来,假设耗时10s,之后其他人需要junit-4.8.2.jar
的时候,私有仓库直接使用缓存的文件,这个耗时可能就是1s。如果有100个开发人员使用该文件,那节省的时间就是 100 * 10 - ( 10 + 99 * 1 ) = 891s ,实际情况中依赖的数量可能会是成百上千,那节省的时间就变得非常的可观。
也许有人会说,我也完全可以将项目依赖加入到版本控制中,这一点甚至在《卓有成效的程序员》中都被明确提及,在该书第5章的"DRY版本控制"一节中,Neal Ford有这么一段话:“所有用来构建项目的东西都应该被放入版本控制,包括二进制文件(类库,框架,JAR文件,构建脚本等等)”。作者进一步解释了其目的,这么做能够保证项目不受外部因素影响(如依赖版本变化,甚至丢失),保证构建的稳定,作者也同时提及了一般版本控制工具处理二进制文件的性能问题。抛开这条结论性的实践,仔细考虑其目的,我们就能发现,私有Maven仓库同样能保证构建的稳定,而且能避免版本控制工具处理二进制文件而造成的潜在性能问题。所以,我斗胆说一句,Neal Ford所提的这条实践OUT了!
私有Maven的仓库的意义还不仅限于此,结合自动化部署和Maven的SNAPSHOT机制,它能大大促进项目集成的效率。
在模块化的开发环境中,大家各司其职,专注于自己所负责的模块,持续集成的规则是,在往版本控制提交代码前,需要先保证本地构建没有问题,那一般的做法就是更新所有模块的代码并构建。可是,真的需要构建那些其实你并不怎么关心的模块么?且不谈一旦构建他人代码时出错,你往往会不知所措,这种做法同时也增加了本地构建的时间。
Maven有SNAPSHOT版本的概念,其目的就是让你能够构建一个临时的版本,供团队他人使用,这样他们就不必在代码的层次关心自己的依赖。于是私有Maven仓库就充当了一个中介的作用,而持续集成服务器就多了一个职责,每次它成功构建一个模块,都应该将该模块的SNAPSHOT版本发布到Maven仓库中。现在,大家就不用去构建别人的代码了,Maven能自动帮你从私有仓库解析下载依赖的最新SNAPSHOT(使用mvn命令的-U参数强制更新)。注意,除了持续集成服务器外,任何其他人都不应该发布SNAPSHOT版本到Maven仓库,因为只有持续集成服务器的环境是可信任的,你能在本地成功执行mvn clean install并不代表持续集成服务器上该命令能成功,由于每个人的本地环境各有差异,因此集成的成功与否应当以持续集成服务器为准,而只有集成成功后,SNAPSHOT才可以被部署到私有仓库供他人使用。
鉴于上述的原因分析,我认为在基于Maven的持续集成环境中,再怎么强调私有Maven仓库的重要性都是不为过的。
分享到:
相关推荐
nexus 搭建 maven仓库nexus 搭建 maven仓库nexus 搭建 maven仓库nexus 搭建 maven仓库nexus 搭建 maven仓库
搭建Maven私有仓库 概述:本文档详细介绍了在Windows Server 2016环境下使用Nexus搭建Maven私有仓库的详细过程及常用配置,旨在帮助读者快速搭建私有仓库,提高开发效率和项目管理效率。 一、安装准备 在开始搭建...
在Linux环境下搭建自己的私有Maven仓库是许多开发者在企业级项目中常用的一种实践,这样可以方便地管理和分发自定义的jar依赖和maven插件。本篇将详细介绍如何在Linux系统上创建私有Maven仓库,并发布自定义的jar包...
maven的setting配置私有仓库 包含:阿里云的配置+本地私有的配置多个仓库
由于JxBrowser在maven仓库中可能不再可用,对于需要使用此库的开发者来说,直接下载jar包并将其部署到本地或私有Maven仓库是必要的步骤。 首先,我们需要理解Maven仓库的概念。Maven仓库是存储项目依赖的地方,分为...
maven仓库清理命令
### 超全面搭建Maven仓库 Maven是一款强大的项目管理工具,主要用于Java项目的构建、依赖管理和项目信息管理。本文将详细介绍如何搭建Maven环境、配置Maven仓库以及在Eclipse中集成Maven。 #### 一、下载安装Maven...
【Maven很Maven仓库】这个标题暗示了讨论的核心是关于Maven以及它与Maven仓库的关系。Maven是一个在Java开发中广泛使用的项目管理和综合工具,它通过一个声明式的配置来管理项目的构建、报告和文档。Maven仓库则是...
settings.xml,本地maven仓库配置,注意:D:\maven\repository为我本地的maven仓库路径,改成你的。 settings.xml,本地maven仓库配置,注意:D:\maven\repository为我本地的maven仓库路径,改成你的。 settings.xml...
CentOS7搭建私有MAVEN仓库-附件资源
在Linux环境下,构建一个私有的Maven仓库是解决企业内部依赖管理和版本控制的有效方式。本文将详细介绍如何在Linux系统上搭建私有Maven仓库,并发布自定义的jar依赖及maven插件,以帮助开发者更好地管理和分发项目...
Maven仓库是Java开发中不可或缺的一部分,它是一个中央存储库,包含了大量的开源项目构件(JAR文件),使得开发者能够方便地管理和下载所需的依赖。Maven通过使用一个统一的配置方式,简化了项目的构建、依赖管理和...
设置Maven仓库-Artifactory Maven 是 Java 开发者中流行的构建工具,可以帮助减少构建应用程序时所依赖的软件构件的副本。Maven 建议的方法是将所有软件构件存储于一个叫做 repository 的远程仓库中。设置内部 ...
Nexus是Sonatype公司开发的一款强大的Maven仓库管理器,它可以作为代理仓库,缓存远程仓库的依赖,同时也可以作为宿主仓库,存放团队内部的私有构件。Nexus提供了三种类型的仓库:代理仓库、宿主仓库和集团仓库,...
4. **发布到私有Maven仓库**:如果你有一个私有的Maven仓库(如Nexus或Artifactory),你可以使用`deploy:deploy-file`命令将其发布到那里。配置仓库URL、用户名和密码,然后执行类似如下命令: ``` mvn deploy:...
当你需要引入新的库或jar包到你的项目中时,Maven仓库搜索服务就显得尤为重要。本文将详细介绍如何利用Maven仓库搜索服务来查找并获取所需的依赖坐标。 Maven依赖的基本格式是groupId:artifactId:version,它由三...
Maven+Nexus2搭建本地、私有仓库 Maven 是一个流行的项目管理和构建工具,而 Nexus 则是一个功能强大且灵活的仓库管理器。通过搭建本地仓库和私有仓库,可以更好地管理项目依赖关系,提高开发效率和项目质量。本文...
一键清除maven仓库中下载失败的jar包的实现方法 在Maven项目中,下载失败的jar包是一个常见的问题,它们会占用磁盘空间,影响开发效率和心情。因此,清除这些下载失败的jar包变得非常重要。本文将详细介绍如何使用...