继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

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

holdtom
关注TA
已关注
手记 1885
粉丝 240
获赞 992


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

接口由谁来维护?

这个问题简单,由提供服务的模块来维护。

接口怎么暴露?

打成jar包,发布到maven。

接口在哪里维护?

现在可以参考的方案有三种:一. 所有相关模块的接口统一在一个模块中维护;二. 各个模块的接口分别在自建一个新的模块中维护,通过命名规则一一对应;三. 像微信的.api方案,使用特殊的规则混杂在各自的模块中。

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

MIS登场!!!接下来先介绍mis的简单使用以及背后的原理。

MIS

模块接口服务(Module Interface Service)

MIS是从微信的.api方案演变而来,主要解决的问题是如何在一个模块内维护其对外暴露的接口(包括打包发布),而不是把接口和接口实现分离到两个不同的模块。

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

Usage

引用 mis 插件

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

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

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

...

apply plugin: 'mis'

创建 mis 目录

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

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

定义接口,并实现接口服务

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

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

配置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 "http://***"

            credentials {

                username '***'

                password '***'

            }

        }

    }

    ...

}

发布时需设置version。

发布时内部用到的插件是maven-publish

Gradle Sync后,打开Gradle Tasks View,选择publishMis[...]PublicationToMavenRepository执行发布任务。

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

其中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架构师群获取Java工程化、高性能及分布式、高性能、深入浅出。高架构。性能调优、Spring,MyBatis,Netty源码分析和大数据等多个知识点高级进阶干货的直播免费学习权限 都是大牛带飞 让你少走很多的弯路的 群..号是:855801563 对了 小白勿进 最好是有开发经验

注:加群要求

1、具有工作经验的,面对目前流行的技术不知从何下手,需要突破技术瓶颈的可以加。

2、在公司待久了,过得很安逸,但跳槽时面试碰壁。需要在短时间内进修、跳槽拿高薪的可以加。

3、如果没有工作经验,但基础非常扎实,对java工作机制,常用设计思想,常用java开发框架掌握熟练的,可以加。

4、觉得自己很牛B,一般需求都能搞定。但是所学的知识点没有系统化,很难在技术领域继续突破的可以加。

5.阿里Java高级大牛直播讲解知识点,分享知识,多年工作经验的梳理和总结,带着大家全面、科学地建立自己的技术体系和技术认知!

©著作权归作者所有:来自51CTO博客作者java架构师1的原创作品,如需转载,请注明出处,否则将追究法律责任


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP