六、nexus創(chuàng)建私服

微笑面對每一天,耶!!!咳咳下面的同學(xué)不要講話啦,開始上課啦

study.jpg

這一章,我們來講講私服的知識,私服是maven的重要組件,但它并不是maven內(nèi)部的核心概念,它僅僅是一種衍生出來的特殊maven倉庫
在前面的章節(jié)中已經(jīng)提到,使用私服可以起到如降低中央倉庫負(fù)荷,節(jié)省外網(wǎng)帶寬,加速maven構(gòu)建,自己部署構(gòu)建等作用
maven私服種類很多,流行的也有幾個(gè),但這里我就不一一做講解了,下面將主要對nexus私服做詳細(xì)介紹,其他私服的功能和nexus也是相似的,有機(jī)會可以自己下去了解一下
nexus是一款不錯(cuò)的倉庫管理軟件,這里主要對nexus進(jìn)行講解

nexus安裝

  1. 下載nexus壓縮包(基于windows系統(tǒng))
    需要到官網(wǎng)下載nexus私服壓縮包,這里需要注意的一點(diǎn)是下載的壓縮包一定要是archive版的,因?yàn)?code>professional版需要提供一個(gè)License,下面是下載地址
    https://support.sonatype.com/hc/en-us/articles/218238798
    雖然現(xiàn)在nexus已經(jīng)發(fā)布到3x版本了,但是我還是比較喜歡用2xextjs界面,所以這里我下載的是2.14版本的nexus oss
  2. 安裝nexus服務(wù)
    將下載的壓縮包解壓到指定目錄,解壓后共有兩個(gè)文件夾
    圖片1.png

    nexus-2.14.3-02該目錄包含了nexus運(yùn)行所需的文件,比如啟動(dòng)腳本,依賴等
    sonatype-work該目錄是運(yùn)行時(shí)目錄,用于生成運(yùn)行時(shí)所需要的配置文件,日志文件倉庫文件等
    nexus-2.14.3-02該目錄包含了nexus運(yùn)行所需的文件,比如啟動(dòng)腳本,依賴等
    sonatype-work該目錄是運(yùn)行時(shí)目錄,用于生成運(yùn)行時(shí)所需要的配置文件,日志文件倉庫文件等
    通過管理員命令行工具進(jìn)入到nexus安裝目錄/nexus-2.14.3-02/bin執(zhí)行
    nexus.bat install 安裝系統(tǒng)服務(wù),完成后執(zhí)行nexus.bat start命令啟動(dòng)nexus服務(wù),或者在服務(wù)管理界面(win+R調(diào)出運(yùn)行面板->services.msc進(jìn)入windows服務(wù)控制臺),這時(shí)可以在控制臺中看到nexus服務(wù)已經(jīng)生成
    圖片2.png

    當(dāng)然nexus.bat其中提供了幾個(gè)常用的命令
    install安裝nexus服務(wù)
    uninstall卸載nexus服務(wù)
    start啟動(dòng)nexus服務(wù)
    stop停止nexus服務(wù)
    restart重啟nexus服務(wù)
  3. 登錄到nexus控制臺
    nexus服務(wù)啟動(dòng)完成后,我們可以通過瀏覽器輸入http://localhost:8081/nexus訪問nexus控制臺,可以通過管理員(admin/admin123)用戶登錄到控制臺
    運(yùn)行后,下面將會對控制臺各個(gè)功能模塊進(jìn)行講解,并提供一個(gè)從項(xiàng)目代碼到倉庫的完整配置過程

nexus倉庫與倉庫組(repository)

作為maven的倉庫服務(wù)軟件,倉庫自然是nexus最重要的概念,nexus包含幾種類型的倉庫:代理倉庫,宿主倉庫和倉庫組等
nexus內(nèi)置倉庫
打開nexus控制臺左側(cè)Repositories可以看到maven中已經(jīng)創(chuàng)建了幾種倉庫

圖片3.png

