maven私服搭建及gradle上傳

聲明:文章為原創(chuàng),轉(zhuǎn)載請注明原文地址
http://www.lxweimin.com/p/b1fe26d5b8c8
文章中代碼部分已上傳到Github,傳送門在文章末尾。

本次的搭建是在ubuntu系統(tǒng)上進(jìn)行的,windows搭建過程類似。

軟件準(zhǔn)備

此次搭建我們用到了JDK及nexus(sonatype的軟件,不是google的手機(jī))

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

安裝過程

JDK的安裝 :

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

NEXUS安裝:
  1. 把下載的nexus-2.12.0-01-bundle.zip放到/usr/local目錄下(你也可以放到其它目錄)
  2. 為了減去不必用的麻煩,我建議現(xiàn)在開始使用你的su權(quán)限。
    命令行:sudo su
    會讓你輸入密碼確認(rèn),確認(rèn)后進(jìn)入超級權(quán)限。
  3. 解壓壓縮文件。
    命令行:**unzip nexus-2.12.0-01-bundle.zip **
    解壓文件得到 nexus-2.12.0-01文件及sonatype-work文件夾。我們現(xiàn)在只關(guān)心nexus-2.12.0-01文件夾。
存放位置-超級命令-解壓.jpg
  1. 軟連接
    為了操作方便,我們給這個比較長名字的文件夾建個軟連接(好比所Windows的快捷方式),
    命令行: ln -s nexus-2.12.0-01 nexus2
  2. 運行nexus
    我們進(jìn)入到nexus2指向的文件夾下
    命令行:cd nexus2 **
    啟動nexus
    命令行:
    ./bin/nexus start**
    失敗了,沒運行起來。如圖,好糾結(jié),一面讓我們run as root,一面又不建議我們這樣。
軟連接-運行需要root提示.jpg
  1. 設(shè)置RUN_AS_USER=root
    那我們按照它的指示設(shè)置RUN_AS_USER=root
    命令行:vi ./bin/nexus
    vi設(shè)置run_as_root.jpg

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

  1. 再次運行啟動命令
    如果看到命令行提示了Started Nexus OSS,說明我們成功了。
    訪問下試試:http://localhost:8081/nexus/ 如圖,我們已經(jīng)成功運行。
提示run_as_root-成功運行.jpg
成功運行.jpg

我遇到一個情況是這樣的,已經(jīng)提示我“Started Nexus OSS”。但是瀏覽器訪問不到。這時我嘗試再次使用命令啟動nexus。仍然提示我“Started Nexus OSS”。如果你也遇到這種情況就注意了,現(xiàn)在是有問題的,服務(wù)沒起來。如果起來了,再次啟動會提示“Nexus OSS is already running.”我經(jīng)過排查發(fā)現(xiàn)是因為我系統(tǒng)的JAVA環(huán)境不對,沒有裝Oracle的JDK,而是使用了自帶的OpenJDK(具體版本忘了,特別聲明,有的OpenJDK版本是可以讓nexus正常運行的),那你就去裝下Oracle的JDK吧。

配置

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


    默認(rèn)的倉庫-步驟2.jpg
  3. 我們可以看到這些倉庫的類型有:group、hosted、proxy、virtual。
    hosted,本地代理倉庫,通常我們會部署自己的構(gòu)件到這一類型的倉庫。
    proxy,代理的遠(yuǎn)程倉庫,它們被用來代理遠(yuǎn)程的公共倉庫,如maven中央倉庫。
    group,倉庫組,用來合并多個hosted/proxy倉庫,通常我們配置maven依賴倉庫組。
    virtual,這種是maven1的,以后基本不會用到或者很少會用到,所以不用過多理會。

我這里并沒有打算講怎么新建倉庫,因為nexus提供的這幾個倉庫對于簡單使用已經(jīng)可以了。

  1. 下面我們先來配置一下Central倉庫:
    a.修改Download Remote Indexes選項為True(允許下載遠(yuǎn)程倉庫的索引)
    b.在Central倉庫上右擊,選擇Repair Index(代理倉庫會去下載遠(yuǎn)程倉庫的索引,方便搜索)
    c.片刻之后我們在倉庫下方的詳細(xì)信息處點擊Browse Index 可以看到有個文件夾 Central,前方有個加號可以打開,如果沒有信息,說明還沒有下載下來,或者下載失敗了。你可以選擇等一等,或者在最右側(cè)的菜單欄選擇Administration->Logging,查看運行信息,可能對你有幫助。
允許下載索引-更新索引-步驟4.jpg

有的時候你確實需要等一等,因為我遇到過,怎么也沒有索引下載下來,大概我吃了午飯回來,發(fā)現(xiàn)它自己下載好了。

  1. 同步驟4一樣來配置Apache Snapshots
    這里為我們可以看到倉庫policy有Releases、Snapshots兩種。
    Snapshot 代表不穩(wěn)定、尚處于開發(fā)中的版本。
    Release 代表穩(wěn)定的版本

現(xiàn)在你可以嘗試在右側(cè)菜單欄的搜索框嘗試搜索內(nèi)容。如果你的proxy倉庫成功的下載了索引,我們嘗試搜索okhttp(你也可以換個關(guān)鍵字)你將會看到如下面的畫面

搜索效果-步驟5.jpg
  1. 自帶倉庫Releases、Snapshots就是為我們準(zhǔn)備的上傳我們自己lib文件的倉庫,所以就不必新建其它倉庫了

  2. 配置倉庫組Public Repositories。如下圖配置好后,千萬要點save進(jìn)行保存。

