Android:超詳細(xì)的本地搭建maven私服以及使用Nexus3.x搭建maven私服的講解

前言

Android開發(fā)中铅搓,會經(jīng)常遇到需要將寫好的某個lib用于各個不同的項目中隔节。一般的做法,就是將lib直接導(dǎo)入到項目中鳞贷。但是假如libbug,那么所有使用lib的項目我們都要進(jìn)去修改libbug虐唠,這樣即繁瑣悄晃,工作量又大。假如我們可以像gralde中添加依賴那樣凿滤,直接一句implementation 'xxx'代碼從maven倉庫中調(diào)用lib妈橄,那么我們就不用再一個一個項目中去修復(fù)libbug了,這樣不僅省事了許多翁脆,還安全眷蚓。

正文

一、本地搭建maven私服

  1. gradle中添加如下代碼反番,與android{...}同級
// 添加 maven 插件
apply plugin: 'maven'

uploadArchives {
    repositories {
        mavenDeployer {
           pom.project {
                // 自定義的項目分組
                groupId 'com.homeprint.lib'
                // 自定義項目名稱
                artifactId 'homeprint-core'
                // 項目版本號
                version '1.0.1'
            }

            // 自定義本地倉庫路徑沙热,此處是項目根目錄下的 repo 目錄中
            repository(url: uri("../repo"))
        }
    }
}
  1. 點擊gradle右上角的Syc Now,同步一下項目罢缸,然后在右側(cè)的項目的gradle中找到Tasks中的upload篙贸,雙擊upload中的uploadArchives,將項目發(fā)布到本地的maven倉庫中
發(fā)布項目到本地maven倉庫
  1. 我配置的本地倉庫路徑是項目根目錄的repo目錄枫疆,所以可以看到在項目根目錄中出現(xiàn)倉庫文件夾
    本地maven

4.如何在項目中引用發(fā)布的lib爵川?

  • 首先在工程的build.gradle(是projectbuild.gradle而不是modulebuild.gradle)中添加我們配置的本地倉庫路徑。
    (注:build.gradle中有兩個repositories息楔,buildscript中的是用于gradle本身構(gòu)建時使用的寝贡,allprojects中的才是給項目依賴使用的,我們在allprojectsrepositories中添加本地maven地址)
本地maven倉庫路徑
  • 然后在需要使用的module中添加依賴implementation 'com.homeprint.lib:homeprint-core:1.0.0'值依,依賴的項目名規(guī)則為groupId:artfactId:version圃泡,所以我的依賴為com.homeprint.lib:homeprint-core:1.0.0

這樣就完成了,我們就可以肆無忌憚的在需要的項目中引用我們發(fā)布的lib啦愿险,但是這個僅限于本地使用颇蜡,給自己獨立開發(fā)時提供方便。如果是團(tuán)隊開發(fā)辆亏,大家使用不同的電腦风秤,就不行了。那么團(tuán)隊開發(fā)時褒链,我們想要達(dá)到這種效果該怎么做呢唁情?

二疑苔、使用Nexus3.x搭建maven私服

1. 下載Nexus3.x

現(xiàn)在Nexus最新版已經(jīng)是3.x了甫匹,個人喜歡使用新版,所以本次我們使用Nexus3.x來搭建maven私服。我們先去官網(wǎng)下載Nexus Repository Manager OSS 3.x兵迅,我用的是windows系統(tǒng)抢韭,所以我下載的是windows版本

pic_nexus_download

2. Nexus的安裝與配置

  1. 目前最新版是3.14.0,將下載的壓縮包解壓

    解壓后的文件

    在減壓的文件夾nexus-3.14.0-04-win64中有兩個文件夾nexus-3.14.0-04sonatype-work恍箭。nexus-3.14.0-04是程序刻恭,sonatype-work是工作目錄,如果以后要備份數(shù)據(jù)扯夭,只要備份sonatype-work就行鳍贾。

  2. nexus-3.14.0-04-win64\nexus-3.14.0-04\bin文件夾所在路徑添加到環(huán)境變量Path中,我的路徑是D:\software\nexus\nexus-3.14.0-04-win64\nexus-3.14.0-04\bin

  3. 配置nexus-3.14.0-04-win64\nexus-3.14.0-04\etc目錄下nexus-default.properties文件

    pic_nexus-default.properties

