Docker 安裝Nexus3 快速搭建Maven私有倉庫 (完整詳細版)

前言

Maven的基礎示意圖

通常,我們開發項目並沒有使用到虛線標識的那兩部分,基本都是通過本機的Maven直接訪問中央倉庫,下載jar包到本地倉庫。現在我們需要搭建中間虛線部分。 

三種專門的Maven倉庫管理軟件可以用來幫助大家建立私服:Apache基金會的Archiva、JFrog的Artifactory和Sonatype的Nexus。而Nexus是當前最流行的Maven倉庫管理工具。

簡介

nexus是一個強大的maven倉庫管理器,它極大的簡化了本地內部倉庫的維護和外部倉庫的訪問.

nexus是一套開箱即用的系統不需要數據庫,它使用文件系統加Lucene來組織數據

nexus使用ExtJS來開發界面,利用Restlet來提供完整的REST APIs,通過IDEA和Eclipse集成使用

nexus支持webDAV與LDAP安全身份認證.

nexus提供了強大的倉庫管理功能,構件搜索功能,它基於REST,友好的UI是一個extjs的REST客戶端,佔用較少的內存,基於簡單文件系統而非數據庫.

特點:

  • 節省外網帶寬。
  • 加速Maven構建。
  • 部署第三方構件。
  • 提高穩定性,增強控制。
  • 降低中央倉庫的負荷。
  • 控制和審計
  • 建立本地內部公用倉庫

 1、尋找Nexus鏡像

 Docker 官方鏡像倉庫

 查找鏡像

docker search sonatype/nexus3

 拉取鏡像

docker pull sonatype/nexus3

持久化目錄

 
mkdir -p /home/nexus/data
chmod 777 -R /home/nexus/data

2、啓動Nexus鏡像 

 啓動鏡像

docker run -d --name nexus3 -p 8081:8081 --restart always -v /home/nexus/data:/nexus-data sonatype/nexus3

 日誌查看

docker logs -f nexus3

稍等一下,出現 Started Sonatype Nexus OSS 表示啓動好了。 

3、Nexus訪問

安裝完成後可訪問管理平臺:http://ip:8081,打開瀏覽器,訪問 http://192.168.124.184:8081/

默認管理員用戶名:admin 密碼:admin123,如果提示密碼不對,需要到容器裏面查看管理員admin密碼!!!

cat /home/nexus/data/admin.password

第一次登陸之後,一般提示修改密碼!修改密碼之後,重新登錄!!!

4、配置Nexus

默認倉庫說明

maven-central:maven中央庫,默認從https://repo1.maven.org/maven2/拉取jar
maven-releases:私庫發行版jar,初次安裝請將Deployment policy設置爲Allow redeploy
maven-snapshots:私庫快照(調試版本)jar
maven-public:倉庫分組,把上面三個倉庫組合在一起對外提供服務,在本地maven基礎配置settings.xml或項目pom.xml中使用

Nexus倉庫類型介紹

hosted:本地倉庫,通常我們會部署自己的構件到這一類型的倉庫。比如公司的第二方庫。
proxy:代理倉庫,它們被用來代理遠程的公共倉庫,如maven中央倉庫。
group:倉庫組,用來合併多個hosted/proxy倉庫,當你的項目希望在多個repository使用資源時就不需要多次引用了,只需要引用一個group即可。

 5、創建Blob Stores

在創建repository之前,還需要先指定文件存儲目錄,便於統一管理。就需要創建Blob Stores,不創建則使用的是default

可以看到blob stores有兩個,一個是系統默認的,一個是剛創建的。如果不想自己創建,使用系統默認的文件存儲目錄也是可以的。到時候創建repository時,存儲目錄選擇default就可以了。新創建的目錄,可以在/data/blobs/目錄下面可以看到。

 

6、Nexus倉庫

 如圖所示,代理倉庫負責代理遠程中央倉庫,託管倉庫負責本地資源,組資源庫 = 代理資源庫 + 託管資源庫

 7、創建proxy repository代理倉庫

 選擇maven2(proxy),代理倉庫

設置代理倉庫 

其他的可以採用默認,以後需要修改的可以再修改。

這裏推薦幾個遠程倉庫

jboss的maven中央倉庫地址:http://repository.jboss.com/maven2/
阿里雲的maven中央倉庫地址:http://maven.aliyun.com/nexus/content/groups/public/
apache的maven中央倉庫地址:http://repo.maven.apache.org/maven2/
 

8、創建hosted repository倉庫

Hosted有三種方式:Releases、Snapshot、Mixed

