Maven是Java开发最流行的依赖管理工具。
在项目中,我们经常会引用别人的Maven包,偶尔,我们也会开发Maven包,希望别人引用,那么问题来了,如何让别人找到你的Maven包呢,有这么几个方法:
- 直接拷贝Jar包
- 使用JCenter等第三方Maven仓库
- 自己搭建Maven私有仓库
上述方案1显然是用来搞笑的,不仅效率低下,也不利于运维。
使用第三方仓库省却了仓库的搭建过程,但要忍受网路不稳定、jar包公开化等弊病。
搭建私有仓库是一个很好的选择,我在《从0到1实战微服务架构》的Maven私有仓库一节中介绍了使用Nexus搭建私有仓库的方案。
对于规模中等的公司,搭建私有仓库是一个好的选择。但对于小的团队就不见得如此了:开发人员一只手数的过来,依赖的包也不过十几个,维护一套Nexus实在是有些浪费。
今天我们介绍一种新的方案:使用git仓库作为maven仓库,当然是在gradle中,maven的话可以照葫芦画瓢,这里不再赘述。
先说说整体思路:
- 创建一个全新的git repo
- clone到本地pathA
- 发布pom包到本地pathA
- 本地提交到远程git
- 引用远程git repo的http页面作为maven源
看到这你可能觉得有点绕,为什么要经过本地这一步呢,直接提交到远程不好么?
事实上我也考虑过这一方案,使用过各种插件,不仅存在各种奇怪的版本兼容问题,各种配置也异常复杂,难以维护。
相反:Gradle的maven插件原生支持发布到本地路径,配置非常简单,再结合几行简单的git命令,看似很长的步骤,却非常顺畅。
好了,我们一起来看实战吧!
1 创建全新的git repo 并克隆到本地
你可以使用自己喜欢的托管服务,甚至自己的git服务器,我这里使用的是gitee。
- 仓库名称不妨叫maven_repository
- 克隆到本地假设是/home/coder4/maven_repository/
2 新建一个gradle项目
不再赘述,你应该已经有一个了。
在主文件中添加引用
apply from: './maven-private.gradle'
3 新建私有镜像gradle配置文件maven-private.gradle
// Maven Private Repo repositories { maven { url 'https://gitee.com/coder4/maven_repository/raw/master/' } } // Maven Private Deploy uploadArchives { repositories { mavenDeployer { repository(url: "file:///home/coder4/maven_repository/") } } }
- 上面的url是git仓库可访问的http路径,要说明的是,如果你是私有镜像的话,需要再多绕一步,文末我会讲到,不要着急。
- 下面file:///开头的是maven本地clone的路径。
这些路径可能会变化,可以作为变量:
~/.gradle/gradle.properties
MAVEN_PRIVATE_URL = https://gitee.com/coder4/maven_repository/raw/master/ MAVEN_LOCAL_PATH = /home/coder4/maven_repository
// Maven Private Repo repositories { maven { url MAVEN_PRIVATE_URL } } // Maven Private Deploy uploadArchives { repositories { mavenDeployer { repository(url: "file://${MAVEN_LOCAL_PATH}" ) } } }
4 发布和上传
# 发布到本地 gradle uploadArchives # 提交到git仓库 cd pathA git add . && git commit -m "upload pom" && git push origin master
5 别的项目引用时候
直接写就可以
compile 'com.coder4.lmsia:trace:0.0.1'
6 私有仓库怎么办
前面也提到了,有时候你可能希望使用私有仓库,毕竟jar包都是可以反编译的:-)
- 此时就要多一个步骤了
- 本地提交后,依然上传到git仓库
- 新建一台Web服务器,只对内网有访问权限,定期(或者Hook)从git仓库更新到本地
- 然后在maven-private.gradle中更改url为这台web服务器,即可。
比起维护一套Nexus还是简单很多的~