上述配置中有三個字段關(guān)注一下交洗,application-host骑科、application-port以及nexus-context-path

  • application-host :是你訪問的nexus服務(wù)器的IP,默認(rèn)為0.0.0.0(即只要是本機上的IP构拳,就能連上nexus服務(wù)器咆爽,詳解點我)。為了安全和屏蔽掉其他IP置森,我們可以改訪問IPlocalhost指向的IP(一般默認(rèn)指向127.0.0.1斗埂,可以去C:\Windows\System32\drivers\etchosts文件中查詢localhost指向的IP),改成本機上其他IP也可以

  • application-port:是IP的端口號凫海,默認(rèn)為8081呛凶,如果端口號被占用,自行換成其他端口號

  • nexus-context-path:上下文對象路徑行贪,默認(rèn)是沒有的把兔,如果添加了上下文對象路徑,需要在訪問地址(訪問地址:application-host:application-port)后面加上下文對象路徑瓮顽,即訪問地址變?yōu)椋?code>application-host:application-port/nexus-context-path

    以下是個人更改后的字段值县好,當(dāng)然如果只想簡單使用,不更改也沒事暖混,可以跳過

application-port=8081
application-host=127.0.0.1
  1. 打開CMD缕贡,執(zhí)行命令nexus.exe /run
  2. 瀏覽器中輸入:127.0.0.1:8081(此處為你配置的application-host:application-port,如果你也配置了nexus-context-path拣播,則為application-host:application-port/nexus-context-path晾咪,例:假如我配置nexus-context-path=/test,瀏覽器中輸入:127.0.0.1:8081/test)贮配,進(jìn)入nexus管理頁面谍倦,至此nexus已經(jīng)安裝并且啟動成功
    nexus入口

3. Nexus的倉庫創(chuàng)建

在創(chuàng)建倉庫前,先介紹一下倉庫的三種存儲類型Release泪勒、SnapshotMixed昼蛀,創(chuàng)建倉庫時會使用到

三種倉庫存儲類型

  • Release(正式版): 正式版宴猾,適合項目穩(wěn)定后正式發(fā)布使用,特性看下面的原理簡介 [important]叼旋。
  • Snapshot(快照版): 快照版仇哆,適合項目在開發(fā)調(diào)試中使用,特性看下面的原理簡介 [important] 夫植。
  • Mixed(混合版): 可包含release和snapshot版本

ReleaseSnapshot的原理簡介:

它們的主要區(qū)別在于本地獲取這些依賴的機制不同讹剔。

  • 對于Release版本的項目: 當(dāng)項目中添加了一個正式版的version為x的依賴時,構(gòu)建工具在構(gòu)建項目時會從遠(yuǎn)程倉庫中下載這個version為x的依賴到本地倉庫緩存起來详民,下次再構(gòu)建項目時延欠,構(gòu)建工具會從本地倉庫中查找是否存在這個version為x的依賴,存在就不會在去遠(yuǎn)程倉庫中拉取沈跨。這種特性會導(dǎo)致在團(tuán)隊開發(fā)中衫冻,如果你發(fā)布一個正式版的項目時,仍然使用的是同一個version谒出,就可能出現(xiàn)其他使用這個version項目的成員根本接收不到項目的最新變更隅俘,這是糟糕的,為了生命安全笤喳,大家盡量不要這么做为居。所以,在每次發(fā)布正式版項目時杀狡,必須更新version蒙畴。
  • 對于Snapshot版本的項目: 當(dāng)項目中添加了一個快照版的version為x的依賴時,不管本地倉庫中是否存在這個version為x的依賴呜象,構(gòu)建工具都會嘗試從遠(yuǎn)程倉庫中查看這個version為x的依賴是否最新膳凝。這樣就能保證團(tuán)隊開發(fā)時,所有使用這個version為x的依賴的項目都能獲取到依賴最新的變更恭陡,而且不用不停的迭代依賴的version蹬音。最后一還有一點,Snapshot版項目發(fā)布時的version一定要以-SNAPSHOT結(jié)尾休玩,英文字母必須大寫渔肩。

