前言
Android開發者經常會看到xx公司發布了xx項目,xx公司提供了gradle配置路徑,我們就能輕松的使用它們的項目到自己的工程中:
譬如:
谷歌自身的庫
compile 'com.android.support:appcompat-v7:22.2.0'
第三方庫
compile 'com.squareup.okhttp:okhttp:2.7.2'
很多開發者看過之后羨慕不已, 想自己能不能也寫一個自己的庫讓別人用(或者發布已有的本地module庫),或者當多模塊開發時,為了進行版本協作,使用自己的maven庫是勢在必得的!
Maven
Apache Maven,是一個軟件(特別是Java軟件)項目管理及自動構建工具,由Apache軟件基金會所提供。基于項目對象模型(縮寫:POM)概念,Maven利用一個中央信息片斷能管理一個項目的構建、報告和文檔等步驟。
更多請點擊:Maven
Maven package 是由所謂 POM(Project Object Model)所定義的文件包的一種輸出特殊格式。
Maven倉庫就是,就是放 Maven包的地方, 所以叫倉庫。 這些倉庫,可以是放在本地,也可以放在遠程服務器上。 可以開放倉庫,也可以加密的,提供別人下載使用!
一句大白話你就懂了:maven是類似android studio的構建工具, maven包是對于構建工具產出的格式,maven包類似是apk,maven倉庫是apk應用市場一樣!
Maven倉庫
Center和MavenCentral
jcenter是由 bintray.com提供的Maven倉庫存放的平臺服務器,用戶可以注冊發布托管自己的開源maven包
Maven Central 是由sonatype.org 提供的發布的Maven服務平臺。雖然Maven Central和jcenter都是標準的maven倉庫服務器。
同樣的倉庫卻毫無聯系。 在jcenter上存在的開源庫,可能 在Maven Central 上并不存在,反之亦然。 就類似豌豆莢和91助手都可以存在apk下載,但不一定都能搜到同一個應用一樣,MavenCentral上發布maven包比發布到jcente有點復雜,當然我們可以將jcenter的包同步到MavenCenter
發布maven包
遠程jcenter
Maven
一首先我們需要在jcenter注冊一個賬號 點我注冊
如果你有github直接可以用github賬戶注冊! 然后補充下資料信息!
接著登錄成功后我們去獲取這個賬戶的簽名key,用來區分賬戶Id信息,先記錄好自己的
key,后面會用到這個信息。
創建module
- 1 創建模塊
如果你是從零開始去寫一個組件模塊,就直接在as為你的app創建一個
module, 如果已有模塊請直接繞道到第三步。
當創建好你的module是時候就會生成一個自己的library
接著可以在自己module配置gradle
下面步驟請均在自己的module中gradle中配置加入。
- 3 申明插件類型
apply plugin: 'com.github.dcendents.android-maven'
apply plugin: 'com.jfrog.bintray'
-
4 配置maven包信息
//版本號 version = "1.0.0" //這是項目首頁 def siteUrl = 'https://github.com/NeglectedByBoss/Novate' //這是源碼地址 def gitUrl = 'https://github.com/NeglectedByBoss/Novate.git' // 包名,可以寫公司的前綴 group = "com.tamic.novate"
-
5 定制輸出格式信息
install { repositories.mavenInstaller { // This generates POM.xml with proper parameters pom { //pom信息 project { packaging 'aar' // Add your description here name 'novate' url siteUrl // Set your license licenses { //開源協議 license { name 'The Apache Software License, Version 2.0' url 'http://www.apache.org/licenses/LICENSE-2.0.txt' } } developers { //開發者基本信息 developer { id 'tamic' name 'tamic' email 'xxxx@xxx.com' } } scm { connection gitUrl developerConnection gitUrl url siteUrl } } } } }
6 輸出資源
task sourcesJar(type: Jar) {
from android.sourceSets.main.java.srcDirs
classifier = 'sources'
}
task javadoc(type: Javadoc) {
source = android.sourceSets.main.java.srcDirs
classpath += project.files(android.getBootClasspath ().join(File.pathSeparator))
}
task javadocJar(type: Jar, dependsOn: javadoc) {
classifier = 'javadoc'
from javadoc.destinationDir
}
artifacts {
archives javadocJar
archives sourcesJar
}
-
7 配置賬號
這時候加入自己的賬號和key,當然你不想加入到local配置中,也可以單獨建個prpertites文件,設置git的忽略規則即可。
這里寫圖片描述 -
8 申明編譯類型
在主項目的gradle中加入下面申明
buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.3.0' //這里是依賴的插件類型路徑,用最新的即可 classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.4' classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3' } }
提交maven
當我們將項目build完成以后,as就會生成如下task
雙擊即可,也可以在命令行輸入 gradle brntaryUpload.
如果成功了,可以去預覽我們的項目,發現會有你發布的包了,我這里有四個項目,如果第一次用只顯示一個,直接點擊預覽自己的Maven包 ,
接著繼續打開后發現maven包具體預覽界面了,
這時候需要add到倉庫中心等管理員審核,如果第一次就會有addjcenter按鈕,
提交會打開一個申請頁面,你填寫評論就Okle ,中文也可以,等一兩小時,收到系統發來的私信,就代表你的庫成功了,這時候就有maven依賴地址生成,我們可以直接拿來配置就可以了
-
9 使用mven包
這個就不用多說了吧,心累!
問題總結
如果發現提示你javadoc不過,就關閉doc檢查,
如果發現編碼出錯,就指定utf-8
在module的gradle中加入
javadoc {
options{
encoding "UTF-8"
charSet 'UTF-8'
author true
version true
links "http://docs.oracle.com/javase/7/docs/api"
}
}
tasks.withType(Javadoc) {
options.addStringOption('Xdoclint:none', '-quiet')
options.addStringOption('encoding', 'UTF-8')
options.addStringOption('charSet', 'UTF-8')
}
如果希望自己代碼混淆請配置好相關規則,這里不再介紹。
Maven Central
可能很多人還想發布到 Maven Central去,可以接著看,雖然長了點,請仔細耐心看完
-
注冊 sonatye 賬戶
到 sonatype issue 頁面,注冊賬號。
-
創建 issue
登陸之后,頂部有按鈕,Created,下面是關鍵的條目
Project: Community Support - Open Source Project Repository Hosting (OSSRH)
Issue Type: New Project
Group Id:就是你的包的 groupId
其他信息請加上,提交之后,大概兩個工作日, 等系統給你分配了issue之后,就可以進行下面的工作了,這塊可以參考 點擊介紹
-
上傳包
配置gradle
整個結構,
這里寫圖片描述現在我們將紅框內的task覆蓋,具體如下
ext { PROJ_GROUPID = 'com.tamic.android' PROJ_ARTIFACTID = 'novate' //這是項目名字 PROJ_VERSION_NAME = "1.0.0"http://版本號 POM_PACKAGING = 'aar' NEXUS_USERNAME = '注冊的賬號' NEXUS_PASSWORD = '這是密碼' RELEASE_REPOSITORY_URL = '這里是sonatye配置好的線上路徑' SNAPSHOT_REPOSITORY_URL = '這里是在 sonatye配置好的snaphot路徑' } uploadArchives { repositories { mavenDeployer { snapshotRepository(url: SNAPSHOT_REPOSITORY_URL) { authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD) } repository(url: RELEASE_REPOSITORY_URL) { authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD) } pom.project { version PROJ_VERSION_NAME groupId PROJ_GROUPID artifactId PROJ_ARTIFACTID packaging 'aar' } }
}
當然密碼可以加載jcenter公用的那個properties文件中,防止上傳的代碼git上, 然后運行as命令,或點擊下面這個task即可。
發布maven包
登陸 oss sonatype,登陸,選擇左邊欄里的 Staging Repositories, 然后點Close 按鈕,sonatype 會做響應的 validation,通過的話,就可以點 Release 發布啦,如果不通過,就檢查問題,先 Drop,并重新做 Staging 發布。
檢查包
在 https://oss.sonatype.org/content/repositories/releases 可以看到你發布的包。
兩者同步
如果你覺得這種方式比較麻煩,那么我們可以將JCenter的項目同步MavenCentral到上,
搭建企業maven私服
在項目龐大情況下,可能你的項目依賴的module越來越多,這樣對版本控制越來越難,大家想push到maven庫上,但又不想公開自己的maven包,所以MavenCentral提供了自己的企業私服,Sonatype 提供了免費的 sonatype/nexus。
請忽略 作者: http://blog.csdn.net/sk719887916
下載安裝 docker 鏡像
$ docker pull sonatype/nexus
開啟服務鏡像
$ docker run -d -p 8081:8089 --name nexus sonatype/nexus:oss
訪問服務器
因為的 docker-machine ip 是:192.168.99.100,于是可以通過在瀏覽器訪問http://192.168.99.100:8089/ 這個 URL 來訪問 sonatype 私服。
條件允許的可以在內網部署一臺服務器,用來運行這個maven私服。甚至找運維可以創建自己的Maven域名
默認賬戶密碼是:
admin
admin123
配置倉庫
點擊左側 repository,會出現 repository 的列表,把其中的 Releases 的 Configutation->Access Setting-> Deploy Polocy 設置成 Allow Redeploy 使得可以重復發布包。
配置上傳插件
因為使用了自己的私服 chrisbanes/gradle-mvn-push 插件,要稍微改動,我們需要修改自己的maven私服repository URL 等,
關鍵設置
ext {
PROJ_GROUPID = 'com.tamic.android'
PROJ_ARTIFACTID = 'android_statSdk'
PROJ_VERSION_NAME = "1.0.0"
POM_PACKAGING = 'aar'
NEXUS_USERNAME = 'admin'
NEXUS_PASSWORD = 'admin123'
RELEASE_REPOSITORY_URL = '修改為你配置的路徑'
SNAPSHOT_REPOSITORY_URL = '修改為你配置的路徑'
}
檢測是否成功
上傳成功之后,就可以在瀏覽器的http://192.168.99.100:8089/content/repositories/releases看到這個包。發現存在,說明已經成功了。
使用
指定自己的mven倉庫地址
在root的gradle指定你的maven服務器路徑就ok了,其他moudule配置和使用第三方庫一樣。
發布本地Maven##
有時候你不想發布到自己公司的內網私服上,只想測試下本地打包機制,這時候隨便找個mven包,反到電腦任意路徑下。指定本地路徑就ok了,下面三種可以隨你選擇
allprojects {
repositories {
//本機倉庫
mavenLocal()
//內網maven倉庫
maven { url "你的內網私服地址" }
maven {
url "你的Maven路徑"
}
}
}
經驗采坑
- 上傳失敗,返回400,可能是Configutation->Access Setting-> Deploy Polocy沒設置好;返回401,可能是賬號密碼錯誤。
如果還出現失敗,請檢版本號是否一致,如果服務器存在的版本號會上傳不了,請先刪除就版本再上傳,
如果出現
NOT found you moudle
無法上傳情況,請只保留一個android STUDIO,在點擊上傳task.編譯不過出現 無效的插件類型,請重新升級maven-gradle-plugin版本:1.4.1或者更高
華麗結束
上面展示了兩種發布maven包到倉庫的方式,開發者可以自我去選擇,maven不僅很好的解決了模塊化開發是帶來的版本控制問題,也方便了項目對依賴的舊版本回滾控制, 具體在使用的地方可以自己指定maven版本,這次介紹了怎么在gradle發布maven的姿勢,下節在總結下在多模塊情況下,開發者想用同一套代碼,生成不同apk,設置可以選擇不同資源打包的問題。 gradle多渠道和多版本打包相關的知識,期待你的關注!