開發過程當中,若是你寫了一個工具類,想給其餘項目使用的話,一般都是將它抽到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
./gradlew install bintrayUpload
複製代碼
而後成功以下: api
再來看看咱們傳上去的庫 oracle
dependencies {
// implementation project(':tools')
implementation 'com.share:tools:0.0.2.release'
}
複製代碼
注意:app
描述儘可能填寫就好,通常幾個小時到一兩天就審覈經過可用了。 若是審覈被拒絕,會跟你描述爲什麼被拒絕,按照他的要求再次修改並回復郵件,便可從新審覈:
一旦審覈經過,後續只要修改版本名稱的迭代都不須要再次審覈了
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、
而後。。。
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文件的配置便可