下面正式開始倉庫創(chuàng)建流程:

  1. 先登錄巢株,初始用戶名和密碼分別為adminadmin123
  2. 登錄后,如下圖操作所示赁遗,看到有個模塊為Blob Stores钳踊,這是文件存儲的地方碱鳞,默認(rèn)存在default中悼沈,你可以點擊Create blob store自己創(chuàng)建一個存儲點
    文件存儲的地方

    這里嘲叔,我自己創(chuàng)建了名為homeprint的新的存儲點
    新建存儲點

    homeprint存儲點
  3. 創(chuàng)建自己的maven倉庫


    創(chuàng)建自己的maven倉庫

    選擇要創(chuàng)建的maven倉庫類型
  4. 可以看到一共有三種maven類型的倉庫供我們選擇
  • hosted(宿主倉庫) :專門存放無法從遠(yuǎn)程倉庫中下載的構(gòu)件或者公司內(nèi)部自主開發(fā)的一些構(gòu)件。當(dāng)hosted倉庫找不到目標(biāo)構(gòu)件時蜒犯,并不能從遠(yuǎn)程倉庫下載组橄。并且想要將內(nèi)部開發(fā)構(gòu)件上傳到maven倉庫荞膘,三種倉庫中只能使用hosted。

    宿主倉庫創(chuàng)建

  • proxy(代理倉庫) : 當(dāng)用戶向proxy請求一個資源時晨炕,proxy會先在本地倉庫中尋找是否有該資源衫画,沒有的話會從遠(yuǎn)程倉庫下載毫炉,然后返回給用戶瓮栗;同時會緩存在本地,下次用戶再請求相同資源時瞄勾,就可以直接在本地中找到并返回給用戶费奸。proxy起到一層緩存與中轉(zhuǎn)的作用。
    proxy代理的遠(yuǎn)程倉庫可以配置进陡,這里我選擇阿里云的maven倉庫http://maven.aliyun.com/nexus/content/groups/public/愿阐,因為在國內(nèi)比中央倉庫快很多)
    (注意:不支持將內(nèi)部自主研發(fā)的項目上傳到proxy上,只能上傳到hosted中趾疚,proxy的主要作用只是緩存從遠(yuǎn)程倉庫下載的資源和作為中轉(zhuǎn)站去遠(yuǎn)程倉庫下載需要的資源)

    代理倉庫創(chuàng)建

  • group(倉庫組) :多個倉庫的聚合體缨历,將你在nexus中想要使用的maven倉庫聚合在一起,對用戶暴露統(tǒng)一的地址糙麦,這樣用戶就不需在項目中配置多個maven地址了辛孵。(同樣也不支持將內(nèi)部研發(fā)項目上傳到group中,只能發(fā)布到hosted)

    倉庫組創(chuàng)建

  1. 倉庫創(chuàng)建完成(不必要三種倉庫都創(chuàng)建赡磅,選擇你想創(chuàng)建的就行)魄缚。點擊倉庫的copy可以拷貝倉庫路徑。
    倉庫創(chuàng)建完成

4. 發(fā)布項目到maven倉庫

第一種:使用gradle自動發(fā)布

在需要發(fā)布的module的build.gradle中加入如下代碼焚廊,與在第一種在發(fā)布到maven倉庫的實現(xiàn)基本一致

apply plugin: 'maven'

uploadArchives {
    configuration = configurations.archives
    repositories {
        mavenDeployer {
            // 倉庫路徑(只能是hosted倉庫)
            repository(url: 'http://192.168.10.128:8081/repository/homeprint-hosted/') {
                // 你 Nexus 的賬戶密碼
                authentication(userName: 'admin', password: 'admin123')
            }
            pom.project {
                version '1.0.1'
                artifactId 'homeprint-common'
                groupId 'com.homeprint.lib'
                description 'xxxxxx'
            }
        }
    }
}

然后在右側(cè)的雙擊下圖中的uploadArchives冶匹,即可發(fā)布上傳

上傳項目到hosted倉庫中

上傳完成后,可以在倉庫中看到發(fā)布的項目
項目上傳完成

第二種:使用網(wǎng)頁上傳

點擊倉庫的upload component可以手動上傳咆瘟,一般現(xiàn)成的jar或者aar文件可以直接選擇手動上傳

網(wǎng)頁上傳

網(wǎng)頁上傳詳情

5. module中使用發(fā)布的項目

在工程的build.gradle中添加maven地址

allprojects {
    repositories {
        maven { url 'http://127.0.0.1:8081/repository/homeprint-group/' }
    }
 }

在module的build.gradle中添加依賴

  implementation 'com.homeprint.lib:homeprint-common:1.0.0'

三嚼隘、其他注意事項

1. gradle中如何指定要上傳到maven的文件

