1. 程式人生 > >使用Nexus3搭建Maven私服

使用Nexus3搭建Maven私服

 

1.搭建Maven私服背景

公司還是按捺不住,要搭建一個自己的Maven本地倉庫,可以讓開發人員down架包,從內網還是快很多。

這樣公司的maven本地倉庫就是 開發人員自己電腦上的maven倉庫  和    Maven遠端倉庫  之間的一個緩衝倉庫。

 

那要構建一個maven私服,需要用到Maven倉庫管理軟體,關於Apache Archiva,Artifactory,Sonatype Nexus的區別,有下面這些的參考對比:

http://blog.sina.com.cn/s/blog_72ef7bea0102vq0k.html

http://www.sonatype.org/nexus/2015/02/23/migrating-from-artifactory-archiva-or-a-raw-maven-repository-to-sonatype-nexus/

 

 

2.安裝Nexus,並初次啟動Nexus

這裡我們下載開源版 Nexus OSS。Nexus 提供兩種安裝包,一種是包含 Jetty 容器的 bundle 包,另一種是不包含容器的 war 包。下載地址:http://www.sonatype.org/nexus/go

這裡先以windows上為例【Linux上之後再來一份】

 

在你點選下載之後,會有Read THE BOOK 的入口和加入NENUX社群的入口。

這裡直接給你ReadTheBook的地址:https://help.sonatype.com/display/NXRM3

這裡你可以找到官方提供的完整安裝和使用教程。【因為這裡使用的是Nexus3的版本,和參考文章中不大一致】

 

下載的壓縮包解壓下來

 

然後cmd,命令視窗進入nexus-3.5.2-01目錄下的bin目錄下,按照官方的啟動方式,需要在bin目錄下使用nexus /run命令啟動,如下圖

確認之後,下面會打印出來啟動的相關資訊,接下來,耐心等待它啟動完成。

直到出現下面這個,才算啟動完成。

 

 

初次啟動之後,你可以在瀏覽器上訪問nexus這個maven管理器

地址:http://localhost:8081/

當然,你可以使用預設的使用者登入。

使用者名稱:admin

密碼:admin123

 

此時,觀看命令視窗,會有記錄相關的操作記錄。

 

 

 3.將nexus配置為系統服務

根據官方文件說明,將nexus配置為系統服務是一個很好的選擇。因為

第一:上面的安裝和啟動過程並沒有預設的把nexus作為服務加入系統服務中;

第二:這樣下次伺服器重啟,服務也會重啟。

但是這個有個前提,就是已經確保安裝了Java執行時環境。

 

 

接下來,我們重新開啟一個視窗,去將nexus加入系統服務  

最後的<optional-service-name>,咱們直接命名成nexus就好。【當然,最後這個不指定的話,預設就是建立成nexus服務名】

在windows7上安裝nexus為系統服務時,報錯:could not open SCManager 

但是報錯如下:

 

解決方法:

 

然後再次執行

如果再解決不了,那就在

直接以管理員身份執行這個命令提示符,然後安裝服務。

 

顯示安裝成功之後,可以進入控制面板---》管理工具---》服務  

查詢名為nexus的服務

 

你可以選擇,點選上面的啟動按鈕啟動服務,也可以用下面的命令啟動服務

【當然,可以在上面配置啟動引數,這個之後再去檢視配置】

 

 

啟動完成之後,試著訪問一下http://localhost:8081/

 

因為上面服務是自動的。

重啟電腦之後,再次訪問,可以訪問到,完美。

 

 

4.配置nexus和熟悉它

第一步,跟隨著說明文件,看看下載nexus下來之後,有兩個目錄

nexus-3.5.2-01    安裝目錄

bin    包含nexus的啟動指令碼和相關配置      

etc    jetty、karaf等配置檔案

jre    jre環境

lib    java架包庫

public  關於nexus應用在本地跑起來所需要的資源

system  應用所有的外掛和元件

