使用Nexus3搭建Maven私有镜像仓库
目录
一、Nexus和Maven的关系
二、Nexus部署和配置
1、Nexus部署
2、Nexus配置
三、Maven配置
1、全局setting.xml配置
2、项目pom.xml配置
3、常用Maven命令
四、问题处理
一、Nexus和Maven的关系
Maven是一个项目管理工具,主要用于构件管理和依赖管理。Maven通过仓库来统一管理各种构件,仓库分为本地仓库和远程仓库。本地仓库是用户在settings.xml中配置的本地仓库地址,而远程仓库则包括中央仓库和其他外部仓库。Maven在处理依赖时,会首先查看本地仓库,如果本地仓库中没有所需的构件,则会去远程仓库查找并下载到本地仓库中。
Nexus是一个强大的Maven仓库管理器,通常被称为Maven的私服。当本地Maven项目需要下载构件时,先去私服请求,如果私服没有,则再去远程仓库请求,从远程仓库下载构件后,把构件缓存在私服上。这种方式不仅节省带宽和时间,还能降低中央仓库的负荷。
二、Nexus部署和配置
1、Nexus部署
#拉取镜像
docker pull sonatype/nexus3
#持久化目录
mkdir -p /data/nexus/data
chmod 777 -R /data/nexus/data
#启动服务
docker run -d --name nexus3 -p 8081:8081 --restart always -v /data/nexus/data:/nexus-data sonatype/nexus3
#查看日志
docker logs -f nexus3
打开浏览器,访问 http://ip:8081/
查看admin账户登录密码
cat /data/nexus/data/admin.password
2、Nexus配置
3.1、存储管理
在创建仓库之前,需要先指定存储目录,便于统一管理,就需要创建Blob Store,不创建则使用default存储目录。本文使用default存储目录。
3.2、Nexus仓库说明
默认仓库说明
- maven-central:中央仓库,用于从公共的开源库下载
- maven-releases:发布仓库,用于保存开发的稳定发行版本
- maven-snapshots:快照仓库,用于保存开发过程中的不稳定版本
- maven-public:组合仓库,组合多个仓库对外提供服务
- maven-thirdparty:第三方仓库,用于存放不能从中央仓库获取的或者不开源的
3.3、修改中央仓库
由于网络限制,需要将默认的中央仓库地址改为国内的中央仓库地址。
默认的中央仓库地址:https://repo1.maven.org/maven2/
修改为
阿里云的中央仓库地址:https://maven.aliyun.com/repository/public/
3.4、修改发布仓库
Nexus中发布仓库默认的“Deployment Policy”配置是“Disable Redeploy”,因此无法发布项目。要发布项目,需要设置为“Allow Redeploy”。
3.5、创建第三方仓库
第三方仓库是用于存放不能从公共中央仓库获取的或者不开源的库,这个通常是由内部人员自行下载之后发布上去。
Hosted有三种方式:Releases、Snapshot、Mixed
- Releases: 稳定发行版本
- Snapshot: 未发布的不稳定版本
- Mixed:混合的
Deployment设置选项有三个值:
- Allow redeploy:允许同一个版本号下重复提交代码,nexus以时间区分
- Disable redeploy:不允许同一个版本号下重复提交代码
- Read-Only:不允许提交任何版本
原生的maven-releases库是Disable redeploy设置, maven-snapshots是Allow redeploy。
可通过页面上传第三方jar包
3.6、修改组合仓库
设置组成员,组成员仓库的顺序很重要,因为Nexus会按照仓库在列表中的顺序来解析依赖项。通常,加入group资源库的顺序应是:hosted仓库 > 国内proxy仓库 > 国外proxy仓库,这样做可以提高依赖项的下载速度。
三、Maven配置
settings.xml和pom.xml是Maven中两个非常重要的配置文件。
- settings.xml文件通常位于Maven安装目录的conf目录下,配置Maven的行为,如本地仓库地址、远程仓库地址等。它是Maven的全局配置,适用于所有项目。
- pom.xml文件位于每个项目中,包含了项目的配置信息,如项目依赖、插件配置、项目信息等。它是项目级别的配置。
在Maven中,settings.xml和pom.xml的优先级如下:
- pom.xml > settings.xml:即项目级别的配置pom.xml优先于全局级别的配置settings.xml。如果在pom.xml中配置了某个设置,那么它会覆盖settings.xml中相应的配置。
- 在实际使用中,通常只需要修改settings.xml文件来配置一些全局性的设置,而pom.xml中的配置更多关注于项目本身。
1、全局setting.xml配置
<!-- 本地仓库路径 -->
<localRepository>D:\ProgramData\Maven\repository</localRepository>
<!-- nexus服务器 -->
<servers>
<server>
<id>public</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<id>snapshots</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<id>releases</id>
<username>admin</username>
<password>admin123</password>
</server>
</servers>
<!-- 镜像仓库配置 -->
<mirrors>
<mirror>
<id>public</id>
<name>public</name>
<url>http://127.0.0.1:8081/repository/maven-public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
镜像仓库mirrors配置
- <id>:此镜像的唯一标识符,可以是任何字符串,用于区分不同的镜像。
- <name>:是用来指定镜像的名称的。这个名称通常是一个描述性的字符串。
- <url>:镜像仓库的基本URL
- <mirrorOf>:指定了该镜像适用于哪个 Maven 仓库。
settings.xml不做任何配置时是有默认的仓库的,这个仓库就是central仓库,URL地址是:https://repo.maven.apache.org/maven2/。在这个示例中,mirrorOf 设置为central,表示这个镜像仅适用于中央仓库。配置镜像仓库的目的是为了提高依赖库的下载速度。
如果<mirrorOf>被设置为 *,表示这个镜像对所有 Maven 仓库都生效,即所有的 Maven 仓库都会使用这个镜像。这在某些情况下可能是有用的,特别是在没有直接访问外网的情况下使用本地或内部镜像。
2、项目pom.xml配置
<!--构件发布信息,在执行mvn deploy后表示要发布的位置。 -->
<distributionManagement>
<!--构件的稳定版部署位置 -->
<repository>
<!-- id和settings.xml中server的id保持一致 -->
<id>releases</id>
<url>http://127.0.0.1:8081/repository/maven-releases/</url>
</repository>
<!-- 构件的快照版部署位置 -->
<snapshotRepository>
<!-- id和settings.xml中server的id保持一致 -->
<id>snapshots</id>
<url>http://127.0.0.1:8081/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
3、常用Maven命令
# 上传命令,优先可通过网页上传
mvn deploy:deploy-file
-DrepositoryId=releases
-Durl=http://127.0.0.1:8081/repository/maven-releases/
-Dfile=D:\configuration-1.1.0.jar
-Dsources=D:\configuration-1.1.0-sources.jar
-DgroupId=com.cnstar.common -DartifactId=cnstar-configuration -Dversion=1.1.0 -Dpackaging=jar
-DpomFile=D:\pom.xml
# 上传源代码命令
mvn deploy:deploy-file
-DrepositoryId=releases
-Durl=http://127.0.0.1:8081/repository/maven-releases/
-Dfile=D:\storage-service-1.1.0-sources.jar
-Dclassifier=sources -DgroupId=com.cnstar.common -DartifactId=cnstar-storage-service -Dversion=1.1.0 -Dpackaging=jar
# 删除的话可直接到nexus上直接删除
# 远程库下载命令
mvn dependency:get
-DremoteRepositories=https://mvnrepository.com/artifact/org.influxdb/influxdb-java
-DgroupId=org.influxdb -DartifactId=influxdb-java -Dversion=2.17
# 中央库下载命令
mvn dependency:get
-DgroupId=org.springframework.boot -DartifactId=spring-boot-devtools -Dversion=2.1.4.RELEASE
# 下载源码包
mvn dependency:get
-Dclassifier=sources
-DgroupId=com.cnstar.common -DartifactId=cnstar-storage-service -Dversion=1.1.0
四、问题处理
1、阿里云中央仓库无法远程自动下载构件到仓库,nexus.log日志内容如下:
admin org.sonatype.nexus.repository.httpclient.internal.HttpClientCustomConfigFacetImpl - Remote connection status of repository maven-central set to Remote Manually Blocked.
解决方法:
a)排查是否勾选了远程仓库被手动阻止,如果是的话取消勾选