maven私服搭建及gradle上傳

本次的搭建是在ubuntu系統上進行的,windows搭建過程相似。html

軟件準備

這次搭建咱們用到了JDK及nexus(sonatype的軟件,不是google的手機)java

  • JDK (我用的版本所1.7.0_76)
  • NEXUS (我用的所nexus-2.12.0-01,在官網下載便可,我下載了nexus-2.12.0-01-bundle.zip 去官網下載 )

安裝過程

JDK的安裝 :android

這個我就不寫了,一搜一大堆。可參考文章git

NEXUS安裝:github

  1. 把下載的nexus-2.12.0-01-bundle.zip放到/usr/local目錄下(你也能夠放到其它目錄)
  2. 爲了減去沒必要用的麻煩,我建議如今開始使用你的su權限。
    命令行:sudo su
    會讓你輸入密碼確認,確認後進入超級權限。
  3. 解壓壓縮文件。
    命令行:unzip nexus-2.12.0-01-bundle.zip 
    解壓文件獲得 nexus-2.12.0-01文件及sonatype-work文件夾。咱們如今只關心nexus-2.12.0-01文件夾。ubuntu

    存放位置-超級命令-解壓.jpgwindows

  4. 軟鏈接
    爲了操做方便,咱們給這個比較長名字的文件夾建個軟鏈接(比如所Windows的快捷方式),
    命令行: ln -s nexus-2.12.0-01 nexus2
  5. 運行nexus
    咱們進入到nexus2指向的文件夾下
    命令行:cd nexus2 
    啓動nexus
    命令行:./bin/nexus start
    失敗了,沒運行起來。如圖,好糾結,一面讓咱們run as root,一面又不建議咱們這樣。瀏覽器

    軟鏈接-運行須要root提示.jpg服務器

  6. 設置RUN_AS_USER=root
    那咱們按照它的指示設置RUN_AS_USER=root
    命令行:vi ./bin/nexusapp

    vi設置run_as_root.jpg

    VI編輯器不熟悉的話,能夠用你熟悉的方式修改,不會不丟人- -!

  7. 再次運行啓動命令
    若是看到命令行提示了Started Nexus OSS,說明咱們成功了。
    訪問下試試:http://localhost:8081/nexus/ 如圖,咱們已經成功運行。

    提示run_as_root-成功運行.jpg

    成功運行.jpg

    我遇到一個狀況是這樣的,已經提示我「Started Nexus OSS」。可是瀏覽器訪問不到。這時我嘗試再次使用命令啓動nexus。仍然提示我「Started Nexus OSS」。若是你也遇到這種狀況就注意了,如今是有問題的,服務沒起來。若是起來了,再次啓動會提示「Nexus OSS is already running.」我通過排查發現是由於我係統的JAVA環境不對,沒有裝Oracle的JDK,而是使用了自帶的OpenJDK(具體版本忘了,特別聲明,有的OpenJDK版本是可讓nexus正常運行的),那你就去裝下Oracle的JDK吧。

配置

  1. 點擊右上角的"Log In",默認用戶名密碼所admin/admin123。
  2. 登陸後,點擊右側菜單欄Views/Respositories->Respositories,將會看到下圖幾個倉庫。

    默認的倉庫-步驟2.jpg

  3. 咱們能夠看到這些倉庫的類型有:group、hosted、proxy、virtual。
    hosted,本地代理倉庫,一般咱們會部署本身的構件到這一類型的倉庫。
    proxy,代理的遠程倉庫,它們被用來代理遠程的公共倉庫,如maven中央倉庫。
    group,倉庫組,用來合併多個hosted/proxy倉庫,一般咱們配置maven依賴倉庫組。
    virtual,這種是maven1的,之後基本不會用到或者不多會用到,因此不用過多理會。

    我這裏並無打算講怎麼新建倉庫,由於nexus提供的這幾個倉庫對於簡單使用已經能夠了。

  4. 下面咱們先來配置一下Central倉庫:
    a.修改Download Remote Indexes選項爲True(容許下載遠程倉庫的索引)
    b.在Central倉庫上右擊,選擇Repair Index(代理倉庫會去下載遠程倉庫的索引,方便搜索)
    c.片刻以後咱們在倉庫下方的詳細信息處點擊Browse Index 能夠看到有個文件夾 Central,前方有個加號能夠打開,若是沒有信息,說明尚未下載下來,或者下載失敗了。你能夠選擇等一等,或者在最右側的菜單欄選擇Administration->Logging,查看運行信息,可能對你有幫助。

    容許下載索引-更新索引-步驟4.jpg

    有的時候你確實須要等一等,由於我遇到過,怎麼也沒有索引下載下來,大概我吃了午餐回來,發現它本身下載好了。

  5. 同步驟4同樣來配置Apache Snapshots
    這裏爲咱們能夠看到倉庫policy有Releases、Snapshots兩種。
    Snapshot 表明不穩定、尚處於開發中的版本。
    Release 表明穩定的版本

    如今你能夠嘗試在右側菜單欄的搜索框嘗試搜索內容。若是你的proxy倉庫成功的下載了索引,咱們嘗試搜索okhttp(你也能夠換個關鍵字)你將會看到以下面的畫面

    搜索效果-步驟5.jpg

  6. 自帶倉庫Releases、Snapshots就是爲咱們準備的上傳咱們本身lib文件的倉庫,因此就沒必要新建其它倉庫了

  7. 配置倉庫組Public Repositories。以下圖配置好後,千萬要點save進行保存。

    倉庫組與倉庫就像咱們android開發中ViewGroup 與 View的關係。自己包含其餘倉庫,對外又像倉庫同樣使用。

    Public Repositories庫配置-步驟7.jpg