LICENSE.txt 和 NOTICE.txt    版權宣告和法律細則

 

sonatype-work\nexus3    資料文件

blobs/      建立blob的預設路徑,如果你指定了絕對路徑,那就不在這裡了

cache/      當前快取的karaf包的資訊

db/        OrientDB資料庫的資料,用於儲存nexus的元資料的資料庫

elasticsearch /    當前配置的Elasticsearch狀態

etc/          大概是執行時配置狀態和關於資源庫的自定義的相關的東西

health-check/      看目錄,健康檢查的相關報告的儲存目錄吧

keystores/        自動生成的關於資源庫的ID主鍵

log/            執行例項生成的日誌檔案,也有日誌檔案的壓縮包,貌似是每天都會生成日誌檔案,你可以定期刪除老的日誌檔案

tmp/            用於儲存臨時檔案的目錄

 

具體每個目錄下的各個配置檔案的作用,請參考官方文件說明:https://help.sonatype.com/display/NXRM3/Installation

 

如果你想配置nexus的應用在本地啟動的JVM引數,可以在nexus.vmoptions

 

如果你想改變nexus的埠號,可以在nexus-default.properties

 

 

5.搭建maven私服資源庫

由於現在使用的nexus3,所以在nexus應用上資源庫初始化目錄和nexus2有很大的不同,但是型別都是一樣的。

第一步:首先http://localhost:8081/

登入上nexus,未登入的狀態下是這樣的。

使用預設使用者名稱admin密碼admin123登入後,如下

 

第二步:使用nexus3要搭建maven私服的核心功能

在nexus安裝並啟動之後,我大概的把整個nexus的官方說明文件走了一遍,主要就是介紹了左側選單中的各個功能模組。https://help.sonatype.com/display/NXRM3/Configuration

有興趣去看看,還是很有幫助的。

====================================================================================================================

-------------------------------------------------------------------------------------普及-----------------------------------------------------------------------------------------------------------------

上面提到的一點,不管nexus版本是怎麼樣的,至少,repository的型別是一樣的。

先看一下大概的目錄結構:

根據多方的文件和別人的部落格,再綜合官網的解釋,我就這樣理解得出:

資源庫也就是這麼三種,如上圖中  【代理資源庫】【託管資源庫】【組資源庫】,其實名字就是我自己瞎起的。

具體解釋一下:

【代理資源庫】:就是配置了外網的maven遠端倉庫地址的資源庫,本地找不到,就會通過代理資源庫中的地址,找到遠端倉庫,從遠端倉庫中下載所需要的jar。

【託管資源庫】:就是放在本地的資源庫,零零散散的jar,從遠端倉庫中下不到,只能自己在網上找,找到jar下載下來,放在託管資源庫中,交給nexus統一管理。不然哪天想去用連線資料庫的jar包,還得自己翻磁碟,多麻煩。

【組資源庫】 :從上面①+②看出來,其實組資源庫中並沒有jar包,而是把代理資源庫和託管資源庫統一配置到組資源庫中,然後組資源庫作為一個唯一的public提供給所有人使用。就像工人1+工人2把自己的賬單統一給包工頭,讓包工頭去跟老闆結賬是一個道理。

 

好,明確了這一點,開始往下看吧。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

如果你想直入主題,往下看。

①在建立 repository之前,還是需要先設定一個指定的檔案儲存目錄,便於統一管理。

 由下面新建的完成的,可以看出,

 

 

②第二步,建立Proxy Repository  代理資源庫

建立頁面出來之後,頁面上有三個input框是必填的:

 遠端Maven地址:https://repo1.maven.org/maven2/

 

其他的不用更改了。儲存就好了。

 

【注意】:我想建好幾個proxy repository,以便於我可以加入更多的遠端maven倉庫到我的group 資源庫中

唯一一點,就是你看你加入的proxy資源庫哪個使用的是國內的maven倉庫地址,哪個是國外的。