Releases: 一般是已經發布的Jar包
Snapshot: 未發佈的版本
Mixed:混合的

 上圖的Hosted設置選項,選項中有三個值:

Allow redeploy:允許同一個版本號下重複提交代碼, nexus以時間區分
Disable redeploy:不允許同一個版本號下重複提交代碼
Read-Only:不允許提交任何版本
原生的maven-releases庫是Disable redeploy設置, maven-snapshots是Allow redeploy。

9、創建group repository組倉庫

爲什麼要注意順序??

官方文檔中建議:

It is recommended practice to place hosted repositories higher in the list than proxy repositories. For proxy repositories, the repository manager needs to check the remote repository which will incur more overhead than a hosted repository lookup.

希望將hosted repositories【託管資源庫】的順序放在proxy repositories【代理資源庫】之前,因爲一個group【組資源庫】中可以涵括這些託管資源庫和代理資源庫。而一整個的group是作爲一個public,一個接口給別人使用的。所以當查找架包的時候,如果代理資源庫在前面,那就是先從遠程去查找jar,而不是先從託管資源庫(本地倉庫)去查找是否有jar。這樣訪問外網的消耗比起來在本地查找,當然是將託管資源庫放在代理資源庫之前的優先位置了。

10、Maven配置

Maven下的setting.xml文件和項目中的pom.xml文件的關係是:settting.xml文件是全局設置,而pom.xml文件是局部設置。pom.xml文件對於項目來說,是優先使用的。而pom.xml文件中如果沒有配置鏡像地址的話,就按照settting.xml中定義的地址去查找。

 如上圖方式獲取組倉庫smart_group的倉庫地址,修改setting.xml文件如下:

<!--nexus服務器,id爲組倉庫name-->
<servers>
    <server>
        <id>custom_group</id>
        <username>admin</username>
        <password>admin123</password>
    </server>
</servers>
<!--倉庫組的url地址,id和name可以寫組倉庫name,mirrorOf的值設置爲central-->
<mirrors>
    <mirror>
        <id>custom_group</id>
        <name>custom_group</name>
        <url>http://192.168.124.189:8081/repository/custom_group/</url>
        <mirrorOf>central</mirrorOf>
    </mirror>
</mirrors>

 修改後可以重新編譯項目,必須添加參數-U,(-U,--update-snapshots,強制更新releases、snapshots類型的插件或依賴庫,否則maven一天只會更新一次snapshot依賴)。代理倉庫會從遠程中央倉庫下載jar包

mvn clean compile -U

新建SpringBoot項目,可以查看本地倉庫,遠程倉庫的下載的Jar包

這個時候可以看到代理倉庫已經從中央倉庫下載了項目編譯需要的jar包。同樣地,在組倉庫中也能看到所有的jar包,包括代理倉庫和宿主倉庫的。

11、管理平臺上傳三方jar包 

有些jar是第三方提供的,在中央倉庫中是沒有的,我們可以上傳這些本地三方jar包到hosted repository宿主倉庫中。

上傳成功後,就可以看到hosted repository和group repository中已經有了剛上傳的三方jar包 

然後項目中通過編譯打包就可以下載jar包到本地repository中了,記住maven   clean、compile、package首次執行時加參數-U。 

 13、命令上傳三方jar包

在setting.xml配置文件中添加hosted repository server

<!--id自定義,但是在使用命令上傳的時候會用到-->
<server>
    <id>custom_hosted</id>
    <username>admin</username>
    <password>admin123</password>
</server>
 

 使用如下命令上傳jar包:

mvn deploy:deploy-file -DgroupId=byd.ghy -DartifactId=portal-auth -Dversion=1.0.0 -Dpackaging=jar -Dfile=D:\workspace_byd\workspace_ghy\workspace_portal-backend\portal-backend-jar-v2\target\auth-server.jar -Durl=http://192.168.124.189:8081/repository/custom_hosted/ -DrepositoryId=custom_hosted
命令解釋:
-DgroupId=byd.ghy                         自定義
-DartifactId=portal-auth                  自定義
-Dversion=1.0.0                      自定義,三個自定義,構成pom.xml文件中的標識
-Dpackaging=jar                     傳的類型是jar類型
-Dfile=D:\auth-server.jar                jar包的本地磁盤位置
-Durl=http://ip:8081/repository/custom_hosted/  hosted資源庫的地址
-DrepositoryId=custom_hosted             需要和setting.xml文件中配置的ID一致
 

上傳成功後,hosted repository中已經可以看到了

14、deploy部署jar包到私服

release和snapshots jar包區別

