直奔主題,在模塊化開發中,模塊間的數據交流大多數同窗會採用以接口做爲通訊協議的方式。須要面對的問題有如下幾點:html
接口由誰來維護?java
這個問題簡單,由提供服務的模塊來維護。git
接口怎麼暴露?github
打成jar包,發佈到maven。apache
接口在哪裏維護?api
如今能夠參考的方案有三種:一. 全部相關模塊的接口統一在一個模塊中維護;二. 各個模塊的接口分別在自建一個新的模塊中維護,經過命名規則一一對應;三. 像微信的.api方案,使用特殊的規則混雜在各自的模塊中。bash
若是接着第一個問題,方案一好像就有點難肯定接口對應的來源模塊。方案二會出現接口模塊成倍增長,極易出現一個模塊只含一個接口類的現象。方案三須要自定義相關插件,在建立接口時會有點不便,不夠靈活。微信
MIS登場!!!接下來先介紹mis的簡單使用以及背後的原理。app
模塊接口服務(Module Interface Service)maven
MIS是從微信的.api方案演變而來,主要解決的問題是如何在一個模塊內維護其對外暴露的接口(包括打包發佈),而不是把接口和接口實現分離到兩個不一樣的模塊。
在根項目的build.gradle中添加mis插件的classpath:
buildscript {
dependencies {
...
classpath 'com.eastwood.tools.plugins:mis:1.3.5'
}
}
複製代碼
在模塊的build.gradle中添加mis插件:
...
apply plugin: 'mis'
複製代碼
Gradle Sync後,在java同級目錄建立mis文件夾
直接在mis文件夾下,建立對應的包名、接口類和數據Model。並在java文件夾下實現接口服務。
mis {
publications {
main {
groupId 'com.eastwood.demo'
artifactId 'library-sdk'
// version '1.0.0-SNAPSHOT'
dependencies {
compileOnly 'com.google.code.gson:gson:2.8.1'
}
}
}
...
}
複製代碼
main
指的是src/main/java
中的main
,除了main
以外,其值還能夠爲 build types和product flavors對應的值,即對應目錄下的mis。好比與src/debug/java
對應的src/debug/mis
。
groupId
、artifactId
、version
對應的是Maven的GAV。初次配置時不設置version
,發佈至maven時設置version
。
在dependencies
中可聲明該mis編譯和運行時需用到的第三方庫,僅支持compileOnly
和implementation
。
mis {
publications {
main {
groupId 'com.eastwood.demo'
artifactId 'library-sdk'
version '1.0.0-SNAPSHOT'
...
}
}
repositories {
maven {
url "http://***"
credentials {
username '***'
password '***'
}
}
}
...
}
複製代碼
發佈時需設置version
。
發佈時內部用到的插件是maven-publish
,其中repositories
相關設置請查閱# Maven Publish Plugin
Gradle Sync後,打開Gradle Tasks View,選擇publishMis[...]PublicationToMavenRepository執行發佈任務。
其中publishMis[...]PublicationToMavenLocal 是發佈至本地maven。若是使用本地maven,請將mavenLocal()
添加至根項目的build.gradle中,好比:
allprojects {
repositories {
google()
jcenter()
mavenLocal()
}
}
複製代碼
不會。雖然mis
目錄下的類能被java
目錄下的類直接引用,但不會參與編譯,真正參與編譯的是該mis
目錄生成的jar包,其位於當前工程.gradle/mis
下。在當前工程Sync&Build的時候,mis插件會對這些配置了publication的mis
目錄進行編譯打包生成jar包,而且依賴該jar包。
mis
目錄下的類之因此能被java
目錄下的類直接引用,是由於mis
目錄被設置爲sourceSets aidl的src目錄,而Android Studio對sourceSets aidl的src目錄有特別支持。
不設置publication
的version
。經過misPublication
聲明依賴,好比:
dependencies {
...
implementation misPublication('com.eastwood.demo:library-sdk')
}
複製代碼
misPublication
運行機理是會自動在當前工程.gradle/mis
下查找是否有對應的mis提供的jar包。若是有,就使用對應的mis提供的jar包;若是沒有且指定了version
,就使用maven上的jar包。
.gradle/mis
下的仍是maven上的?接口被髮布到maven後,其.gradle/mis
下的jar包會被刪除,接口所在的模塊根據publication
中設置的GAV使用maven上的jar包。若是其餘模塊經過misPublication聲明對其依賴,好比:
dependencies {
...
implementation misPublication('com.eastwood.demo:library-sdk')
// 或 implementation misPublication('com.eastwood.demo:library-sdk:1.0.0-SNAPSHOT')
}
複製代碼
無論misPublication
中是否設置了的version
,都會使用maven上的jar包,其版本同接口所在的模塊publication
中的GAV。
當mis
目錄下類發生實質性的修改後(生成不一樣的jar包),在當前工程Sync&Build的時,會在.gradle/mis
下的從新生成jar包,接口所在的模塊無論publication
中是否設置version
,都使用.gradle/mis
下的jar包。若是其餘模塊經過misPublication聲明對其依賴,無論misPublication
中是否設置的version
,都會使用.gradle/mis
下的jar包。
publishing
相關發佈Task?初次發佈時,請檢查對應的publication
是否已經設置的version
,以及是否添加相關repositories
。
MIS已經上傳至Github,歡迎star交流。QQ 1056453754