如何发布Android Library到maven私有仓库
前言
在我們的項(xiàng)目架構(gòu)中,一定存在一些基礎(chǔ)的模塊,這些模塊可以在多個(gè)app上通用,這種情況我們一般會將這些模塊封裝成Android Library統(tǒng)一維護(hù),并上傳到倉庫方便其他小組使用。倉庫可以選擇如mavenCentral這類公開的倉庫,但是我們一般選擇搭建自己的maven私有倉庫,比如:Sonatype Nexus。本文就一步步的教大家如何將Android Library發(fā)布到maven私有倉庫。
添加maven倉庫配置
在項(xiàng)目的根目錄下的gradle.properties中添加私有倉庫的配置,如下:
# 包信息(包名,及Maven的group,必填) PROJ_GROUP=com.xxx.xxx # 項(xiàng)目的描述(描述性信息,不影響maven上傳) PROJ_WEBSITEURL=http://xxxxx PROJ_ISSUETRACKERURL=http://xxxxx PROJ_VCSURL=xxxxx PROJ_DESCRIPTION=xxxx# Licence信息(嚴(yán)格按下面填寫,不要變) PROJ_LICENCE_NAME=The Apache Software License, Version 2.0 PROJ_LICENCE_URL=http://www.apache.org/licenses/LICENSE-2.0.txt PROJ_LICENCE_DEST=repo# Developer 信息(開發(fā)者信息,不影響maven上傳) DEVELOPER_ID=xxxx DEVELOPER_NAME=xxxx DEVELOPER_EMAIL=xxx@xxx.com#倉庫地址(要提交的本地倉庫地址) #快照庫 SNAPSHOT_REPOSITORY_URL=http://xxxx/nexus/content/repositories/snapshots/#正式庫 RELEASE_REPOSITORY_URL=http://xxxx/nexus/content/repositories/releases/將這部信息配置在根目錄的gradle.properties中是因?yàn)槲覀円粋€(gè)項(xiàng)目可能存在多個(gè)Android Library需要上傳到maven,這樣就不用在每個(gè)module下都配置一遍。
另外還需要配置用戶名和密碼,但是因?yàn)檫@是敏感信息,一般我們放在local.properties中,這個(gè)文件一般會加入.gitignore被git忽略,這樣就不會上傳到代碼倉庫中
#maven賬號 USERNAME=xxxx#maven密碼 PASSWORD=xxxx最后還需要在Android Library下的gradle.properties中配置:
#名稱(最好與PROJ_ARTIFACTID相同) PROJ_NAME=xxx#模塊名(maven的artifactId) PROJ_ARTIFACTID=xxxxPROJ_POM_NAME=Local Repository編寫發(fā)布代碼
首先在Android Library下的build.gradle中添加maven插件
apply plugin: 'maven'然后就可以編寫發(fā)布代碼了,完整代碼如下:
def isReleaseBuild() {return android.defaultConfig.versionName.contains("SNAPSHOT") == false }def sonatypeRepositoryUrl if (isReleaseBuild()) {sonatypeRepositoryUrl = RELEASE_REPOSITORY_URL } else {sonatypeRepositoryUrl = SNAPSHOT_REPOSITORY_URL }afterEvaluate { project ->uploadArchives {repositories {mavenDeployer {//beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }pom.artifactId = PROJ_ARTIFACTIDProperties properties = new Properties()properties.load(project.rootProject.file('local.properties').newDataInputStream())repository(url: sonatypeRepositoryUrl) {authentication(userName: properties.getProperty("USERNAME"), password: properties.getProperty("PASSWORD"))}pom.project {name PROJ_NAMEgroupId PROJ_GROUPversion android.defaultConfig.versionName// scm { // url POM_SCM_URL // connection POM_SCM_CONNECTION // developerConnection POM_SCM_DEV_CONNECTION // }licenses {license {name PROJ_LICENCE_NAMEurl PROJ_LICENCE_URLdistribution PROJ_LICENCE_DEST}}developers {developer {id DEVELOPER_IDname DEVELOPER_NAME}}}}}}// signing { // required { isReleaseBuild() && gradle.taskGraph.hasTask("uploadArchives") } // sign configurations.archives // }task androidJavadocs(type: Javadoc) {failOnError falsesource = android.sourceSets.main.java.sourceoptions {links "http://docs.oracle.com/javase/7/docs/api/"linksOffline "http://d.android.com/reference", "${android.sdkDirectory}/docs/reference"}classpath += project.android.libraryVariants.toList().first().javaCompile.classpathclasspath += project.files(android.getBootClasspath().join(File.pathSeparator))}task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) {classifier = 'javadoc'//basename = artifact_idfrom androidJavadocs.destinationDir}task androidSourcesJar(type: Jar) {classifier = 'sources'from android.sourceSets.main.java.srcDirs}artifacts {//archives packageReleaseJararchives androidSourcesJararchives androidJavadocsJar} }發(fā)布到maven倉庫
在Android studio右側(cè)欄的gradle中選擇要發(fā)布的Module,找到定義好的task,雙擊運(yùn)行即可,如圖
多個(gè)Android Library發(fā)布問題處理
上面我們提到,可以在一個(gè)項(xiàng)目中同時(shí)維護(hù)多個(gè)Android Library,但是按照上面的步驟發(fā)布的時(shí)候就會失敗,問題如下:
Could not transfer artifact xxx from/to remote (http://xxx): Failed to transfer file: http://xxx. Return code is: 400, ReasonPhrase: Bad Request.
仔細(xì)觀察gradle日志就會發(fā)現(xiàn),當(dāng)我們通過上面方式發(fā)布其中一個(gè)Android Library時(shí),項(xiàng)目所有的Android Library都會重新編譯并發(fā)布,但是其它Android Library并沒有改變,所以沒有升級版本,maven倉庫如果發(fā)現(xiàn)發(fā)布了同樣的版本(一般release倉庫會有這樣的設(shè)置,防止誤操作導(dǎo)致問題)就會返回上面的錯(cuò)誤。
一個(gè)解決方法是通過命令進(jìn)行發(fā)布:
./gradlew xxx:uploadArchives這里xxx就是模塊名,這樣就會只編譯發(fā)布這一個(gè)模塊。
當(dāng)然我們也可以通過修改發(fā)布代碼來解決這個(gè)問題,在build.gradle中添加一個(gè)task如下:
task mavenUploadxxx (dependsOn: uploadArchives){group 'upload' }同樣這里xxx替換成模塊名,這里我們將這個(gè)task放在了upload這個(gè)組里,如果不設(shè)置會默認(rèn)放在other組里,但是這個(gè)組里task比較多,找起來不方便。
sync同步后在gradle的面板中對應(yīng)的Module的upload組中就會發(fā)現(xiàn)多出一個(gè)mavenUploadxxx的task,雙擊執(zhí)行這個(gè)task就會只編譯發(fā)布這個(gè)Android Library。
使用Library
使用就比較簡單了,首先添加倉庫
allprojects {repositories {...maven {url 'http://xxx/nexus/content/groups/public/'}} }然后在項(xiàng)目的build.gradle中添加依賴就可以了。
問題總結(jié)
在這個(gè)過程中也遇到了一些問題,這里簡單總結(jié)一下:
1、發(fā)布到Snapshot的時(shí)候返回400錯(cuò)誤:
Return code is: 400, ReasonPhrase: Bad Request.
這是因?yàn)榘姹久e(cuò)了,發(fā)布到Snapshot的版本格式必須是x.x.x-SNAPSHOT,“-SNAPSHOT”必須在后面,否則會報(bào)400錯(cuò)誤。
注意:相關(guān)錯(cuò)誤,如發(fā)布到release的版本中有“-SNAPSHOT“也會報(bào)錯(cuò);release不允許重復(fù)發(fā)布,所以如果已經(jīng)有這個(gè)項(xiàng)目的這個(gè)版本,再次發(fā)布就會出錯(cuò),而Snapshot一般支持重復(fù)發(fā)布
2、發(fā)布的時(shí)候返回401錯(cuò)誤:
Return code is: 401, ReasonPhrase: Unauthorized
這是因?yàn)闆]有配置用戶名密碼,或配置錯(cuò)了。 Sonatype Nexus默認(rèn)用戶名admin密碼admin123,但是建議及時(shí)修改。
3、Sonatype Nexus中倉庫:
public:倉庫組。代理其他倉庫,用于外部引用。(即如果要使用Maven引入項(xiàng)目,則maven中心配置成這個(gè)倉庫的url)
snapshot:快照庫。用于提交快照版本,需要用戶名密碼。
release:正式庫。用于提交正式版本,需要用戶名密碼。
總結(jié)
以上是生活随笔為你收集整理的如何发布Android Library到maven私有仓库的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IntentService详解
- 下一篇: 安装使用Frida在Android上进行