// 將項目指定的 _exports 文件夾下的內(nèi)容打成 jar
task makeJar(type: Jar) {
    baseName = "hpauth-exports"
    version = "1.0.0"
    extension = "jar"
    from('build/intermediates/classes/debug/')
    from('build/tmp/kotlin-classes/debug/')
    include('com/homeprint/module/auth/_exports/**')
    destinationDir = file('build/_exports')
}

// 配置需要上傳到 maven 倉庫的文件,即將上面打包的 jar 上傳
artifacts {
    archives makeJar
}

// 上傳部分仍然與之前相同
uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: 'http://127.0.0.1:8081/repository/maven-snapshots/') {
                authentication(userName: 'admin', password: 'admin123')
            }
            pom.project {
                version '1.0.0-SNAPSHOT'
                artifactId 'hpauth-exsppt'
                groupId 'com.homeprint.module'
                description 'xxxxxxx'
            }
        }
    }
}

2. 關(guān)于外部設(shè)備訪問Nexus的問題

上述中袒餐,一開始我配置的IP地址127.0.0.1嗓蘑,此IP地址外部設(shè)備是連接不上的,僅能本機訪問匿乃。如果要在同一局域網(wǎng)內(nèi)讓外部設(shè)備可以訪問桩皿,請更改為能讓外部設(shè)備連上的IP地址,例如PC在局域網(wǎng)內(nèi)被分配到的IPV4地址幢炸。詳解點我

3. 關(guān)于Nexus初始時的默認(rèn)倉庫

nexus在一開始就給我們提供了一些默認(rèn)倉庫


默認(rèn)倉庫
  • maven-central:代理倉庫泄隔,配置的是maven官方2號倉庫的地址
  • maven-public:倉庫組
  • maven-releases:宿主倉庫,倉庫的存儲類型為Release
  • maven-snapshot:宿主倉庫宛徊,倉庫的存儲類型為Snapshot

上述內(nèi)容中已經(jīng)對這些倉庫的類型介紹過佛嬉,就不在多說了逻澳。這些默認(rèn)倉庫我們是可以直接使用的,基本已經(jīng)滿足我們所有的需求暖呕,所以如果不創(chuàng)建倉庫斜做,可以直接使用默認(rèn)倉庫。

4. Android開發(fā)中常用的maven代理地址

以上幾個基本就是android開發(fā)中常用的幾個maven倉庫了湾揽,其中阿里云是國內(nèi)倉庫瓤逼,其他是國外倉庫。國內(nèi)倉庫的優(yōu)勢在于下載速度快库物,畢竟祖國偉大的網(wǎng)絡(luò)對于國外的網(wǎng)絡(luò)不怎么友好霸旗。但是國內(nèi)倉庫可能更新會比國外倉庫慢一點。出于以上考慮戚揭,我們可以將以上倉庫都集成在group倉庫組中诱告,一定要將阿里云放在其他國外maven倉庫的上面,因為訪問倉庫時的順序是從上往下訪問的民晒,這樣就既有了國內(nèi)倉庫的速度精居,又可以在國內(nèi)倉庫沒有資源時,去國外倉庫獲取到資源潜必。

5. Nexus中用戶的權(quán)限管理

團(tuán)隊開發(fā)的時候靴姿,為了避免散發(fā)超級管理員權(quán)限,可以根據(jù)每個成員的實際情況刮便,給他們配置用戶角色和權(quán)限空猜。

  • Security -> Privileges: 所有的權(quán)限都放在了這里
    權(quán)限大全
  • Security -> Roles: 角色管理界面,可在此界面創(chuàng)建角色
    創(chuàng)建角色

    角色權(quán)限
  • Security -> Users: 用戶管理界面恨旱,可在此界面創(chuàng)建用戶
    創(chuàng)建用戶

    用戶權(quán)限
  • Security -> Anonymous: 匿名用戶管理界面(即游客管理)辈毯,這里有個注意的地方,如下圖中搜贤,有個Allow anonymous users to access the server谆沃,游客默認(rèn)是有瀏覽讀取倉庫的權(quán)限的,如果取消勾選仪芒,則游客沒有任何權(quán)限唁影。
    游客權(quán)限1

    游客權(quán)限2

6. 如何從Nexus中下載jar包或者aar包

資源下載

