分类 标签 存档 程序员漫画 黑壳相关站点 订阅 搜索

使用 Github 搭建 Maven 私有远程仓库

154 浏览

本文由黑壳博客编写

本文来源使用 Github 搭建 Maven 私有远程仓库

本文借鉴此文两篇文章,进行了一些汇总和言语不清晰的地方进行修改

https://blog.csdn.net/hengyunabc/article/details/47308913

https://juejin.im/post/5cbb2a83f265da03775c4db4?utm_source=gold_browser_extension

壳叔搞笑时间

想法

为了避免重复造轮子,我们可以在项目中引入依赖,使用现有的成熟解决方案。
也许你不满足于 “借” 轮子,还想自己造轮子,这个时候你就可以把自己的代码放入公共的仓库,供大家使用。
但使用公共的依赖仓库很麻烦,幸好 github 为我们提供了一种简便的大家自己的公共依赖仓库的方式。

自从今年 Github 支持免费的个人私有仓库以后,github 越来越成为自己日常学习、写作和开发必不可少的工具了。
之前因为 github 的私有仓库收费,不得已使用了 gitee 和 bitbucket 等工具。事实证明,这个世界,只需要一个 Github。
下面就一步步带你搭建一下自己的 Maven 公共仓库。

简单来说,共有三步:

1.deploy 到本地目录

2. 把本地目录提交到 gtihub 上

3. 配置 github 地址为仓库地址

配置 local file maven 仓库 deploy 到本地

maven 可以通过 http, ftp, ssh 等 deploy 到远程服务器,也可以 deploy 到本地文件系统里。

pom 文件配置

例如把项目 deploy 到 / home/ykz200/code/maven-repo/repository / 目录下, 只需要在项目 pom.xml 添加这项即可

  <distributionManagement>
    <repository>
      <id>ykz200-maven-repo</id>
      <url>file:/home/kzyuan/code/maven-repo/repository/</url>
    </repository>
  </distributionManagement>

通过命令行则是:

在自己本地创建一个目录,来放自己 deploy 的文件,然后在自己的项目目录下执行如下 Maven 命令:

mvn deploy -DaltDeploymentRepository=bhusk-mvn-repo::default::file:/home/kzyuan/code/maven-repo/repository/

推荐使用命令行来 deploy,避免在项目里显式配置。

https://maven.apache.org/plugins/maven-deploy-plugin/

https://maven.apache.org/plugins/maven-deploy-plugin/deploy-file-mojo.html

把本地仓库提交到 github 上

上面把项目 deploy 到本地目录 home/ykz200/code/maven-repo/repository 里,下面把这个目录提交到 github 上。

在 Github 上新建一个项目,然后把 home/ykz200/code/maven-repo 下的文件都提交到 gtihub 上。