Central該倉庫代理中央倉庫,其策略為release,因此只會下載中央倉庫的發(fā)布版本
Releases這是一個(gè)策略為release的宿主倉庫,用來部署組織內(nèi)部的發(fā)布版本構(gòu)件
Snapshots這是一個(gè)策略為snapshots的宿主倉庫,用來部署組織內(nèi)部的快照版本構(gòu)件
3rd party這是一個(gè)策略為release的宿主倉庫,用來部署無法從遠(yuǎn)程倉庫下載的第三方發(fā)布版本構(gòu)件
Apache Snapshots這是一個(gè)策略為snapshots的代理倉庫,用來專門代理apache maven倉庫的快照版本構(gòu)件
Public Repositories倉庫組將上述所有策略為release的倉庫聚合并通過一致性的地址提供服務(wù),當(dāng)然這里可以配置將倉庫加入到組中
上面的這些倉庫是如何被使用的呢?
舉個(gè)例子,項(xiàng)目X依賴于很多流行的開源類庫如junit,這些構(gòu)件都可以從中央倉庫獲取,因此central代理倉庫就會被用來代理中央倉庫,并從中央倉庫下載指定依賴并緩存到私服中,X項(xiàng)目還依賴了Oraclejdbc驅(qū)動(dòng),由于版權(quán)因素,無法從公共倉庫中獲取,因此公司管理員將其部署到3rd party倉庫中供X使用,X項(xiàng)目的快照版本構(gòu)件成功后會被部署到Snapshots倉庫供其他小組使用,當(dāng)X發(fā)布正式版本的時(shí)候,其構(gòu)件將會發(fā)布到Releases倉庫中,由于X項(xiàng)目用到了很多倉庫,為每一個(gè)倉庫聲明配置又很麻煩,所以可以統(tǒng)一使用倉庫組Public RepositoriesPublic Snapshots Repositories

maven倉庫分類的概念

下圖更直觀的展現(xiàn)了代理倉庫、宿主倉庫、倉庫組他們之間的關(guān)系


maven倉庫間聯(lián)系.png

創(chuàng)建宿主倉庫
點(diǎn)擊左側(cè)Repositories->Add->Hosted Repositories就會出現(xiàn)一個(gè)表單

創(chuàng)建宿主倉庫.png

創(chuàng)建宿主倉庫2.png

Repository Policy屬性,指定倉庫的發(fā)布類型有Snapshot,Release兩種
Deployment Policy屬性,默認(rèn)是Disable Redeploy,也就是不允許部署,如果需要部署則需要改為Allow Redeploy,不然項(xiàng)目發(fā)布時(shí)會報(bào)錯(cuò)
Allow File Browsing屬性,是否允許瀏覽倉庫中的內(nèi)容,一般為true, 每一個(gè)倉庫創(chuàng)建完成后都會有一個(gè)Browse Storage,在其中以樹形方式羅列了當(dāng)前倉庫的存儲文件內(nèi)容
Include in Search屬性,表示是否對該倉庫進(jìn)行索引并提供搜索服務(wù),一般為true
Publish URL屬性,用來控制是否通過url提供服務(wù),如果選false,當(dāng)訪問該倉庫時(shí)會得到http 404 Not Found錯(cuò)誤
Not Found Cache TTL表示當(dāng)一個(gè)文件沒有找到后,緩存這一不存在信息的時(shí)間,默認(rèn)值為1440分鐘內(nèi)(也就是一天),在規(guī)定的時(shí)間內(nèi)如果nexus再次得到該文件的請求,那么它將直接返回不存在信息

創(chuàng)建nexus代理倉庫

創(chuàng)建代理倉庫.png

創(chuàng)建代理倉庫2.png

創(chuàng)建代理倉庫3.png

前面的參數(shù)和宿主倉庫一致,這里我只強(qiáng)調(diào)代理倉庫的一些特定參數(shù)
Remote Storage Location設(shè)置被代理的遠(yuǎn)程倉庫地址
Download Remote Indexes是否下載遠(yuǎn)程倉庫的index索引文件,下載索引后即使倉庫中沒有緩存指定的依賴,也可以在nexus中搜索得到依賴pom
Checksum Policy設(shè)置當(dāng)依賴校驗(yàn)出錯(cuò)時(shí)的處理方式,可以設(shè)置忽略、記錄警告信息,拒絕下載
Artifact Max Age表示構(gòu)件緩存的時(shí)間,對于release版本來說為-1,表示一經(jīng)下載就一直保存,對于snapshots來說,每隔一天就需要重新緩存代理構(gòu)件
Metadata Max Age表示元配置文件的緩存時(shí)間

創(chuàng)建nexus倉庫組

倉庫組創(chuàng)建.png
倉庫組創(chuàng)建2.png

倉庫組并不是一個(gè)實(shí)實(shí)在在存在的東西,而是一個(gè)虛擬出來的東西,它并沒有ReleaseSnapshot之分,倉庫組中包含的倉庫順序決定了倉庫組遍歷所含倉庫的次序,最好將常用的倉庫放在前面

