如何发布Android Library到maven私有仓库
前言
在我們的項目架構中,一定存在一些基礎的模塊,這些模塊可以在多個app上通用,這種情況我們一般會將這些模塊封裝成Android Library統一維護,并上傳到倉庫方便其他小組使用。倉庫可以選擇如mavenCentral這類公開的倉庫,但是我們一般選擇搭建自己的maven私有倉庫,比如:Sonatype Nexus。本文就一步步的教大家如何將Android Library發布到maven私有倉庫。
添加maven倉庫配置
在項目的根目錄下的gradle.properties中添加私有倉庫的配置,如下:
# 包信息(包名,及Maven的group,必填) PROJ_GROUP=com.xxx.xxx # 項目的描述(描述性信息,不影響maven上傳) PROJ_WEBSITEURL=http://xxxxx PROJ_ISSUETRACKERURL=http://xxxxx PROJ_VCSURL=xxxxx PROJ_DESCRIPTION=xxxx# Licence信息(嚴格按下面填寫,不要變) 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 信息(開發者信息,不影響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中是因為我們一個項目可能存在多個Android Library需要上傳到maven,這樣就不用在每個module下都配置一遍。
另外還需要配置用戶名和密碼,但是因為這是敏感信息,一般我們放在local.properties中,這個文件一般會加入.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編寫發布代碼
首先在Android Library下的build.gradle中添加maven插件
apply plugin: 'maven'然后就可以編寫發布代碼了,完整代碼如下:
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} }發布到maven倉庫
在Android studio右側欄的gradle中選擇要發布的Module,找到定義好的task,雙擊運行即可,如圖
多個Android Library發布問題處理
上面我們提到,可以在一個項目中同時維護多個Android Library,但是按照上面的步驟發布的時候就會失敗,問題如下:
Could not transfer artifact xxx from/to remote (http://xxx): Failed to transfer file: http://xxx. Return code is: 400, ReasonPhrase: Bad Request.
仔細觀察gradle日志就會發現,當我們通過上面方式發布其中一個Android Library時,項目所有的Android Library都會重新編譯并發布,但是其它Android Library并沒有改變,所以沒有升級版本,maven倉庫如果發現發布了同樣的版本(一般release倉庫會有這樣的設置,防止誤操作導致問題)就會返回上面的錯誤。
一個解決方法是通過命令進行發布:
./gradlew xxx:uploadArchives這里xxx就是模塊名,這樣就會只編譯發布這一個模塊。
當然我們也可以通過修改發布代碼來解決這個問題,在build.gradle中添加一個task如下:
task mavenUploadxxx (dependsOn: uploadArchives){group 'upload' }同樣這里xxx替換成模塊名,這里我們將這個task放在了upload這個組里,如果不設置會默認放在other組里,但是這個組里task比較多,找起來不方便。
sync同步后在gradle的面板中對應的Module的upload組中就會發現多出一個mavenUploadxxx的task,雙擊執行這個task就會只編譯發布這個Android Library。
使用Library
使用就比較簡單了,首先添加倉庫
allprojects {repositories {...maven {url 'http://xxx/nexus/content/groups/public/'}} }然后在項目的build.gradle中添加依賴就可以了。
問題總結
在這個過程中也遇到了一些問題,這里簡單總結一下:
1、發布到Snapshot的時候返回400錯誤:
Return code is: 400, ReasonPhrase: Bad Request.
這是因為版本名錯了,發布到Snapshot的版本格式必須是x.x.x-SNAPSHOT,“-SNAPSHOT”必須在后面,否則會報400錯誤。
注意:相關錯誤,如發布到release的版本中有“-SNAPSHOT“也會報錯;release不允許重復發布,所以如果已經有這個項目的這個版本,再次發布就會出錯,而Snapshot一般支持重復發布
2、發布的時候返回401錯誤:
Return code is: 401, ReasonPhrase: Unauthorized
這是因為沒有配置用戶名密碼,或配置錯了。 Sonatype Nexus默認用戶名admin密碼admin123,但是建議及時修改。
3、Sonatype Nexus中倉庫:
public:倉庫組。代理其他倉庫,用于外部引用。(即如果要使用Maven引入項目,則maven中心配置成這個倉庫的url)
snapshot:快照庫。用于提交快照版本,需要用戶名密碼。
release:正式庫。用于提交正式版本,需要用戶名密碼。
總結
以上是生活随笔為你收集整理的如何发布Android Library到maven私有仓库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IntentService详解
- 下一篇: 安装使用Frida在Android上进行