開發過程當中,若是你寫了一個工具類,想給其餘項目使用的話,一般都是將它抽到lib目錄供其餘項目使用: java
而後在調用項目下引入相關的Lib: react
那若是想使用的項目和咱們公用的lib不在一個目錄呢?按照之前老的方式,譬如拷貝文件,打包jar的方式雖然又不是不能用,可是不只便於維護和修改,若是每次改動,每一個地方都要操做造做一遍,並且若是有資源文件就更麻煩了,那麼能不能跟第三方開源庫同樣:一個地方完成修改,引用到的地方一行代碼就能解決?android
implementation "io.reactivex.rxjava2:rxjava:2.x.y" 複製代碼
方案固然是有的,網上也有不少現成方案,我這邊精簡和整理了一下,今天就給你們一個步驟模板,方便你們快速發佈和共享本身的代碼,少踩坑和走彎路。git
這裏注意要註冊右邊的開源帳號,千萬注意不要註冊成左邊的綠色按鈕了,後面會很麻煩。 github
到目前爲止,個人準備工做已經基本到位,回顧一下幾個關鍵信息:web
dependencies { classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5' classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7.3' } 複製代碼
apply plugin: 'com.github.dcendents.android-maven' apply plugin: 'com.jfrog.bintray' def siteUrl = 'https://www.google.com/' //可選 若是有的話 def gitUrl = 'https://www.google.com/' //可選 若是有的話 group = "com.share" //路徑 version = "0.0.2.release" //版本名稱, 不要用beta,不然容易審覈不經過 //以上兩個配合項目目錄名最終上傳上去引用就是 compile 'com.share:tools:0.0.2.release' 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 } task copyDoc(type: Copy) { from "${buildDir}/docs/" into "docs" } artifacts { archives javadocJar archives sourcesJar } install { repositories.mavenInstaller { // This generates POM.xml with proper parameters pom { project { packaging 'aar' name 'is permission tool for android' url siteUrl licenses { license { name 'The Apache Software License, Version 2.0' url 'http://www.apache.org/licenses/LICENSE-2.0.txt' } } developers { developer { id 'soulqw' //用戶名 name 'qinwei' //姓名 email 'cd5160866@126.com' //郵箱 } } scm { connection gitUrl developerConnection gitUrl url siteUrl } } } } } Properties properties = new Properties() properties.load(project.rootProject.file('local.properties').newDataInputStream()) bintray { //關鍵信息咱們從localProperties文件中讀取 user = properties.getProperty("bintray.user") key = properties.getProperty("bintray.apikey") configurations = ['archives'] pkg { repo = "TestRepository" // 倉庫名 name = "MyTools"// 包名 desc = 'just tools' websiteUrl = siteUrl vcsUrl = gitUrl licenses = ["Apache-2.0"] publish = true } } javadoc { options { encoding "UTF-8" charSet 'UTF-8' author true version true links "http://docs.oracle.com/javase/7/docs/api" } } 複製代碼
上面填入了咱們須要傳項目的版本號,其中group、version、和項目目錄合併起來的終樣式規則以下: apache
最後後在localProperties文件中填入咱們的用戶名和ApiKey: 完成以上步驟之後,打開終端到項目目錄下,輸入:./gradlew install bintrayUpload
複製代碼
而後成功以下: api
再來看看咱們傳上去的庫 markdown
那麼咱們最終的引用方式就是:dependencies { // implementation project(':tools') implementation 'com.share:tools:0.0.2.release' } 複製代碼
注意:oracle
描述儘可能填寫就好,通常幾個小時到一兩天就審覈經過可用了。 若是審覈被拒絕,會跟你描述爲什麼被拒絕,按照他的要求再次修改並回復郵件,便可從新審覈:
一旦審覈經過,後續只要修改版本名稱的迭代都不須要再次審覈了
dependencies { implementation 'com.android.support:appcompat-v7:28.0.0' } 複製代碼
而你應用的項目也使用了這個庫,可是它們各自所依賴的版本號不一致,這樣應用項目在引入這個lib時候編輯就容易因版本號不一致而報錯,正確的姿式就是講lib對 相應庫的依賴由 implementation 改成 compileOnly 或者由 compile 改成 provided
dependencies { //這樣引用容易引起衝突,改成compileOnly 僅僅lib內可用 // implementation 'com.android.support:appcompat-v7:28.0.0' compileOnly 'com.android.support:appcompat-v7:28.0.0' } 複製代碼
如下是幾個gradle中新老配置的變化對照表:
新配置 | 老配置 | 行爲 |
---|---|---|
implementation | compile | 依賴項在編譯時對模塊可用,而且僅在運行時對模塊的消費者可用。 對於大型多項目構建,使用 implementation 而不是 api/compile 能夠顯著縮短構建時間,由於它能夠減小構建系統須要從新編譯的項目量。 大多數應用和測試模塊都應使用此配置。 |
api | compile | 依賴項在編譯時對模塊可用,而且在編譯時和運行時還對模塊的消費者可用。 此配置的行爲相似於 compile(如今已棄用),通常狀況下,您應當僅在庫模塊中使用它。 應用模塊應使用 implementation,除非您想要將其 API 公開給單獨的測試模塊。 |
compileOnly | provided | 依賴項僅在編譯時對模塊可用,而且在編譯或運行時對其消費者不可用。 此配置的行爲相似於 provided(如今已棄用)。 |
runtimeOnly | apk | 依賴項僅在運行時對模塊及其消費者可用。 此配置的行爲相似於 apk(如今已棄用)。 |
後來隨着項目的發展,咱們的項目慢慢遷移到了kotlin,後來又出現了以Kotlin作爲工具的類:
更新了方法、版本號++、
upLoad、
而後。。。
原來kotlin文件生成javadoc文檔默認會報錯,查閱了相關資料,只要在gradle文件添加一些配置就行了,so:classpath "org.jetbrains.dokka:dokka-gradle-plugin:0.9.18" 複製代碼
那麼完整的文件就應該是這樣:
// Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { ext.kotlin_version = '1.3.10' repositories { google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.4.0' //upload classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5' classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7.3' //kotlin classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" //for kotlin upload classpath "org.jetbrains.dokka:dokka-gradle-plugin:0.9.18" } } allprojects { repositories { google() jcenter() } } task clean(type: Delete) { delete rootProject.buildDir } 複製代碼
再回到咱們tools的gradle文件,補上:
//for kotlin upload apply plugin: 'org.jetbrains.dokka' //同時添加三個方法 for kotlin task dokkaJavadoc(type: org.jetbrains.dokka.gradle.DokkaTask) { outputFormat = 'javadoc' outputDirectory = javadoc.destinationDir } task generateJavadoc(type: Jar, dependsOn: dokkaJavadoc) { group = 'jar' classifier = 'javadoc' from javadoc.destinationDir } task generateSourcesJar(type: Jar) { group = 'jar' from android.sourceSets.main.java.srcDirs classifier = 'sources' } 複製代碼
artifacts 中替換爲:
artifacts { archives generateJavadoc //javadocJar archives generateSourcesJar //sourcesJar } 複製代碼
那麼這麼下來上傳java 又能上傳kotlin的最終模版就是:
apply plugin: 'com.android.library' apply plugin: 'kotlin-android' //for upload apply plugin: 'com.github.dcendents.android-maven' apply plugin: 'com.jfrog.bintray' //for kotlin upload apply plugin: 'org.jetbrains.dokka' android { compileSdkVersion 28 defaultConfig { minSdkVersion 14 targetSdkVersion 28 versionCode 2 versionName "0.0.3" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } } dependencies { //這樣引用容易引起衝突,改成compileOnly 僅僅lib內可用 // implementation 'com.android.support:appcompat-v7:28.0.0' compileOnly 'com.android.support:appcompat-v7:28.0.0' compileOnly "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" } def siteUrl = 'https://www.google.com/' //可選 若是有的話 def gitUrl = 'https://www.google.com/' //可選 若是有的話 group = "com.share" //路徑 version = "0.0.3.release" //版本名稱, 不要用beta,不然容易審覈不經過 //以上兩個配合項目目錄名最終上傳上去引用就是 compile 'com.share:tools:0.0.2.release' 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 } //同時添加三個方法 for kotlin task dokkaJavadoc(type: org.jetbrains.dokka.gradle.DokkaTask) { outputFormat = 'javadoc' outputDirectory = javadoc.destinationDir } task generateJavadoc(type: Jar, dependsOn: dokkaJavadoc) { group = 'jar' classifier = 'javadoc' from javadoc.destinationDir } task generateSourcesJar(type: Jar) { group = 'jar' from android.sourceSets.main.java.srcDirs classifier = 'sources' } task copyDoc(type: Copy) { from "${buildDir}/docs/" into "docs" } //for java only //artifacts { // archives javadocJar // archives sourcesJar //} //for kotlin artifacts { archives generateJavadoc //javadocJar archives generateSourcesJar //sourcesJar } install { repositories.mavenInstaller { // This generates POM.xml with proper parameters pom { project { packaging 'aar' name 'is permission tool for android' url siteUrl licenses { license { name 'The Apache Software License, Version 2.0' url 'http://www.apache.org/licenses/LICENSE-2.0.txt' } } developers { developer { id 'soulqw' //用戶名 name 'qinwei' //姓名 email 'cd5160866@126.com' //郵箱 } } scm { connection gitUrl developerConnection gitUrl url siteUrl } } } } } Properties properties = new Properties() properties.load(project.rootProject.file('local.properties').newDataInputStream()) bintray { //關鍵信息咱們從localProperties文件中讀取 user = properties.getProperty("bintray.user") key = properties.getProperty("bintray.apikey") configurations = ['archives'] pkg { repo = "TestRepository" // 倉庫名 name = "MyTools"// 包名 desc = 'just tools' websiteUrl = siteUrl vcsUrl = gitUrl licenses = ["Apache-2.0"] publish = true } } javadoc { options { encoding "UTF-8" charSet 'UTF-8' author true version true links "http://docs.oracle.com/javase/7/docs/api" } } 複製代碼
再輸入上傳命令,就能夠了:
基本上按照完整的以上流程,就不會有什麼上傳的問題,通常都能經過
最後留意下localproperties文件的配置便可