nexus索引與構(gòu)件搜索

nexus中為了能夠?qū)}庫中的構(gòu)件進(jìn)行搜索服務(wù),需要我們將倉庫配置中的Download Remote indexes設(shè)置為true,當(dāng)修改了這個(gè)設(shè)置后,我們可以點(diǎn)擊左側(cè)Scheduled Tasks查看當(dāng)前任務(wù)進(jìn)度情況
當(dāng)完成索引的下載之后,我們可以在倉庫的Browser Storage選項(xiàng)卡中查看當(dāng)前倉庫的索引結(jié)構(gòu),然后我們就可以在左側(cè)導(dǎo)航欄的Archive Search輸入框中搜索我們需要的構(gòu)件了

倉庫搜索.png

倉庫搜索.png

nexus提供了幾種搜索方式,常用的如keyword search, GAV Search(用戶通過設(shè)置groupidartifactId,version)進(jìn)行搜索操作

倉庫搜索.png

部署構(gòu)建到nexus私服中

nexus提供了兩種方式將構(gòu)建部署到私服中,一種是通過maven自動(dòng)部署,需要借助distributeMangement,另一種是直接上傳jar包
通過distributeManagement自動(dòng)部署構(gòu)件
在日常開發(fā)中,我們可以將項(xiàng)目的snapshot發(fā)布到項(xiàng)目snapshot倉庫中,發(fā)布版發(fā)布到release倉庫中,這需要在項(xiàng)目pom中做一些手腳
下面是mvn-study項(xiàng)目的配置

<distributionManagement>
  <repository>
    <id>mvn-study-releases</id>
    <name>Mvn Study Project Release Repository</name>
    <layout>default</layout>
    <url>http://localhost:8081/nexus/content/repositories/mvn-study-releases/</url>
  </repository>
  <snapshotRepository>
    <id>mvn-study-snapshots</id>
    <name>Mvn Study Project Releases Repository</name>
    <layout>default</layout>
    <url>http://localhost:8081/nexus/content/repositories/mvn-study-snapshots/</url>
  </snapshotRepository>
</distributionManagement>

如果給定的倉庫設(shè)置了訪問權(quán)限,比如mvn-study該項(xiàng)目建立的snapshot,只有mvn-study-deployer角色有操作權(quán)限,所以我們還需要為其添加權(quán)限,這需要在.m2/settings.xml中添加訪問權(quán)限:

<server>
      <id>mvn-study-releases</id>
      <username>zhenlian</username>
      <password>123456</password>
    </server>
    <server>
      <id>mvn-study-snapshots</id>
      <username>zhenglian</username>
      <password>123456</password>
    </server>

手動(dòng)上傳jar包到倉庫

這是比較傳統(tǒng)的一種方式,比如我們在公共倉庫中無法找到的第三方依賴,可以通過此方法上傳到私服中,maven3中,只有release倉庫允許用戶上傳依賴
在倉庫的配置項(xiàng)中,有一個(gè)artifact upload選項(xiàng)頁

手動(dòng)上傳構(gòu)建.png

我們需要添加GAV Definition,也就是當(dāng)前jar的坐標(biāo)信息,然后上傳給定的依賴jar

nexus權(quán)限管理

在組織中使用nexus往往會有一些權(quán)限要求,例如只有管理員才能配置nexus,只有某些團(tuán)隊(duì)成員才能部署構(gòu)件

nexus訪問控制模型

nexus是基于權(quán)限(privileges)做訪問控制的, 服務(wù)器的每一個(gè)資源都有相應(yīng)的權(quán)限來控制,這些權(quán)限的分發(fā)又是通過角色來實(shí)現(xiàn)的,用戶可以被賦予多個(gè)角色,角色也可以配置多個(gè)權(quán)限,角色同時(shí)還可以包含其他角色

權(quán)限管理

nexus默認(rèn)創(chuàng)建了三個(gè)用戶:
admin擁有對nexus的完全控制,密碼為admin123
deployment可以對倉庫內(nèi)容瀏覽、搜索、上傳、部署,但是無法配置nexus
anonymous只能瀏覽和搜索倉庫,但是不能下載
nexus中同時(shí)預(yù)定義了一些常用且重要的角色:
UI:Basic UI Privileges包含對nexus界面必須的最基本權(quán)限
UI:Repository Browser包含瀏覽倉庫頁面所需要的權(quán)限
UI:Search包含擁有快速訪問搜索欄以及搜索頁面所需要的權(quán)限
Repo: all repositories(read)給予用戶讀取所有倉庫的權(quán)限
Repo: all repositories(full control)給予用戶完全控制所有倉庫內(nèi)容的權(quán)限

