天天看點

Android Studio +Nexus搭建Maven私服

Nexus概述

Nexus是一個基于maven的倉庫管理的社群項目.主要的使用場景就是可以在區域網路搭建一個maven私服,用來部署第三方公共構件或者作為遠端倉庫在該區域網路的一個代理.簡單舉幾個例子就是:

  1. 第三方jar包可以放在nexus上,項目可以直接通過Url和路徑配置直接引用.友善進行統一管理.
  2. 同時有多個項目在開發的時候,一些共用基礎子產品可以單獨抽取到nexus上,需要用的項目直接從nexus上拉取就行(基礎子產品的實作,維護和部署可以交給專門的人員,其他項目不用關心代碼實作,這樣也可以達到保證核心代碼不洩露).
  3. 一些封閉開發的過程中開發機是不能上公網的,是以連接配接central repository和下載下傳jar就比較麻煩,這時就可以用nexus搭建起來一個介于公網和區域網路之間的橋梁。

開始搭建

1.下載下傳sonatype nexus oss

這裡使用的是Nexus OSS開源版,官網下載下傳位址:http://www.sonatype.org/nexus/go/ 建議安裝3.x以上的版本,安裝2.x的版本需要進行一大堆配置,具體配置可自行去谷歌或百度,以下使用僅針對3.x版本

2.安裝并運作sonatype nexus oss

首先确認伺服器上是否已經安裝JDK,nexus oss的運作需要JDK7或者JDK8。如果沒有安裝JDK,請先安裝JDK。 下載下傳下來的nexus oss是一個zip或者tar.gz壓縮包,需要将其解壓。你可以将其解壓到任何位置,nexus oss的運作對其所在位置沒有什麼特殊要求。解壓後會看到兩個檔案夾,一個是nexus-x.xx.x-xx,一個sonatype-work。其中nexus-x.xx.x-xx是nexus oss的主目錄,所有運作程式和配置檔案都在裡面。sonatype-work是nexus-oss的資料目錄,nexus-oss運作過程的maven倉庫資料都在這裡面。進入nexus-x.xx.-x-xx/bin目錄,window平台的伺服器直接通過指令行 nexus.exe /run 運作nexus.bat腳本就可以了.

3.配置sonatype nexus oss

運作成功之後,在浏覽器打開http://localhost:8081/nexus就可以看到nexus oss的控制台。其中localhost為目前伺服器ip,端口Nexus預設為8081,進入web管理頁面後右上角登陸,Nexus預設的賬号密碼是admin:admin123。登入後可以看到以下界面:

Android Studio +Nexus搭建Maven私服

進入設定後,點選左側的repositories檢視現有的倉庫清單. 

Android Studio +Nexus搭建Maven私服

每個倉庫都有自己的屬性,選擇一個倉庫就可以檢視這個倉庫的一些具體資訊。我們的目的主要是把我們的項目代碼釋出到這些倉庫裡去,既然要釋出到這些倉庫上去,我們就不想我們的代碼外洩出去,那我們就要選擇hosted類型的倉庫,hosted類型是Nexus oss所在自己本地的伺服器上的倉庫,比較安全。我們進行操作的時候,最主要的還是maven-releases和maven-snapshots兩個倉庫,兩個倉庫有Deployment Policy部署協定上的差別,一個是,maven-releases上的是Disable Redeploy(不允許重複部署),意思就是部署上去的就是正式版本的庫,如果之後更新lib隻能以更新版本号的形式操作。而maven-snapshots則是Allow Redeploy(允許重複部署),顧名思義,就是不需要更新版本号,隻要groupId,artifactId,version相同就可以進行覆寫,一般用于你的module還沒進行完全測試的時候。如要上傳至maven-snapshots倉庫,需要在VERSION_NAME增加SNAPSHOT關鍵字,如

VERSION_NAME = 0.0.1-SNAPSHOT
           

4.配置庫并上傳

首先建立一個Android項目,然後new module,在module的bulid.gradle裡添加下面配置:

apply plugin: 'maven'

def isReleaseBuild() {
    return VERSION_NAME.contains("SNAPSHOT") == false
}
def getRepositoryUsername() {
    return hasProperty('NEXUS_USERNAME') ? NEXUS_USERNAME : ""
}
def getRepositoryPassword() {
    return hasProperty('NEXUS_PASSWORD') ? NEXUS_PASSWORD : ""
}
afterEvaluate { project ->
    uploadArchives {
        repositories {
            mavenDeployer {
                pom.groupId = GROUP
                pom.artifactId = POM_ARTIFACT_ID
                pom.version = VERSION_NAME
                repository(url: RELEASE_REPOSITORY_URL) {
                    authentication(userName: getRepositoryUsername(), password: getRepositoryPassword())
                }
                snapshotRepository(url: SNAPSHOT_REPOSITORY_URL) {
                    authentication(userName: getRepositoryUsername(), password: getRepositoryPassword())
                }
            }
        }
    }
    task androidJavadocs(type: Javadoc) {
        source = android.sourceSets.main.java.srcDirs
        classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
    }
    task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) {
        classifier = 'javadoc'
        from androidJavadocs.destinationDir
    }
    task androidSourcesJar(type: Jar) {
        classifier = 'sources'
        from android.sourceSets.main.java.sourceFiles
    }
    artifacts {
        archives androidSourcesJar
        archives androidJavadocsJar
    }
}
           

然後在該module目錄下添加grade.properties配置檔案:

GROUP=對應maven的groupId值,如果名字中包含SNAPSHOT字元,項目将會釋出到snapshots倉庫,沒有則釋出到releases倉庫  
VERSION_NAME=對應maven的version值  
POM_ARTIFACT_ID=對應maven的artifactId值  
  
SNAPSHOT_REPOSITORY_URL=前面配置的snapshots倉庫位址  
RELEASE_REPOSITORY_URL=前面配置的releases倉庫位址  
  
NEXUS_USERNAME=登入nexus oss的使用者名  
NEXUS_PASSWORD=登入nexus oss的密碼
           

修改完之後,在AndroidStudio右邊的Gradle面闆中找到對應的module,然後在upload裡有一個uploadArchive選項,輕按兩下就可以了,然後就build success了.

5.引用

私有庫上傳成功以後,我們就可以在所有項目中直接引用這個私有庫了。引用的方法很簡單,在項目的build.gradle裡allprojects下添加:(ip是我自己的内網伺服器位址)

maven {
            url 'http://192.168.1.116:8081/repository/maven-releases/'
        }
           

然後就可以在app目錄下build.gradle裡直接compile就可以了

compile 'com.ztemap.app.mydemolib:mytestlib:0.0.2'
           

注:

1.常見的GBK編碼,javadoc報錯。在項目根目錄下的build.gradle下添加以下配置

allprojects {
    repositories {
        jcenter()
    }
    tasks.withType(Javadoc) {
        options.addStringOption('Xdoclint:none', '-quiet')
        options.addStringOption('encoding', 'UTF-8')
    }
}