倉庫組與倉庫就像我們android開發(fā)中ViewGroup 與 View的關(guān)系。本身包含其他倉庫,對外又像倉庫一樣使用。

Public Repositories庫配置-步驟7.jpg

8.新建SnapShots倉庫組。點擊Add->Repository Group。會在下方倉庫區(qū)新生成一個“New Repository Group”。我們像下方圖: snapshots配置-步驟8.jpg 那樣對它進(jìn)行配置。

新建庫組.jpg
snapshots配置-步驟8.jpg

使用我們的倉庫

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

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

"sync now"一下,現(xiàn)在我們的工程配置的依賴就已經(jīng)使用我們自己搭建的私有倉庫了。

各庫地址URL.jpg

上圖中Public Snapshots庫對應(yīng)的Respository Path就是我們上方替換默認(rèn)maven庫地址的私庫地址。下面Releases、Snapshots庫地址就是我們下節(jié) 發(fā)布到私服 上傳腳本中自己的lib庫要發(fā)布到的倉庫地址。

發(fā)布到私服

接下來,我們將在Android Studio環(huán)境下,來發(fā)布我們自己的庫文件
1.在我們的工程下新建一個lib,我這就叫l(wèi)ikelib吧。
2.在主項目下新建一個maven_push.gradle來寫我們的發(fā)布到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.
// 對庫文件進(jìn)行數(shù)字簽名的插件,可以通過簽名知道誰創(chuàng)建了這個庫文件,簽名的時間等等信息
apply plugin: 'signing'

// 聲明變量記錄maven庫地址
def mavenRepositoryUrl
// 判斷是發(fā)布到正式庫,還是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 : ""
}
// 根據(jù)我們在likelib下gradle.properties中聲明的版本名稱,來分辨是Release版本還是 snapshots版本
def isReleaseBuild() {
    return !VERSION_NAME.contains("SNAPSHOT");
}

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

                // 授權(quán)驗證,這里也就是你登陸搭建的私服服務(wù)器時候的用戶名\密碼
                repository(url: mavenRepositoryUrl) {
                    authentication(userName: getRepositoryUsername(), password: getRepositoryPassword())
                }

                // 這里是配置我們maven庫需要的pom.xml文件的各個內(nèi)容,具體意思我們在主目錄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
                        }
                    }
                }
            }
        }
    }

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

    // type顯示指定任務(wù)類型或任務(wù), 這里指定要執(zhí)行Javadoc這個task,這個task在gradle中已經(jīng)定義
    task androidJavadocs(type: Javadoc) {
        // 設(shè)置源碼所在的位置
        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
    }

    // 產(chǎn)生相關(guān)配置文件的任務(wù)
    artifacts {
        archives androidSourcesJar
        archives androidJavadocsJar
    }
}

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

# properties for maven2 repository
# nexus服務(wù)器登陸時候的用戶名/密碼
NEXUS_USERNAME=admin
NEXUS_PASSWORD=admin123
# 在POM文件中使用的group ID
POM_GROUP_ID=com.exmaple.like
# POM文件中指向你網(wǎng)站的地址
POM_URL=https://github.com/achenglike
# SCM是指版本管理工具,一下說他的相關(guān)信息
POM_SCM_URL=https://github.com/
POM_SCM_CONNECTION=https://github.com/achenglike
POM_SCM_DEV_CONNECTION=https://github.com/achenglike
# 你的開放協(xié)議相關(guān)信息
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
# 開發(fā)者的相關(guān)信息
POM_DEVELOPER_ID=achenglike
POM_DEVELOPER_NAME=achenglike

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

apply from: '../maven_push.gradle'

4.在我們likelib項目下新建一個gradle.properties來存我們需要發(fā)布的版本、格式等信息

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

5.我們現(xiàn)在可以在android studio的Terminal中來發(fā)布我們的庫文件了 。
輸入命令:gradle uploadArchives
運行結(jié)束Terminal會提示成功或失敗,提示成功說明已經(jīng)上傳到了你的私庫中。

如果沒有意外,我們已經(jīng)發(fā)布到了我們的私有倉庫,我們可以自己去看看,就像下面的圖。

成功上傳庫文件.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();
            }
        });
    }

文章為原創(chuàng),轉(zhuǎn)載請注明原文地址
http://www.lxweimin.com/p/b1fe26d5b8c8
示例中的工程已久上傳到了Github

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,732評論 6 539
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,214評論 3 426
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,781評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,588評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,315評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,699評論 1 327
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,698評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,882評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,441評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,189評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,388評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,933評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,613評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,023評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,310評論 1 293
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,112評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,334評論 2 377

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,816評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,702評論 25 708
  • 一、Nexus的環(huán)境搭建 在網(wǎng)上找資料的時候,發(fā)現(xiàn)各版本的Nexus的文件結(jié)構(gòu)差異很大,本人使用的是Nexus 3...
    我愛吃栗子啊閱讀 3,934評論 1 9
  • 首先私服是一種衍生出來的特殊的Maven遠(yuǎn)程倉庫,構(gòu)建私服的好處請看3.5私服 可以幫助大家建立私服的倉庫管理軟件...
    zlcook閱讀 10,589評論 0 32
  • 七年 成長 長成自己喜歡的樣子 有技能,財務(wù)自由 對于007班級的想法,我感覺更多的互聯(lián)互通,我們加入班級一...
    一日兩人三餐四季閱讀 179評論 0 1