8.新建SnapShots倉庫組。點擊Add->Repository Group。會在下方倉庫區新生成一個「New Repository Group」。咱們像下方圖: snapshots配置-步驟8.jpg 那樣對它進行配置。

新建庫組.jpg

snapshots配置-步驟8.jpg

使用咱們的倉庫

在咱們項目的主build.gradle中修改allprojects的maven地址:

allprojects {    
       repositories {        
              //jcenter()        
              maven {url "http://ip:8081/nexus/content/groups/PublicSnapshots/"}    
       }
}

"sync now"一下,如今咱們的工程配置的依賴就已經使用咱們本身搭建的私有倉庫了。

各庫地址URL.jpg

上圖中Public Snapshots庫對應的Respository Path就是咱們上方替換默認maven庫地址的私庫地址。下面Releases、Snapshots庫地址就是咱們下節 發佈到私服 上傳腳本中本身的lib庫要發佈到的倉庫地址。

發佈到私服

接下來,咱們將在Android Studio環境下,來發布咱們本身的庫文件
1.在咱們的工程下新建一個lib,我這就叫likelib吧。
2.在主項目下新建一個maven_push.gradle來寫咱們的發佈到maven庫的腳本

// The Maven plugin adds support for deploying artifacts to Maven repositories.
// 一個可讓你把庫上傳到maven倉庫的插件
apply plugin: 'maven'
// The signing plugin adds the ability to digitally sign built files and artifacts. These digital signatures can then be used to prove who built the artifact the signature is attached to as well as other information such as when the signature was generated.
// 對庫文件進行數字簽名的插件,能夠經過簽名知道誰建立了這個庫文件,簽名的時間等等信息
apply plugin: 'signing'

// 聲明變量記錄maven庫地址
def mavenRepositoryUrl
// 判斷是發佈到正式庫,仍是snapshots庫
if (isReleaseBuild()) {
    println 'RELEASE BUILD'
    // 下面的庫地址指向的是咱們私有倉庫的Releases 倉庫
    mavenRepositoryUrl = hasProperty('RELEASE_REPOSITORY_URL') ? RELEASE_REPOSITORY_URL
            : "http://IP:8081/nexus/content/repositories/releases/"
} else {
    println 'SNAPSHOTS BUILD'
    // 下面的庫地址指向的是咱們私有倉庫的snapshots 倉庫
    mavenRepositoryUrl = hasProperty('SNAPSHOT_REPOSITORY_URL') ? SNAPSHOT_REPOSITORY_URL
            : "http://IP:8081/nexus/content/repositories/snapshots/"
}
// NEXUS_USERNAME等變量在咱們主項目的gradle.properties中能夠找到
def getRepositoryUsername() {
    return hasProperty('NEXUS_USERNAME') ? NEXUS_USERNAME : ""
}

def getRepositoryPassword() {
    return hasProperty('NEXUS_PASSWORD') ? NEXUS_PASSWORD : ""
}
// 根據咱們在likelib下gradle.properties中聲明的版本名稱,來分辨是Release版本仍是 snapshots版本
def isReleaseBuild() {
    return !VERSION_NAME.contains("SNAPSHOT");
}