四、如何實現(xiàn)在外網(wǎng)中訪問自己的maven倉庫

  1. 將項目上傳到 Github掂名、碼云或者類似的管理平臺中据沈,通過jitpack發(fā)布(最簡單的方式)
  2. 將項目發(fā)布到jcenter或者mavenCentral中,這個比第一種復(fù)雜一些饺蔑,如果要使用jcenter發(fā)布锌介,可以使用bintray-release插件
  3. Nexus部署到阿里云或者其他云服務(wù)器中,這時使用的版本不再是Windows版而是Unix
  4. 以上都是常用的方法,因為時間關(guān)系就不再詳細(xì)介紹了孔祸,大家可以自行百度隆敢。最后介紹一種取巧的方法,就是找一些可以將內(nèi)網(wǎng)IP映射到外網(wǎng)訪問的小工具崔慧,比如nat123拂蝎、花生殼之類的,這里我用的是windows_386惶室,一共就三個文件
    windows_386

    其中a.bat是運行文件温自,里面就一行代碼如下:
ngrok -config=ngrok.cfg -subdomain my 8080

其中my為域名的前綴,8080為端口號拇涤,這兩樣是可以根據(jù)需要捣作,自行修改的誉结。雙擊a.bat文件開始運行程序鹅士,結(jié)果如下:

ngrok                                                                                                   (Ctrl+C to quit)

Tunnel Status                 online
Version                       1.7/1.7
Forwarding                    http://my.tunnel.qydev.com -> 127.0.0.1:8080
Forwarding                    https://my.tunnel.qydev.com -> 127.0.0.1:8080
Web Interface                 127.0.0.1:4040
# Conn                        0
Avg Conn Time                 0.00ms

當(dāng) Tunnel Statusonline時,代表已經(jīng)將內(nèi)網(wǎng)IP映射到公網(wǎng)上惩坑,映射的IP為127.0.0.1(不可變)掉盅,端口號為你在a.bat中配置的端口號,此處為8080(可配置)以舒。與IP綁定的域名為my.tunnel.qydev.com趾痘,其中前綴my即為你在a.bat中配置的前綴。這樣你在瀏覽器中輸入my.tunnel.qydev.com就可以連上本機的127.0.0.1:8080蔓钟。然后永票,將nexus的IP和端口號分別配置為127.0.0.18080就可以在外網(wǎng)訪問到本機上的Nexus了。這種方式很簡單滥沫,成本低侣集,但是訪問速度有點慢,但是誰還沒有個不在公司coding的時候兰绣,這時候就可以提供點便利了世分。

感謝下列文章

理解Maven中的SNAPSHOT版本和正式版本

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市缀辩,隨后出現(xiàn)的幾起案子臭埋,更是在濱河造成了極大的恐慌,老刑警劉巖臀玄,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瓢阴,死亡現(xiàn)場離奇詭異,居然都是意外死亡健无,警方通過查閱死者的電腦和手機荣恐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來睬涧,“玉大人募胃,你說我怎么就攤上這事旗唁。” “怎么了痹束?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵检疫,是天一觀的道長。 經(jīng)常有香客問我祷嘶,道長屎媳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任论巍,我火速辦了婚禮烛谊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘嘉汰。我一直安慰自己丹禀,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布鞋怀。 她就那樣靜靜地躺著双泪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪密似。 梳的紋絲不亂的頭發(fā)上焙矛,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天,我揣著相機與錄音残腌,去河邊找鬼村斟。 笑死,一個胖子當(dāng)著我的面吹牛抛猫,可吹牛的內(nèi)容都是我干的蟆盹。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼邑滨,長吁一口氣:“原來是場噩夢啊……” “哼日缨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起掖看,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤匣距,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后哎壳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體毅待,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年归榕,在試婚紗的時候發(fā)現(xiàn)自己被綠了尸红。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖外里,靈堂內(nèi)的尸體忽然破棺而出怎爵,到底是詐尸還是另有隱情,我是刑警寧澤盅蝗,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布鳖链,位于F島的核電站,受9級特大地震影響墩莫,放射性物質(zhì)發(fā)生泄漏芙委。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一狂秦、第九天 我趴在偏房一處隱蔽的房頂上張望灌侣。 院中可真熱鬧,春花似錦裂问、人聲如沸侧啼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽慨菱。三九已至焰络,卻和暖如春戴甩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背闪彼。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工甜孤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人畏腕。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓缴川,卻偏偏與公主長得像,于是被迫代替她去往敵國和親描馅。 傳聞我的和親對象是個殘疾皇子把夸,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,976評論 2 355

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