SNAPSHOT版本代表不穩定(快照版本),還在處於開發階段,隨時都會有變化。
當上傳同樣的版本號jar包的時候,SNAPSHOT會在版本號的後面自動追加一串新的數字,即日誌標籤,
nexus會根據日誌標籤區分出不同的版本,在maven引用時,如果使用的是snapshot版本,
重新導入maven的時候,會去私庫拉取最新上傳的代碼。
RELEASE則代表穩定的版本(發佈版本),一般上線後都會改用RELEASE版本。
也就是說1.0,2.0這樣的版本只能有一個,也就是說當前版本號下,不可能出現不同的jar。

 創建snapshot倉庫

可以在nexus上添加一個snapshot倉庫,專門用於存放snapshot版本的jar包。snapshot倉庫也是hosted類型的,創建方式和hosted repository類型。創建好後,加入到組倉庫裏面就可以了。 

 一定要選擇Deployment Policy爲allow redeploy

 同樣的操作,創建Release類型的倉庫,並加入到組中 

15、項目pom.xml文件配置 

可以在項目的pom文件中設置具體的relaeses庫和snapshots庫。如果當前項目的版本號的後綴名中帶着-SNAPSHOT,類似<version>***-SNAPSHOT</version>,就會將項目jar包提交到snapshots庫中,沒有帶-SNAPSHOT的話會提交releases庫中。

 在pom.xml文件中配置 distributionManagement 節點如下,在項目中執行deploy命令後,jar包將會被上傳到nexus中。

setting.xml中配置

<server>
    <id>custom_snapshots</id>
    <username>admin</username>
    <password>admin123</password>
</server>
<server>
    <id>custom_releases</id>
    <username>admin</username>
    <password>admin123</password>
</server>

pom.xml配置

<repositories>
    <repository>
        <id>custom_group</id>
        <name>Nexus Repository</name>
        <url>http://192.168.124.189:8081/repository/custom_group/</url>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
        <releases>
            <enabled>true</enabled>
        </releases>
    </repository>
</repositories>
<pluginRepositories>
    <pluginRepository>
        <id>custom_group</id>
        <name>Nexus Plugin Repository</name>
        <url>http://192.168.124.189:8081/repository/custom_group/</url>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
        <releases>
            <enabled>true</enabled>
        </releases>
    </pluginRepository>
</pluginRepositories>
<!--項目分發信息,在執行mvn deploy後表示要發佈的位置。有了這些信息就可以把網站部署到遠程服務器或者把構件jar等部署到遠程倉庫。 -->
<distributionManagement>
    <repository><!--部署項目產生的構件到遠程倉庫需要的信息 -->
        <id>custom_releases</id><!-- 此處id和settings.xml的id保持一致 -->
        <name>Nexus Release Repository</name>
        <url>http://192.168.124.189:8081/repository/custom_releases/</url>
    </repository>
    <snapshotRepository><!--構件的快照部署到哪裏?如果沒有配置該元素,默認部署到repository元素配置的倉庫,參見distributionManagement/repository元素 -->
        <id>custom_snapshots</id><!-- 此處id和settings.xml的id保持一致 -->
        <name>Nexus Snapshot Repository</name>
        <url>http://192.168.124.189:8081/repository/custom_snapshots/</url>
    </snapshotRepository>
</distributionManagement>
 

 默認地,maven編譯打包不會下載SNAPSHOT版本的jar包,所以還需要在pom.xml文件中配置支持下載snapshot版本jar包。

mvn clean deploy -Dmaven.test.skip=true

 至此,nexus搭建完畢,支持本地部署依賴jar包!!!

16、問題排查

1、nexus.log日誌中報錯內容如下:

UNKNOWN com.sonatype.nexus.plugins.outreach.internal.outreach.SonatypeOutreach - Could not download page bundle
java.net.SocketException: Network is unreachable (connect failed)

 解決方法:

a) 訪問Nexus管理站點,我這裏是 http://192.168.124.184:8081,進入後,用管理員帳號登錄。

b)點擊 下圖中上面的按鈕,然後選擇左側Capabilities,然後點擊右側的 Outreach:Management

 c)點擊【disable】按鈕,關閉Outreach服務

或者給Outreach設定新的URL,可以在標籤頁 Settings 中的 Override Outreach Content URL項中設定。Nexus支持的URL有如下三個:

  • http://links.sonatype.com and https://links.sonatype.com
  • http://download.sonatype.com and https://download.sonatype.com
  • http://sonatype-download.global.ssl.fastly.net and https://sonatype-download.global.ssl.fastly.net
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章