至此nexus的一些常用知識也就介紹完了,下面是一個(gè)實(shí)際項(xiàng)目配置方式講解

項(xiàng)目實(shí)戰(zhàn)

需求:

  1. 設(shè)置所有項(xiàng)目都從私服中下載構(gòu)件(也需要屏蔽對中央倉庫的訪問)
  2. 為項(xiàng)目單獨(dú)創(chuàng)建倉庫 release,snapshot版本分別對應(yīng),同時(shí)只允許該項(xiàng)目小組的人員對該項(xiàng)目倉庫有操作權(quán)限
    解決方式:
  3. nexus控制臺添加Public All Repositories分組,將包含所有Release/Snapshot倉庫,主要是為了后面鏡像轉(zhuǎn)發(fā)所有請求,同時(shí)為項(xiàng)目創(chuàng)建Release,Snapshot倉庫
創(chuàng)建項(xiàng)目倉庫.png
  1. 項(xiàng)目pom中配置部署信息,主要是為了方便部署項(xiàng)目到nexus
<distributionManagement>
    <repository>
      <id>mvn-study-releases</id>
      <name>Mvn Study Project Release Repository</name>
      <layout>default</layout>
      <url>http://localhost:8081/nexus/content/repositories/mvn-study-releases/</url>
    </repository>
    <snapshotRepository>
      <id>mvn-study-snapshots</id>
      <name>Mvn Study Project Releases Repository</name>
      <layout>default</layout>
      <url>http://localhost:8081/nexus/content/repositories/mvn-study-snapshots/</url>
    </snapshotRepository>
  </distributionManagement>
  1. 設(shè)置maven配置文件settings.xml,屏蔽中央倉庫訪問, 將所有請求轉(zhuǎn)發(fā)到私服,并設(shè)置指定倉庫的訪問權(quán)限
<!--設(shè)置項(xiàng)目倉庫訪問權(quán)限,與項(xiàng)目中引用的倉庫對應(yīng)-->
<servers>
  <server>
      <id>mvn-study-releases</id>
      <username>zhenlian</username>
      <password>123456</password>
    </server>
    <server>
      <id>mvn-study-snapshots</id>
      <username>zhenglian</username>
      <password>123456</password>
    </server>
</servers>

<!--將所有請求轉(zhuǎn)發(fā)到私服 -->
<mirrors>
    <mirror>
      <id>nexus</id>
      <name>Local Nexus Mirror</name>
  <url>http://localhost:8081/nexus/content/groups/public-all/</url>
      <mirrorOf> * </mirrorOf>
    </mirror>
</mirrors>

<!--覆蓋對中央倉庫的訪問-->
<profiles>
    <!--這里配置倉庫覆蓋中央倉庫-->
    <profile>
        <id>nexus</id>
        <repositories>
            <repository>
                <id>central</id>
<!--此時(shí)的url已經(jīng)沒用了,因?yàn)檎埱蟊籱irror轉(zhuǎn)發(fā)到私服了-->
                <url>http://central/</url>
                <layout>default</layout>
                <releases>
                    <enabled>true</enabled>
                </releases>
                <snapshots>
                    <enabled>true</enabled>
                </snapshots>
            </repository>
      </repositories>
      <pulginRepositories>
        <pluginRepository>
            <id>central</id>
            <name>Nexus</name>
            <url>http://central</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </pluginRepository>
      </pulginRepositories>
</profile>
</profiles>
<!--啟動(dòng)nexus本機(jī)倉庫-->
 <activeProfiles>
    <activeProfile>nexus</activeProfile>
  </activeProfiles>

這里我要啰嗦兩句,剛開始我在實(shí)際部署項(xiàng)目時(shí)總是遇到Return Code 400Bad Request錯(cuò)誤,檢查了一下倉庫配置,是忽略了在創(chuàng)建Mvn Study Snapshot Repository時(shí)Deployment Policy(Allow Redeploy) Repository Policy(Snapshot)
好了,今天就到這里啦,0:47,又搞到這么晚,趕緊睡覺為明天黑色周五做準(zhǔn)備!!!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容