本篇文章已授權微信公衆号 dasu_Android(大蘇)獨家釋出
這周末自己瞎折磨了下,如何釋出開源庫到 JCenter,然後這過程中碰到了一些問題,在此記錄分享一下
本篇是基于上一篇:教你一步步釋出一個開源庫到 JCenter 介紹的流程、步驟中所遇到的問題,是以沒看過上一篇的,可以去看看哈~
- Error:No service of type Factory available in ProjectScopeServices.
原因:android-maven-gradle-plugin 插件的 bug
解決:更換版本,本次測試出問題版本 1.3,更改為 1.4.1 後正常
做法:在根目錄的 build.gradle 檔案中修改插件版本:
dependencies {
classpath 'com.github.dcendents:android-maven-gradle-plugin:1.4.1'
}
- Error:Could not get unknown property 'publishedGroupId' for project ':tv' of type org.gradle.api.Project.
原因:apply from 'https://raw.githubusercontent.com/nuuneoi/JCenter/master/installv1.gradle' 代碼放錯位置
解決:由于上述 apply from 代碼的意思是使用存儲在網上的腳本模闆檔案,模闆檔案中使用了很多還未聲明的變量,是以 apply from 這行代碼應該放置在 ext {} 變量聲明代碼塊之後
做法: build.gradle 檔案中以下幾行代碼應該按順序來,第一行 apply from: 'bintray-config.gradle' 其實就是腳本模闆檔案中的變量聲明,指派代碼,也就是 ext{} 代碼塊,隻是将其單獨放置于一個 gradle 檔案中,這裡也可以直接将 ext{} 代碼替換掉 apply from: 'bintray-config.gradle'
apply from: 'bintray-config.gradle'
//ext{} 變量聲明,指派代碼塊必須在以下兩個腳本模闆檔案之前
apply from: 'https://raw.githubusercontent.com/nuuneoi/JCenter/master/installv1.gradle'
apply from: 'https://raw.githubusercontent.com/nuuneoi/JCenter/master/bintrayv1.gradle'
- Error:Cause: android.compileSdkVersion is missing!
原因:apply from: 'https://raw.githubusercontent.com/nuuneoi/JCenter/master/bintrayv1.gradle' 代碼放錯位置
解決:跟 2 的理由類似,這個腳本是用于将本地生成的 pom,aar 等檔案上傳至 bintray 倉庫,但這個腳本的運作需要依賴于一些 android {} 塊的屬性配置;是以并不是所有 apply from 的代碼都是放置于 build.gradle 的開頭,這裡建議将 第 2 中的三個 apply from 代碼都放置于 build.gradle 檔案末尾。
以上 1-3 問題均是在上一篇中的步驟,第 2 步:配置本地 gradle 腳本插件,的過程中操作不當導緻的
- Execution failed for task ':tv :javadoc.
原因:執行
gradlew install
建構過程中出錯,這是由于執行生成 javadoc 過程中出問題,至于為什麼出問題可以具體檢視日志,例如我這裡:
我這裡是由于在代碼中有中文,是以導緻的建構錯誤
解決:有沒有其他解決方案我不清楚,我又不想将這些中文注釋給删除掉,那麼我隻能将這個 javadoc 的 task 給關掉了,反正我上傳到 JCenter 上的開源庫也隻是我自己在用,不需要 javadoc 文檔
做法:由于 javadoc 的 task 是在 bintray 提供的腳本模闆檔案中,是以隻能修改這個模闆檔案,那麼在上一篇的第 2 步:配置本地 gradle 腳本插件,就不能用
apply from 'http://...'
的形式了,因為這種形式無法修改模闆檔案。
那麼就需要在本地建立一個 installv1.gradle 檔案,然後将這個腳本檔案裡的代碼拷貝進這個建立的檔案中:
//将下面所有的 javadoc task 注釋掉,不用這個功能
apply plugin: 'com.jfrog.bintray'
version = libraryVersion
if (project.hasProperty("android")) { // Android libraries
task sourcesJar(type: Jar) {
classifier = 'sources'
from android.sourceSets.main.java.srcDirs
}
//1. 這裡是第1處
// task javadoc(type: Javadoc) {
// source = android.sourceSets.main.java.srcDirs
// classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
// }
} else { // Java libraries
task sourcesJar(type: Jar, dependsOn: classes) {
classifier = 'sources'
from sourceSets.main.allSource
}
}
//2. 這裡是第2處
//task javadocJar(type: Jar, dependsOn: javadoc) {
// classifier = 'javadoc'
// from javadoc.destinationDir
//}
artifacts {
//3. 這裡是第3處
// archives javadocJar
archives sourcesJar
}
// Bintray
Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
bintray {
user = properties.getProperty("bintray.user")
key = properties.getProperty("bintray.apikey")
println user
println key
configurations = ['archives']
pkg {
repo = bintrayRepo
name = bintrayName
desc = libraryDescription
websiteUrl = siteUrl
vcsUrl = gitUrl
licenses = allLicenses
publish = true
publicDownloadNumbers = true
version {
desc = libraryDescription
gpg {
sign = true //Determines whether to GPG sign the files. The default is false
passphrase = properties.getProperty("bintray.gpg.password")
//Optional. The passphrase for GPG signing'
}
}
}
}
然後在 module 下的 build.gradle 檔案的末尾中,将原本的 apply from 代碼換成下面的:
apply from: 'bintray-config.gradle'
apply from: 'bintrayv1.gradle'
apply from: 'https://raw.githubusercontent.com/nuuneoi/JCenter/master/installv1.gradle'
上面兩個 apply from 是指使用 本地腳本檔案,最後一個 apply from 是指使用網絡上的腳本檔案,本地腳本檔案可以任自己修改
- 提幾點 bintray 網站操作的一些注意事項
- 新增賬號的時候 qq 郵箱不能使用,建議使用 gmail 郵箱
- 在 bintray 上建立完倉庫後,也順便将 package 建立了吧,package 對應着本地項目中一個 module,至于不建立 package,直接在本地執行上傳操作能否可行,我沒測試過
- ext {} 變量聲明的代碼塊裡,具體哪些屬性值可以不配置,我沒測試過,但感覺還是按模闆來,将每個屬性都進行配置比較好
最近(2018-03)剛開通了公衆号,想激勵自己堅持寫作下去,初期主要分享原創的Android或Android-Tv方面的小知識,準備可能還有點不足,感興趣的可以先點一波關注,謝謝支援~~