//"afterEvaluate是什麼鳥?你能夠理解爲在配置階段要結束,項目評估完會走到這一步。" 引用自http://jiajixin.cn/2015/08/07/gradle-android/
afterEvaluate { project ->
    // 咱們聲明咱們要執行的上傳到maven的task
    uploadArchives {
        repositories {
            mavenDeployer {
                beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }
                // 咱們類比下compile com.squareup.okhttp:okhttp:2.7.0
                // artifactId 對應com.squareup.okhttp; groupId 對應okhttp;version對應2.7.0
                // 這樣就相似座標的方式定位到了制定的庫文件
                pom.artifactId = POM_ARTIFACT_ID
                pom.groupId = POM_GROUP_ID
                pom.version = VERSION_NAME

                // 受權驗證,這裏也就是你登錄搭建的私服服務器時候的用戶名\密碼
                repository(url: mavenRepositoryUrl) {
                    authentication(userName: getRepositoryUsername(), password: getRepositoryPassword())
                }

                // 這裏是配置咱們maven庫須要的pom.xml文件的各個內容,具體意思咱們在主目錄gradle.properties中解釋
                pom.project {
                    name POM_NAME
                    packaging POM_PACKAGING
                    description POM_DESCRIPTION
                    url POM_URL

                    scm {
                        url POM_SCM_URL
                        connection POM_SCM_CONNECTION
                        developerConnection POM_SCM_DEV_CONNECTION
                    }

                    licenses {
                        license {
                            name POM_LICENCE_NAME
                            url POM_LICENCE_URL
                            distribution POM_LICENCE_DIST
                        }
                    }

                    developers {
                        developer {
                            id POM_DEVELOPER_ID
                            name POM_DEVELOPER_NAME
                        }
                    }
                }
            }
        }
    }

    // 進行數字簽名
    signing {
        required { isReleaseBuild() && gradle.taskGraph.hasTask("uploadArchives") }
        sign configurations.archives
    }

    // type顯示指定任務類型或任務, 這裏指定要執行Javadoc這個task,這個task在gradle中已經定義
    task androidJavadocs(type: Javadoc) {
        // 設置源碼所在的位置
        source = android.sourceSets.main.java.sourceFiles
    }

    // 生成javadoc.jar
    task androidJavadocsJar(type: Jar) {
        // 指定文檔名稱
        classifier = 'javadoc'
        from androidJavadocs.destinationDir
    }

    // 生成sources.jar
    task androidSourcesJar(type: Jar) {
        classifier = 'sources'
        from android.sourceSets.main.java.sourceFiles
    }

    // 產生相關配置文件的任務
    artifacts {
        archives androidSourcesJar
        archives androidJavadocsJar
    }
}

3.在主項目下gradle.properties中來聲明咱們運行腳步時須要的信息

# properties for maven2 repository
# nexus服務器登錄時候的用戶名/密碼
NEXUS_USERNAME=admin
NEXUS_PASSWORD=admin123
# 在POM文件中使用的group ID
POM_GROUP_ID=com.exmaple.like
# POM文件中指向你網站的地址
POM_URL=https://github.com/achenglike
# SCM是指版本管理工具,一下說他的相關信息
POM_SCM_URL=https://github.com/
POM_SCM_CONNECTION=https://github.com/achenglike
POM_SCM_DEV_CONNECTION=https://github.com/achenglike
# 你的開放協議相關信息
POM_LICENCE_NAME= Apache License Version 2.0
POM_LICENCE_URL= https://github.com/achenglike/Gallery/blob/master/LICENSE
POM_LICENCE_DIST=Apache License Version 2.0
# 開發者的相關信息
POM_DEVELOPER_ID=achenglike
POM_DEVELOPER_NAME=achenglike

3.在咱們likelib項目下的build.gradle引入咱們的腳本

apply from: '../maven_push.gradle'

4.在咱們likelib項目下新建一個gradle.properties來存咱們須要發佈的版本、格式等信息

# 庫名稱
POM_NAME=Like Library
# artifactId
POM_ARTIFACT_ID=like
# 庫的打包格式爲aar, 常見的還有jar
POM_PACKAGING=aar
# 庫的描述,說明他是幹啥的
POM_DESCRIPTION=like Library
# 要發佈的版本好,snapshots 版本可使用格式 1.0.0-SNAPSHOT
VERSION_NAME=1.0.0

5.咱們如今能夠在android studio的Terminal中來發布咱們的庫文件了 。
輸入命令:gradle uploadArchives
運行結束Terminal會提示成功或失敗,提示成功說明已經上傳到了你的私庫中。

若是沒有意外,咱們已經發布到了咱們的私有倉庫,咱們能夠本身去看看,就像下面的圖。

成功上傳庫文件.jpg

使用

接下來咱們將使用咱們上傳的庫文件
1.在app 模塊的build.gradle中引入依賴

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.2.0'
    compile 'com.android.support:design:23.2.0'
    compile 'com.exmaple.like:like:1.0.0'
}

最下面的庫引用就是咱們剛纔上傳的庫文件

2.咱們在app模塊使用依賴的庫

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, Hello.getInstance().hello(), Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
    }
相關文章
相關標籤/搜索