當然國內的要放在國外的之前。

這樣的加入group資源庫的順序就是  hosted資源庫>國內proxy資源庫>國外proxy資源庫

下面給出一些maven遠端倉庫的地址:

jboss的maven中央倉庫地址:http://repository.jboss.com/maven2/

阿里雲的maven中央倉庫地址:http://maven.aliyun.com/nexus/content/groups/public/

apache的maven中央倉庫地址:http://repo.maven.apache.org/maven2/

 

 

 

③第三步,建立hosted repository 託管資源庫

Hosted有三種方式,Releases、SNAPSHOT、Mixed
Releases: 一般是已經發布的Jar包
Snapshot: 未釋出的版本
Mixed:混合的

 

 

④第四步,建立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。這樣訪問外網的消耗比起來在本地查詢,當然是將託管資源庫放在代理資源庫之前的優先位置了。

 

 

⑤第五步,比較nexus中預設提供的

好吧,從命名上也可以看出來,系統自帶的命名可以看出來這個資源庫是什麼型別中的什麼型別的。【沒有建立未釋出的資源庫,那以後咱們自己想去建立的,自行建立,再加入到group中就行了】

 

如果你想,可以自己去建立一個新的admin,新的使用者名稱,新的密碼,新的許可權。供下面使用。

 

6.讓maven專案用到剛剛搭建的maven私服

==========================================================個人理解===============================================================

maven下的setting.xml檔案和你自己專案中的pom.xml檔案的關係:

    Ⅰ.settting.xml檔案就是本地,電腦上的全域性變數;而pom.xml檔案就是區域性變數。

    Ⅱ.自己建立的pom.xml檔案肯定對於專案來說,優先使用的。然而pom.xml檔案中如果沒有指定jar要從哪裡下載的話,也就是說沒有配置映象地址的話,當然只能去按照全域性變數中定義的地址去找了

    Ⅲ.那怎麼去找咱們的全域性變數呢?其他人可能是直接在pom.xml檔案中配置指定的方式。我是使用的IDE【編譯工具】中直接指定確定的setting.xml檔案,這樣在pom.xml檔案中沒有的情況下,我的IDE就按照設定的去找對應的setting.xml檔案去。

 

 

【注意】:有一點要注意的就是,maven如果是你自己下載的,那裡面肯定會有一份setting.xml檔案。什麼都不配置的話,它全部都是按照預設值去幹的,例如本地倉庫它預設的就是放在使用者/.m2/資料夾下的。

【忠告】:在修改setting.xml檔案之前,先備份一份原始的。個人感覺裡面的註釋是非常有參考價值的。

 

下面開始解釋具體的詳細步驟:

 

最簡單的使用方式:

①在原始的setting檔案中加入

拷貝的這個地址,就是下面即將在setting.xml檔案中新增時使用的。可以對應下面的setting.xml檔案中看。

  <!--就是配置maven本地倉庫的地址為自定義的地址-->
  <localRepository>D:\apps\repository</localRepository>
  <!--nexus伺服器-->
  <servers>  
    <server>  
        <id>nexus</id>  
        <username>admin</username>  
        <password>admin123</password>  
    </server>   
  </servers>  
  <!--組資源庫的url地址  id和name自定義,mirrorOf的值設定為central,寫死的-->  
  <mirrors>     
    <mirror>  
        <id>nexus</id>  
        <name>nexus repository</name>  
        <url>http://localhost:8081/repository/myself_group/</url>  
        <mirrorOf>central</mirrorOf>  
    </mirror>     
  </mirrors>  

 

②按照http://www.cnblogs.com/sxdcgaq8080/p/7580964.html教程,把IDE指定為這個setting.xml檔案即可。

 

③在新建的maven專案中的pom.xml檔案中,新增一個原本本地倉庫中沒有下載過的架包【新建maven專案的過程:http://www.cnblogs.com/sxdcgaq8080/p/5586644.html】

 

