一、 概要
私服是一種特殊的遠(yuǎn)程Maven倉(cāng)庫(kù),它是架設(shè)在局域網(wǎng)內(nèi)的倉(cāng)庫(kù)服務(wù),私服一般被配置為互聯(lián)網(wǎng)遠(yuǎn)程倉(cāng)庫(kù)的鏡像,供局域網(wǎng)內(nèi)的Maven用戶(hù)使用。

當(dāng)Maven需要下載依賴(lài)的時(shí)候,先向私服請(qǐng)求,如果私服上不存在該依賴(lài),則從外部的遠(yuǎn)程倉(cāng)庫(kù)下載,同時(shí)緩存在私服之上,然后為Maven下載請(qǐng)求提供下載服務(wù),另外,對(duì)于自定義或第三方的jar可以從本地上傳到私服,供局域網(wǎng)內(nèi)其他maven用戶(hù)使用。

二、優(yōu)點(diǎn)
- 節(jié)省外網(wǎng)寬帶
- 加速M(fèi)aven依賴(lài)
- 部署第三方構(gòu)件
- 提高穩(wěn)定性、增強(qiáng)控制:原因是外網(wǎng)不穩(wěn)定
- 降低中央倉(cāng)庫(kù)的負(fù)荷:原因是中央倉(cāng)庫(kù)訪(fǎng)問(wèn)量太大
三、搭建私服
說(shuō)明
Maven私有倉(cāng)庫(kù)-使用docker部署Nexus
官方鏡像說(shuō)明
啟動(dòng)容器
官方說(shuō)明中提到的是使用docker直接啟動(dòng)。我選擇用docker-compose啟動(dòng)。
docker-compose.yml文件如下:
- vim docker-compose.yml
services: nexus: container_name: nexus-container image: sonatype/nexus3 restart: always ports: - 8081:8081 volumes: # 映射數(shù)據(jù)目錄 - ./nexus3/data/:/nexus-data # 映射日志目錄 - ./nexus3/log/:/nexus-data/log/ - docker-compose up -d
- docker-compose ps
注意 : 可能會(huì)出現(xiàn)權(quán)限問(wèn)題
/nexus-data/log/karaf.log (Permission denied)
修改宿主機(jī)映射目錄的權(quán)限 例如:
# 例如我的容器卷目錄 /docker/docker-compose/nexus/nexus3/data
chmod -R 777 docker/docker-compose/nexus/nexus3/data
驗(yàn)證安裝是否成功
在瀏覽器輸入 http://127.0.0.1:8081

注意 第一次登陸的時(shí)候賬號(hào)名是admin密碼在在宿主機(jī)隱射的data數(shù)據(jù)卷中

四、訪(fǎng)問(wèn)nexus3
maven相關(guān)的倉(cāng)庫(kù)
- maven-central
- maven-releases
- maven-snapshots
-
maven-public
image
類(lèi)型
proxy是遠(yuǎn)程倉(cāng)庫(kù)的代理
在nexus中配置了一個(gè)中央庫(kù)的proxy,當(dāng)用戶(hù)向這個(gè)proxy請(qǐng)求一個(gè)artifact,這個(gè)proxy就會(huì)先在本地查找,如果找不到的話(huà),就會(huì)從遠(yuǎn)程倉(cāng)庫(kù) 下載,然后返回給用戶(hù),相當(dāng)于起到一個(gè)中轉(zhuǎn)的作用。
hosted是宿主倉(cāng)庫(kù)
用戶(hù)可以把自己的一些依賴(lài),deploy到hosted中,也可以手工上傳構(gòu)件到hosted里。比如說(shuō)oracle的驅(qū)動(dòng)程序,ojdbc6.jar,在中央庫(kù)是獲取不到的,就需要手工上傳到hosted里。
group是倉(cāng)庫(kù)組
在maven里沒(méi)有這個(gè)概念,是nexus特有的。目的是將上述多個(gè)倉(cāng)庫(kù)聚合,對(duì)用戶(hù)暴露統(tǒng)一的地址,這樣用戶(hù)就不需要在pom中配置多個(gè)地址,只要統(tǒng)一配置group的地址就可以了。
五、如何發(fā)布自己的構(gòu)件到私有倉(cāng)庫(kù)中?
配置settings文件中的節(jié)點(diǎn)
在~/.m2/settings或者全局config/settings中增加server節(jié)點(diǎn),根據(jù)需要可以添加多個(gè)server
<servers>
<server>
<id>nexus-releases</id>
<username>admin</username>
<password>admin</password>
</server>
<server>
<id>nexus-snapshots</id>
<username>admin</username>
<password>admin</password>
</server>
</servers>
在pom文件中配置插件
在項(xiàng)目的pom.xml/build/中配置中配置maven-deploy-plugin
<!--發(fā)布到私有倉(cāng)庫(kù)依賴(lài)的插件-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.1</version>
<executions>
<execution>
<id>default-deploy</id>
<phase>deploy</phase>
<goals>
<goal>deploy</goal>
</goals>
</execution>
</executions>
<configuration>
<skip>false</skip>
</configuration>
</plugin>
溫馨提示:如果在多模塊項(xiàng)目中,可以將不需要發(fā)布的項(xiàng)目配置為skip=true。比如在parent的pom.xml中增加以下內(nèi)容后,所有模塊都會(huì)跳過(guò)發(fā)布。
<build>
<plugins>
<!--發(fā)布到私有倉(cāng)庫(kù)依賴(lài)的插件-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
配置distributionManagement
在項(xiàng)目的pom.xml中配置distributionManagement
<!--發(fā)布到私有倉(cāng)庫(kù)的配置-->
<distributionManagement>
<repository>
<id>nexus-releases</id>
<name>nexus releases</name>
<url>http://0.0.0.0:8081/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>nexus-snapshots</id>
<name>nexus snapshots</name>
<url>http://0.0.0.0:8081/repository/maven-snapshots/</url>
<uniqueVersion>false</uniqueVersion>
<layout>legacy</layout>
</snapshotRepository>
</distributionManagement>
其中repository.id指~/.m2/settings.xml中配置的server.id, 這兩個(gè)是同一個(gè)概念,值要一致。
- 運(yùn)行pom.xml所在目錄 運(yùn)行發(fā)布命令
mvn clean deploy -Dmaven.test.skip=true
六、指定使用私有倉(cāng)庫(kù)下載maven依賴(lài)
有兩種方式,建議使用第二種方式
pom.xml文件中配置
在需要引用構(gòu)件的項(xiàng)目中添加repository配置
<!--在項(xiàng)目中指定使用私有倉(cāng)庫(kù)或者在~/.m2/settings.xml配置全局的mirror-->
<repositories>
<repository>
<id>nexus-ielong</id>
<name>ielong Nexus Repository</name>
<url>http://0.0.0.0:18081/repository/maven-public/</url>
</repository>
</repositories>
maven中的settings配置
在~/.m2/settings中指定mirror
<mirrors>
<!--不再使用aliyun的鏡像-->
<!--<mirror>
<id>nexus-aliyun</id>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
<mirrorOf>central</mirrorOf>
</mirror>-->
<!--使用自己的私有鏡像-->
<mirror>
<id>nexus-ielong</id>
<name>nexus public group</name>
<url>http://0.0.0.0:8081/repository/maven-public/</url>
<mirrorof>*</mirrorof>
</mirror>
</mirrors>