cd /home/kzyuan/code/maven-repo/
git init  
git add repository/*
git commit -m 'deploy xxx'
git remote add origin git@github.com:ykz200/maven-repo.git
git push origin master

最终效果可以参考我的个人仓库:
https://github.com/ykz200/maven-repo

github maven 仓库的使用

因为 github 使用了 raw.githubusercontent.com 这个域名用于 raw 文件下载。所以使用这个 maven 仓库,只要在 pom.xml 里增加:

<repositories>
    <repository>
        <id>ykz200-maven-repo</id>
        <url>https://raw.githubusercontent.com/ykz200/maven-repo/master/repository</url>
    </repository>
</repositories>

目录查看和搜索
值得注意的是,github 因为安全原因,把 raw 文件下载和原来的 github 域名分开了,而 raw.githubusercontent.com 这个域名是不支持目录浏览的。所以,想要浏览文件目录,或者搜索的话,可以直接到 github 域名下的仓库去查看。

比如这个文件 easyexcel-1.1.2-beta5.jar:

浏览器地址是:

https://github.com/ykz200/maven-repo/blob/master/repository/com/alibaba/easyexcel/1.1.2-beta5/easyexcel-1.1.2-beta5.jar

它的 maven 仓库 url 是:

https://raw.githubusercontent.com/ykz200/maven-repo/master/repository/com/alibaba/easyexcel/1.1.2-beta5/easyexcel-1.1.2-beta5.jar

maven 仓库工作的机制

下面介绍一些 maven 仓库工作的原理。典型的一个 maven 依赖下会有这三个文件:

https://github.com/ykz200/maven-repo/repository/com/alibaba/easyexcel/1.1.2-beta5/
maven-metadata.xml
maven-metadata.xml.md5
maven-metadata.xml.sha1

maven-metadata.xml 里面记录了最后 deploy 的版本和时间。

<?xml version="1.0" encoding="UTF-8"?>
<metadata>
  <groupId>com.alibaba</groupId>
  <artifactId>easyexcel</artifactId>
  <versioning>
    <release>1.1.2-beta5</release>
    <versions>
      <version>1.1.2-beta5</version>
    </versions>
    <lastUpdated>20190422130027</lastUpdated>
  </versioning>
</metadata>

其中 md5, sha1 校验文件是用来保证这个 meta 文件的完整性。

maven 在编绎项目时,会先尝试请求 maven-metadata.xml,如果没有找到,则会直接尝试请求到 jar 文件,在下载 jar 文件时也会尝试下载 jar 的 md5, sha1 文件。

maven-metadata.xml 文件很重要,如果没有这个文件来指明最新的 jar 版本,那么即使远程仓库里的 jar 更新了版本,本地 maven 编绎时用上 - U 参数,也不会拉取到最新的 jar!

所以并不能简单地把 jar 包放到 github 上就完事了,一定要先在本地 Deploy,生成 maven-metadata.xml 文件,并上传到 github 上。

参考:http://maven.apache.org/ref/3.2.2/maven-repository-metadata/repository-metadata.html

maven 的仓库关系
https://maven.apache.org/repository/index.html

配置使用本地仓库

想要使用本地 file 仓库里,在项目的 pom.xml 里配置,如:

<repositories>
	<repository>
		<id>ykz200-maven-repo</id>
		<url>file:/home/ykz200/code/maven-repo/repository/</url>
	</repository>
</repositories>

配置远程依赖

除了要把你的依赖坐标放到 dependencies 标签中之外,还需要在 pom.xml 中指定你的 repositories 的 url。

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>1.1.2-beta5</version>
</dependency>
<repositories>
	<repository>
		<!-- A unique identifier for a repository. -->
		<id>ykz200-maven-repo</id>
		<!--Human readable name of the repository. -->
		<name>bhusk.com repository</name>
		<url>https://raw.githubusercontent.com/ykz200/maven-net-repo/master/repository</url>
		<releases>
			<enabled>true</enabled>
			<checksumPolicy>warn</checksumPolicy>
		</releases>
		<snapshots>
			<enabled>true</enabled>
			<updatePolicy>always</updatePolicy>
			<checksumPolicy>warn</checksumPolicy>
		</snapshots>
	</repository>
</repositories>

这样你就可以下载远程仓库的依赖了。

注意事项

maven 的 repository 并没有优先级的配置,也不能单独为某些依赖配置 repository。所以如果项目配置了多个 repository,在首次编绎时,会依次尝试下载依赖。如果没有找到,尝试下一个,整个流程会很长。

所以尽量多个依赖放同一个仓库,不要每个项目都有一个自己的仓库。

也许会出现的问题

git fatal: 远程 origin 已经存在。

参考链接

黑壳博客 blog.bhusk.com

E-mail:keshu@bhusk.com

本文由 黑壳博客的壳叔 创作或转载,采用 知识共享署名 3.0 中国大陆许可协议 进行许可。

可自由转载、引用,但需署名作者且注明文章

评论  
留下你的脚步
推荐阅读