JAVA语言之借助Gradle Plugin解决模块化开发中模块如何对外暴露接口
小标 2019-04-25 来源 : 阅读 1103 评论 0

摘要:本文主要向大家介绍了JAVA语言之借助Gradle Plugin解决模块化开发中模块如何对外暴露接口,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。

本文主要向大家介绍了JAVA语言之借助Gradle Plugin解决模块化开发中模块如何对外暴露接口,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。

JAVA语言之借助Gradle Plugin解决模块化开发中模块如何对外暴露接口

直奔主题,在模块化开发中,模块间的数据交流大多数同学会采用以接口作为通信协议的方式。需要面对的问题有以下几点:


接口由谁来维护?
这个问题简单,由提供服务的模块来维护。
接口怎么暴露?
打成jar包,发布到maven。
接口在哪里维护?
现在可以参考的方案有三种:一. 所有相关模块的接口统一在一个模块中维护;二. 各个模块的接口分别在自建一个新的模块中维护,通过命名规则一一对应;三. 像微信的.api方案,使用特殊的规则混杂在各自的模块中。


如果接着第一个问题,方案一好像就有点难确定接口对应的来源模块。方案二会出现接口模块成倍增加,极易出现一个模块只含一个接口类的现象。方案三需要自定义相关插件,在创建接口时会有点不便,不够灵活。


MIS登场!!!接下来先介绍mis的简单使用以及背后的原理。
MIS
模块接口服务(Module Interface Service)
MIS是从微信的.api方案演变而来,主要解决的问题是如何在一个模块内维护其对外暴露的接口(包括打包发布),而不是把接口和接口实现分离到两个不同的模块。



Usage
引用 mis 插件
在根项目的build.gradle中添加mis插件的classpath:


在根项目的build.gradle中添加mis插件的classpath:


在模块的build.gradle中添加mis插件:


...
apply plugin: 'mis'


创建 mis 目录
Gradle Sync后,在java同级目录创建mis文件夹


定义接口,并实现接口服务
直接在mis文件夹下,创建对应的包名、接口类和数据Model。并在java文件夹下实现接口服务。

配置mis相对应的publication


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。


发布至Maven


mis {
    publications {
        main {
            groupId 'com.eastwood.demo'
            artifactId 'library-sdk'
            version '1.0.0-SNAPSHOT'
            ...
        }
    }

    repositories {
        maven {
            url "//***"
            credentials {
                username '***'
                password '***'
            }
        }
    }
    ...
}


发布时需设置version。


发布时内部用到的插件是maven-publish
Gradle Sync后,打开Gradle Tasks View,选择publishMis[...]PublicationToMavenRepository执行发布任务。



其中publishMis[...]PublicationToMavenLocal 是发布至本地maven。如果使用本地maven,请将mavenLocal()添加至根项目的build.gradle中,比如:


allprojects {
    repositories {
        google()
        jcenter()
        mavenLocal()
    }
}


Q&A
1.mis目录下的类会参与编译吗?
不会。虽然mis目录下的类能被java目录下的类直接引用,但不会参与编译,真正参与编译的是该mis目录生成的jar包,其位于当前工程.gradle/mis下。在当前工程Sync&Build的时候,mis插件会对这些配置了publication的mis目录进行编译打包生成jar包,并且依赖该jar包。
mis目录下的类之所以能被java目录下的类直接引用,是因为mis目录被设置为sourceSets aidl的src目录,而Android Studio对sourceSets aidl的src目录有特别支持。
2.没有Maven私服,所有模块都在一个工程下,其他模块怎么引用接口?
不设置publication的version。通过misPublication声明依赖,比如:


dependencies {
    ...
    implementation misPublication('com.eastwood.demo:library-sdk')
}


misPublication运行机理是会自动在当前工程.gradle/mis下查找是否有对应的mis提供的jar包。如果有,就使用对应的mis提供的jar包;如果没有且指定了version,就使用maven上的jar包。
3.将接口发布到maven后,其他模块通过misPublication声明依赖,那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包。
4.为什么在Gradle Tasks View中找不到publishing相关发布Task?
初次发布时,请检查对应的publication是否已经设置的version,以及是否添加相关repositories。


本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注编程语言JAVA频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程