安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mkdir -p /usr/local/nexus3/nexus-data
chown -R 200 /usr/local/nexus3/nexus-data

docker run -d \
--privileged=true \
--name=nexus3 \
-u root \
-p 5000:5000 \
-p 8081:8081 \
-v /usr/local/nexus3/nexus-data:/nexus-data \
-e INSTALL4J_ADD_VM_PARAMS="-Xms512M -Xmx512M -XX:MaxDirectMemorySize=2048M" \
docker.io/sonatype/nexus3

登录仓库页面:http://ip:8081
默认账号admin,初始密码则存在容器中的/nexus-data/admin.password文件中。

有默认的这几个仓库:

  1. maven-central:maven中央库,默认从https://repo1.maven.org/maven2/拉取jar
  2. maven-releases:私库发行版jar,初次安装请将Deployment policy设置为Allow redeploy
  3. maven-snapshots:私库快照(调试版本)jar
  4. maven-public:仓库分组,把上面三个仓库组合在一起对外提供服务,在本地maven基础配置settings.xml中使用。

Nexus默认的仓库类型有以下四种:

  1. group(仓库组类型):又叫组仓库,用于方便开发人员自己设定的仓库;
  2. hosted(宿主类型):内部项目的发布仓库(内部开发人员,发布上去存放的仓库);
  3. proxy(代理类型):从远程中央仓库中寻找数据的仓库(可以点击对应的仓库的Configuration页签下Remote Storage属性的值即被代理的远程仓库的路径);
  4. virtual(虚拟类型):虚拟仓库(这个基本用不到,重点关注上面三个仓库的使用);

Policy(策略): 表示该仓库为发布(Release)版本仓库还是快照(Snapshot)版本仓库;

创建Blob Stores

文件存储的地方,创建一个目录的话,对应文件系统的一个目录,可供仓库上传文件使用,如图所示:

创建一个阿里云的代理仓库

由于访问中央仓库有时候会比较慢,这里添加一个阿里云的代理仓库,然后优先级放到默认中央库之前, 阿里云的maven仓库url为http://maven.aliyun.com/nexus/content/groups/public

然后再maven-public组里面将这个aliyun-proxy仓库加入,排在maven-central之前即可。

Nexus仓库分类的概念

1)Maven可直接从宿主仓库下载构件,也可以从代理仓库下载构件,而代理仓库间接的从远程仓库下载并缓存构件

2)为了方便,Maven可以从仓库组下载构件,而仓库组并没有时间的内容(下图中用虚线表示,它会转向包含的宿主仓库或者代理仓库获得实际构件的内容)

本地Maven使用私服

安装和配置好之后,在开发中可在maven的默认配置settings.xml中修改如下:

这里需要注意几点:

  1. <id> 元素必须在 repositoriespluginRepositoriesdistributionManagement 元素中保持一致。且pom.xml中指定的<id>setting.xml中下的<id>对应上(无论是<server><mirror>或是其他标签)!这是因为 <id> 元素用于唯一标识 Maven 存储库,以便 Maven 可以在 settings.xml 文件中的元素中查找与之匹配的凭据。
  2. <url> 元素指定 Maven 存储库的 URL。确保 URL 是正确的,并且可以通过网络访问。
  3. <releases> 元素和 <snapshots> 元素用于指定 Maven 存储库是否支持发布版本和快照版本。对于支持发布版本的存储库,将 <releases> 元素的 <enabled> 子元素设置为 true,对于支持快照版本的存储库,将 <snapshots> 元素的 <enabled> 子元素设置为 true。如果您的存储库不支持某种类型的版本,则可以将相应的元素设置为 false
  4. <updatePolicy> 元素指定 Maven 更新依赖关系的策略。对于快照版本,可以将 <updatePolicy> 元素设置为 always,以确保 Maven 始终从存储库中获取最新的快照版本。对于发布版本,通常将 <updatePolicy> 元素设置为 dailynever,以减少网络流量和依赖项下载时间。
  5. 如果您使用了自签名的 SSL 证书,则需要在 Maven 的 settings.xml 文件中配置 <servers> 元素,并将 trustStoretrustStorePassword 属性设置为包含 SSL 证书的 Java 密钥库和密码,以便 Maven 可以验证 SSL 证书并与 Nexus 存储库建立安全连接。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
