java 模块分离部署_GitHub - yangjiu/Mis: 模块接口服务,如何在一个模块内维护其对外暴露的接口(包括打包发布),而不是把接口和接口实现分离到两个不同的模块?...
MIS
模塊接口服務(wù)(Module Interface Service)
MIS主要解決的問題是如何在一個(gè)模塊內(nèi)維護(hù)其對(duì)外暴露的接口(包括打包發(fā)布),而不是把接口和接口實(shí)現(xiàn)分離到兩個(gè)不同的模塊。
Usage
引用 mis 插件
在根項(xiàng)目的build.gradle中添加mis插件的classpath:
buildscript {
dependencies {
...
classpath 'com.eastwood.tools.plugins:mis:2.0.2'
}
}
在根項(xiàng)目的build.gradle中添加mis插件的相關(guān)配置:
...
apply plugin: 'mis'
mis {
compileSdkVersion 27
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
compileSdkVersion 同 android { compileSdkVersion ... }
compileOptions 同 android { compileOptions { ... } }
創(chuàng)建 mis 目錄
Gradle Sync后,在java同級(jí)目錄創(chuàng)建mis文件夾
定義接口,并實(shí)現(xiàn)接口服務(wù)
直接在mis文件夾下,創(chuàng)建對(duì)應(yīng)的包名、接口類和數(shù)據(jù)Model。并在java文件夾下實(shí)現(xiàn)接口服務(wù)。
在模塊目錄內(nèi),創(chuàng)建單獨(dú)的mis.gradle文件, 并在內(nèi)聲明mis對(duì)應(yīng)的publication
mis.gradle:
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對(duì)應(yīng)的值,即對(duì)應(yīng)目錄下的mis。比如與src/debug/java對(duì)應(yīng)的src/debug/mis。
groupId、artifactId、version對(duì)應(yīng)的是Maven的GAV。初次配置時(shí)不設(shè)置version,發(fā)布至maven時(shí)設(shè)置version。
在dependencies中可聲明該mis Publication編譯和運(yùn)行時(shí)需用到的第三方庫,僅支持compileOnly和implementation。如果mis文件夾下的類使用了kotlin語法,需要添加kotlin相關(guān)的依賴,比如'org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version'。
發(fā)布mis publication 至 Maven
在根項(xiàng)目的build.gradle中添加mis插件的repositories配置:
mis {
compileSdkVersion 27
...
repositories {
maven {
url "http://***"
credentials {
username '***'
password '***'
}
}
}
...
}
發(fā)布用到的插件是maven-publish,其中repositories相關(guān)設(shè)置請(qǐng)查閱# Maven Publish Plugin
Gradle Sync后,打開Gradle Tasks View,選擇publishMis[...]PublicationToMavenRepository執(zhí)行發(fā)布任務(wù)。
其中publishMis[...]PublicationToMavenLocal 是發(fā)布至本地maven。如果使用本地maven,請(qǐng)將mavenLocal()添加至根項(xiàng)目的build.gradle中,比如:
allprojects {
repositories {
google()
jcenter()
mavenLocal()
}
}
上文介紹了如何通過mis插件創(chuàng)建接口并發(fā)布到maven,接下來介紹接口的注冊(cè)和調(diào)用。
注冊(cè)接口服務(wù)
注冊(cè)接口需要有個(gè)服務(wù)容器來管理接口和接口的實(shí)現(xiàn)對(duì)象。mis提供了一個(gè)簡(jiǎn)單的MisService服務(wù)容器,可根據(jù)自己項(xiàng)目實(shí)際情況自行選用。
在模塊build.gradle中添加MisService服務(wù)容器庫的引用:
dependencies {
implementation 'com.eastwood.common:mis:1.0.0'
}
在MisService服務(wù)容器中注冊(cè)服務(wù),可以使用 服務(wù)接口 + 服務(wù)接口的實(shí)現(xiàn)對(duì)象 或 服務(wù)接口的實(shí)現(xiàn)類 進(jìn)行注冊(cè),例如:
// 服務(wù)接口 + 服務(wù)接口的實(shí)現(xiàn)對(duì)象
MisService.register(ILibraryService.class, new LibraryService());
// 服務(wù)接口 + 服務(wù)接口的實(shí)現(xiàn)類
MisService.register(ILibraryService.class, LibraryService.class);
在Demo樣例中,接口所在的模塊通過AutoInject在編譯期主動(dòng)注冊(cè)接口。(這推薦下#
獲取接口服務(wù)
在其他模塊build.gradle中添加mis庫,以及發(fā)布至maven的接口庫:
dependencies {
implementation 'com.eastwood.common:mis:1.0.0'
implementation 'com.eastwood.demo:library-sdk:1.0.0-SNAPSHOT'
}
Gradle Sync后,就可以通過接口在MisService服務(wù)容器中查找對(duì)應(yīng)的接口服務(wù)并調(diào)用,比如:
ILibraryService libraryService = MisService.getService(ILibraryService.class);
libraryService.getLibraryInfo()
Q&A
1.mis目錄下的類會(huì)參與編譯嗎?
不會(huì)。雖然mis目錄下的類能被java目錄下的類直接引用,但不會(huì)參與編譯,真正參與編譯的是該mis目錄生成的jar包,其位于當(dāng)前工程.gradle/mis下。在當(dāng)前工程Sync&Build的時(shí)候,mis插件會(huì)對(duì)這些配置了publication的mis目錄進(jìn)行編譯打包生成jar包,并且依賴該jar包。
mis目錄下的類之所以能被java目錄下的類直接引用,是因?yàn)閙is目錄被設(shè)置為sourceSets aidl的src目錄,而Android Studio對(duì)sourceSets aidl的src目錄有特別支持。
2.沒有Maven私服,所有模塊都在一個(gè)工程下,其他模塊怎么引用接口?
不設(shè)置publication的version。通過misPublication聲明依賴,比如:
dependencies {
...
implementation misPublication('com.eastwood.demo:library-sdk')
}
misPublication運(yùn)行機(jī)理是會(huì)自動(dòng)在當(dāng)前工程.gradle/mis下查找是否有對(duì)應(yīng)的mis提供的jar包。如果有,就使用對(duì)應(yīng)的mis提供的jar包;如果沒有且指定了version,就使用maven上的jar包。
3.將接口發(fā)布到maven后,其他模塊通過misPublication聲明依賴,那jar包用的是.gradle/mis下的還是maven上的?
接口被發(fā)布到maven后,其.gradle/mis下的jar包會(huì)被刪除,接口所在的模塊根據(jù)publication中設(shè)置的GAV使用maven上的jar包。如果其他模塊通過misPublication聲明對(duì)其依賴,比如:
dependencies {
...
implementation misPublication('com.eastwood.demo:library-sdk')
// 或 implementation misPublication('com.eastwood.demo:library-sdk:1.0.0-SNAPSHOT')
}
不管misPublication中是否設(shè)置了的version,都會(huì)使用maven上的jar包,其版本同接口所在的模塊publication中的GAV。
當(dāng)mis目錄下類發(fā)生實(shí)質(zhì)性的修改后(生成不同的jar包),在當(dāng)前工程Sync&Build的時(shí),會(huì)在.gradle/mis下的重新生成jar包,接口所在的模塊不管publication中是否設(shè)置version,都使用.gradle/mis下的jar包。如果其他模塊通過misPublication聲明對(duì)其依賴,不管misPublication中是否設(shè)置的version,都會(huì)使用.gradle/mis下的jar包。
4.為什么在Gradle Tasks View中找不到publishing相關(guān)發(fā)布Task?
初次發(fā)布時(shí),請(qǐng)檢查對(duì)應(yīng)的publication是否已經(jīng)設(shè)置的version,以及是否添加相關(guān)repositories。
5.在mis publication dependencies {}中聲明的依賴會(huì)作用于mis publication所在的模塊嗎?
mis publication dependencies {}是用于聲明mis publication編譯和運(yùn)行時(shí)需用到的第三方庫,但不會(huì)作用于mis publication所在的模塊。
在開發(fā)的時(shí)候,src/java下的類能引用到mis依賴的第三方庫類,但編譯時(shí)會(huì)報(bào)錯(cuò),提示找不到對(duì)應(yīng)的類。
產(chǎn)生這種情況的原因是mis插件在Gradle sync時(shí),將聲明的依賴傳遞給mis publication所在的模塊。但clean或build時(shí)不傳遞。
6.如果mis publication 依賴于其他mis publication怎么處理?
建議使用misPublication包裹GAV,比如:
mis {
publications {
main {
groupId 'com.eastwood.demo'
artifactId 'library-sdk'
dependencies {
implementation misPublication('com.eastwood.demo:module-main-sdk:1.0.0')
}
}
}
repositories {
...
}
}
這里misPublication的作用是,如果所依賴的mis publication也在當(dāng)前項(xiàng)目,那么與其所提供jar包的方式保持一致。
License
Copyright 2018 EastWood Yang
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
總結(jié)
以上是生活随笔為你收集整理的java 模块分离部署_GitHub - yangjiu/Mis: 模块接口服务,如何在一个模块内维护其对外暴露的接口(包括打包发布),而不是把接口和接口实现分离到两个不同的模块?...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python单目运算_Python --
- 下一篇: Php无刷新修改url,history