你自己的專案中pom.xml檔案並不需要改變什麼東西,以前怎麼用,現在還怎麼用。

例如下面:

這是我新建的一個maven專案

 

 pom.xml檔案中

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.sxd.testP</groupId>
  <artifactId>mavenProject</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  <build>
      <plugins>
          <plugin>
              <artifactId>maven-war-plugin</artifactId>
              <configuration>
                  <version>3.1</version>
              </configuration>
          </plugin>
      </plugins>
  </build>
  
  <!-- 這一段是新新增的,這一段之外的都是建立maven專案時,它自己生成的pom.xml檔案框架 -->
  <dependencies>
      
        <!-- junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.18</version>
            <scope>provided</scope>
        </dependency>
        
  </dependencies>
  
  <!-- 這一段結束 -->  
  
</project>

 

然後儲存pom.xml檔案之後,

在本地倉庫中

 

 這個就算你不建私服,只要指定了本地倉庫自定義的地址,一般都會下載成功的。

 

下面看看私服中是否有這個東西

http://localhost:8081/    admin、admin123登入進入[不登陸也可以搜尋,這看你自己會給遊客這種角色分配什麼樣的許可權了]

點開檢視:

點進入jar包的這個概要資訊

 

 

查詢發現,後面的那一串應該類似於UUID的字串 可以查詢到  

原來nexus把下載下來的所有檔案都轉化成了byte檔案。這也難怪在上面建立

是使用的blob這個單詞。二進位制的意思吧!!!

 

 

 

 

 

=========================================================================================================================================

至此,maven私服搭建,以及使用maven專案使用maven私服已經全部連通。

如果想看詳細的配置的話,可以在GitHub上檢視:https://github.com/sonatype/nexus-book-examples

=========================================================================================================================================

7.使用命令上傳第三方jar到nexus

 

最後的最後,就是還有一部分,咱們沒有走。

使用nexus2的話,可以在介面上直接上傳第三方的jar到上建立的hosted資源庫,也就是託管資源庫中。

可是nexus3在頁面我愣是找了半天也沒有找到。同時官方的說明文件我查了一半,貌似也沒有發現。所以,頁面上既然沒有這個功能,就只能自己使用命令上傳第三方jar到nexus了。

 

示例:

上傳一個處理word的jar包到nexus上。

jar包為jacob

我們先在nexus上搜索一下:下面是搜不出來的

 

 

步驟1:

把hosted資源庫,也配置到maven的settting.xml檔案中

新增下面:

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

到目前為止,我的settting.xml檔案也就是下面這些東西

 

 

 步驟2:

 使用

以下命令

mvn deploy:deploy-file -DgroupId=sxd.jar -DartifactId=jacob -Dversion=1.18 -Dpackaging=jar -Dfile=G:\jar\jacob-1.18.jar -Durl=http://localhost:8081/repository/myself_hosted/ -DrepositoryId=myself_hosted

命令解釋:

-DgroupId=sxd.jar                           自定義
-DartifactId=jacob                          自定義
-Dversion=1.18                            自定義  三個自定義,構成pom.xml檔案中的座標
-Dpackaging=jar                           上傳的型別是jar型別
-Dfile=G:\jar\jacob-1.18.jar                   jar的本地磁碟位置
-Durl=http://localhost:8081/repository/myself_hosted/    hosted資源庫的地址,下圖中
-DrepositoryId=myself_hosted                   setting.xml檔案中配置的ID

 

 

 

 上傳完成,再nexus中檢視一下:

 

 

上傳成功!!!

步驟3:

在專案的pom.xml檔案中引入一下jar包

     <dependency>
            <groupId>sxd.jar</groupId>
            <artifactId>jacob</artifactId>
            <version>1.18</version>
            <scope>provided</scope>
        </dependency>

儲存pom.xml檔案。

這下,發現maven下已經引入成功。並且已經將這個jar包放入本地maven倉庫了。

 

完全成功了。