<servers>
<server>
<id>nexus</id>
<username>admin</username>
<password>xxx</password>
</server>
</servers>
<mirrors>
<mirror>
<id>nexus</id>
<url>http://<nexus_host>/repository/maven-public/</url>
<mirrorOf>*</mirrorOf>
</mirror>
</mirrors>
<profiles>
<profile>
<id>nexus</id>
<repositories>
<repository>
<id>nexus</id>
<url>http://<nexus_host>/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
<updatePolicy>daily</updatePolicy>
<checksumPolicy>ignore</checksumPolicy>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>daily</updatePolicy>
<checksumPolicy>ignore</checksumPolicy>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>nexus</id>
<url>http://<nexus_host>/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
<updatePolicy>daily</updatePolicy>
<checksumPolicy>ignore</checksumPolicy>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>daily</updatePolicy>
<checksumPolicy>ignore</checksumPolicy>
</snapshots>
</pluginRepository>
</pluginRepositories>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
</profiles>
<activeProfiles>
<activeProfile>nexus</activeProfile>
</activeProfiles>

元素activeByDefault:

配置了<activeByDefault>标签的profile只会在没有其他激活的profile的情况下被激活

元素updatePolicy:

用来配置Maven从远程仓库检查更新的频率,默认的值是daily,表示Maven每天检查一次。其他可用的值包括:never——从不检查更新;always——每次构建都检查更新;in-terval:X——每隔X分钟检查一次更新(X为任意整数)。

元素checksumPolicy:

用来配置Maven检查检验和文件的策略。当构件被部署到Maven仓库中时,会同时部署对应的校验和文件。在下载构件的时候,Maven会验证校验和文件,如果校验和验证失败,怎么办?当checksumPolicy的值为默认的warn时,Maven会在执行构建时输出警告信息,其他可用的值包括:fail——Maven遇到校验和错误就让构建失败;ignore——使Maven完全忽略校验和错误。

发布jar到私服

如果需要发布自己的jar到私服,就需要修改工程:

  • setting.xml
1
2
3
4
5
6
7
8
9
...
</servers>
<server>
<id>nexus</id>
<username>admin</username>
<password>teadmin</password>
</server>
</servers>
...
  • pom.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
<distributionManagement>
<repository>
<!-- 此处id随意取,但必须和setting.xml中server下的id对应上 -->
<id>nexus</id>
<name>Releases</name>
<url>http://<nexus_host>/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>nexus</id>
<name>Snapshot</name>
<url>http://<nexus_host>/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>

注意上面的repository的id值一定要跟settings.xml文件中配置的server一致。

这里使用SpringBoot的starter项目作为测试。

部署到快照版仓库【后缀:SNAPSHOT】

将jar包部署到快照仓库,
pom.xml中的版本配置为0.0.1-SNAPSHOT,
标识为快照。

部署到发行版仓库【后缀:RELEASE,也可以只用版本号】

将jar包部署到发行版仓库,
pom.xml中的版本配置为0.0.1-RELEASE,
标识为发行版,也可以只用版本号,如0.0.1。

  • 成功标识:

查看仓库

完成Nexus Repository私有仓库部署,登录私仓后,可以看到多个仓库,
仓库分类如下表所示,

序号仓库描述
1maven-central中央仓库,默认从https://repo1.maven.org/maven2/拉取软件包,可配置
2maven-public公共仓库,存储发行版和快照版的软件包,即发行版和快照版的软件包都会在public中
3maven-releases发行版仓库,软件包稳定后,发布到该仓库,团队内使用
4maven-snapshots快照版本仓库,用于测试软件,发布到线上

小记:执行指令上传jar到Nexus

  • 本地开发完的jar可以直接执行deploy
1
mvn clean deploy
  • 第三方Jar上传到Nexus
1
2
3
4
5
6
7
8
mvn deploy:deploy-file \
-DgroupId=<group-id> \
-DartifactId=<artifact-id> \
-Dversion=<version> \
-Dpackaging=<type-of-packaging> \
-Dfile=<path-to-file> \
-DrepositoryId=<server-id-settings.xml> \
-Durl=<url-of-the-repository-to-deploy>

-DrepositoryId的值即为在setttings.xml里面配置的server id。

使用私服中的依赖

在项目中添加私有仓库的地址,
通过repositories属性,与dependencies属性同级。
再引入对应的jar包Maven坐标,
配置样例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<repositories>
<repository>
<id>nexus</id>
<url>http://192.168.211.129:18081/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>com.monkey</groupId>
<artifactId>template-spring-boot-starter</artifactId>
<version>0.0.1-RELEASE</version>
</dependency>
</dependencies>