为什么要使用Maven私服
Maven是笔者在开发中用的最多的仓库, 已经不记得和pom文件做过多少次战斗了
公开仓库里有很多优秀的项目, 但难免会有较为特殊的需求, 它除了需求过分之外, 还有很多module, 甚至同事的项目都进行了引用
传统的jar包方式显示是落后且不优雅的
面对这种情况, 搭建自己或公司的Maven私服显然是最佳解决方案
我知道在网上有许许多多类似的教程和攻略, 但笔者认为它们或多或少都缺少了一些系统性的指引, 亦或是缺少关键步骤的讲解, 自己死磕了接近一整天也拜它们所赐
故, 在这里对如何搭建Maven私服进行一次最为全面和系统的整理与解读
选择搭建方式
总共有三种比较合适的Maven私服搭建方式:
- Nexus
- Github仓库
- Github Packages
三种方式各有特点, 需要各位根据自己的实际情况进行选择, 我来简单列举一下它们的适用的场景:
- Nexus: 适合公司规模的私服搭建, 教程资源丰富, 管理容易, 但对硬件性能要求较高
- Github仓库: 个人和公司均适用, 无需搭建, 但项目打包发布需要配置, 且国内访问和速度堪忧
- Github Packages: 相对于Github仓库更加便捷, 项目打包发布也简便, 但在引入时需要Github认证, 适合使用Github作为开发库的团队
还是那句话, 没有最好的, 只有最合适的
选择好合适的方式后, 来开始我们的表演吧
开始搭建!
Nexus
Nexus网上的教程有太多, 贴一篇我认为不错的
需要注意的是, 新版本的Nexus要想启动必须拥有2G以上内存, 劝退了一众小型云服务器
Github Packages
为什么先说这个呢?因为我的重点在Github仓库
准备工作
在使用Github Packages之前, 我们需要进行如下三步准备工作:
- 拥有一个Github账号
- 生成一个用于访问的token
- 创建一个用于保存的仓库, 我习惯命名为: maven-repo
上面的步骤均可在浏览器进行, 且网上教程很多, 不再赘述
修改Maven配置
我们的Maven一般有两种情况:
- 本机安装的Maven: 去修改${MavenHome}/conf/settings.xml
- idea自带的Maven: 创建一个settins.xml, 在idea的Maven设置中进行覆盖
修改<servers>和<profiles>标签
<servers>
<server>
<id>服务id</id>
<username>Github账号名称</username>
<password>Github访问token</password>
</server>
</servers>
<profiles>
<profile>
<id>github</id>
<repositories>
<repository>
<id>central</id>
<url>https://repo1.maven.org/maven2</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>服务id, 和server标签中保持一致</id>
<name>自定义</name>
<url>https://maven.pkg.github.com/Github账号名称/Github仓库名称</url>
</repository>
</repositories>
</profile>
</profiles>
修改pom文件
在项目的pom文件中, 设置发布参数
<distributionManagement>
<repository>
<id>服务id</id>
<name>自定义</name>
<url>https://maven.pkg.github.com/Github账号名称/Github仓库名称</url>
</repository>
</distributionManagement>
其中<repository>中的内容和上一步maven配置文件中的<server>保持一致
接下来, 只要进行maven的deploy命令, 项目就会自动发布到Github Packages里啦
再次强调, Github Packages的私服, 需要在maven中配置Github的token认证才能使用
如何使用
如果要让其它人使用Github Packages中的依赖, 需要对方拥有Github账号和认证, 并修改Maven配置
然后在pom中直接引入即可
pom引入可参考Github仓库中的方法
Github仓库
重点来了, 这是笔者最后选择的方式
准备工作
- 拥有一个Github账号
- 生成一个用于访问的token
修改Maven配置
和Github Packages相同, 我们需要修改Maven的配置(用于发布):
<servers>
<server>
<id>服务id</id>
<username>Github账号名称</username>
<password>Github访问token</password>
</server>
</servers>
这里会有教程使用Github用户名和密码, 经笔者实际测试, 在使用密码时会报404的错误, 所以老老实实用token吧
修改pom文件
我们总共要做两件事:
- 将项目发布到本地Maven仓库
- 使用site-maven-plugin自动将仓库同步到Github
选择一个本地路径作为Maven仓库, 要注意加"file:"哦
<distributionManagement>
<repository>
<id>Houtaroy Local</id>
<url>file:本地文件路径</url>
</repository>
</distributionManagement>
使用site-maven-plugin插件, 进行自动上传
<plugin>
<groupId>com.github.github</groupId>
<artifactId>site-maven-plugin</artifactId>
<version>${site-maven-plugin.version}</version>
<configuration>
<!--和上面maven中修改的保持一致-->
<server>服务id</server>
<message>Maven artifacts for ${project.artifactId} ${project.version}</message>
<noJekyll>true</noJekyll>
<!--本地Maven仓库地址, 和distributionManagement一致, 不需要"file:"-->
<outputDirectory>本地文件路径</outputDirectory>
<branch>refs/heads/Github分支名称</branch>
<includes>
<include>**/*</include>
</includes>
<repositoryName>Github仓库</repositoryName>
<repositoryOwner>Github用户名</repositoryOwner>
</configuration>
<executions>
<execution>
<goals>
<goal>site</goal>
</goals>
<phase>deploy</phase>
</execution>
</executions>
</plugin>
完成上面的配置后, 执行maven的deploy命令, 会在本地文件路径中生成文件, 并同步上传到Github仓库
如何使用
要想让其它人使用你的依赖, 我们需要完成:
1.配置私服地址 2.在pom中引入依赖
先配置私服地址, 注意这里和仓库的地址不同, 要在github前增加raw
<repository>
<id>Spring Boot Koala</id>
<name>Spring Boot Koala</name>
<url>https://raw.github.com/Github用户名/Github仓库/Github分支名称/</url>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</repository>
接下来在pom中引入我们需要的依赖:
<dependency>
<groupId>cn.houtaroy</groupId>
<artifactId>spring-boot-koala-starter-mqtt-auto</artifactId>
<version>2021.1.0-SNAPSHOT</version>
</dependency>
国内网友的坑
国内的小伙伴们在引入依赖时大概率会遇到无法访问raw.github的问题, 还好我们有gitee, 可以采用曲线拯救的方式
使用Gitee作为代理需要如下步骤:
- 拥有一个Gitee账号
- 在Gitee中导入Github仓库
- 定时将Github仓库同步到Gitee
前两步骤不再赘述, 第三步推荐使用Github Actions, 可以参考这位大神的文章
接下来我们只需要修改下私有仓库的地址即可:
<repository>
<id>Spring Boot Koala</id>
<name>Spring Boot Koala</name>
<!--这里的raw位置和github不同哦-->
<url>https://gitee.com/Gitee用户名/Gitee仓库/raw/Gitee分支名称/</url>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</repository>