MIS

模块接口服务(Module Interface Service)

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

Usage

引用 mis 插件

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

buildscript {

dependencies {

...

classpath 'com.eastwood.tools.plugins:mis:2.0.2'

}

}

在根项目的build.gradle中添加mis插件的相关配置:

...

apply plugin: 'mis'

mis {

compileSdkVersion 27

compileOptions {

sourceCompatibility JavaVersion.VERSION_1_8

targetCompatibility JavaVersion.VERSION_1_8

}

}

compileSdkVersion 同 android { compileSdkVersion ... }

compileOptions 同 android { compileOptions { ... } }

创建 mis 目录

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

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

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

在模块目录内,创建单独的mis.gradle文件, 并在内声明mis对应的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对应的值,即对应目录下的mis。比如与src/debug/java对应的src/debug/mis。

groupId、artifactId、version对应的是Maven的GAV。初次配置时不设置version,发布至maven时设置version。

在dependencies中可声明该mis Publication编译和运行时需用到的第三方库,仅支持compileOnly和implementation。如果mis文件夹下的类使用了kotlin语法,需要添加kotlin相关的依赖,比如'org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version'。

发布mis publication 至 Maven

在根项目的build.gradle中添加mis插件的repositories配置:

mis {

compileSdkVersion 27

...

repositories {

maven {

url "http://***"

credentials {

username '***'

password '***'

}

}

}

...

}

发布用到的插件是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插件创建接口并发布到maven,接下来介绍接口的注册和调用。

注册接口服务

注册接口需要有个服务容器来管理接口和接口的实现对象。mis提供了一个简单的MisService服务容器,可根据自己项目实际情况自行选用。

在模块build.gradle中添加MisService服务容器库的引用:

dependencies {

implementation 'com.eastwood.common:mis:1.0.0'

}

在MisService服务容器中注册服务,可以使用 服务接口 + 服务接口的实现对象 或 服务接口的实现类 进行注册,例如:

// 服务接口 + 服务接口的实现对象

MisService.register(ILibraryService.class, new LibraryService());

// 服务接口 + 服务接口的实现类

MisService.register(ILibraryService.class, LibraryService.class);

在Demo样例中,接口所在的模块通过AutoInject在编译期主动注册接口。(这推荐下#

获取接口服务

在其他模块build.gradle中添加mis库,以及发布至maven的接口库:

dependencies {

implementation 'com.eastwood.common:mis:1.0.0'

implementation 'com.eastwood.demo:library-sdk:1.0.0-SNAPSHOT'

}

Gradle Sync后,就可以通过接口在MisService服务容器中查找对应的接口服务并调用,比如:

ILibraryService libraryService = MisService.getService(ILibraryService.class);

libraryService.getLibraryInfo()

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。

5.在mis publication dependencies {}中声明的依赖会作用于mis publication所在的模块吗?

mis publication dependencies {}是用于声明mis publication编译和运行时需用到的第三方库,但不会作用于mis publication所在的模块。

在开发的时候,src/java下的类能引用到mis依赖的第三方库类,但编译时会报错,提示找不到对应的类。

产生这种情况的原因是mis插件在Gradle sync时,将声明的依赖传递给mis publication所在的模块。但clean或build时不传递。

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也在当前项目,那么与其所提供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.

java 模块分离部署_GitHub - yangjiu/Mis: 模块接口服务,如何在一个模块内维护其对外暴露的接口(包括打包发布),而不是把接口和接口实现分离到两个不同的模块?...相关推荐

  1. java版b2b2c社交电商springcloud分布式微服务 (九)服务链路追踪(Spring Cloud Sleuth)...

    电子商务社交平台源码请加企鹅求求:一零三八七七四六二六.这篇文章主要讲述服务追踪组件zipkin,Spring Cloud Sleuth集成了zipkin组件. 一.简介 Spring cloud B ...

  2. 自定义ClassLoader实现java应用核心逻辑模块热部署

    http://waterdh.iteye.com/blog/520399 本文主要是根据classloader的特性,结合实际产品环境中遇到的问题,来探讨下JAVA应用中局部模块热部署的可行性. 我们 ...

  3. TIMO 后台管理系统 v2.0 发布,带来全新的项目结构,支持前后台模块分离部署!...

    开发四年只会写业务代码,分布式高并发都不会还做程序员?   TIMO后台管理系统v2.0版本已发布(基于SpringBoot),更新日志: 重构项目结构,引入组件及业务组概念,让模块之间的关系更加清晰 ...

  4. ChinaSkills-网络系统管理(2022年全国职业院校技能大赛-模块C-Linux部署-02卷-评分标准 )

    C 模块 Linux 部署评分标准(300) 要求:使用下面指令查看其运行状态,并使用 FSCapture 截图软件进行截图,将输入结果的截图插入到文档中: 注: ² 答题卡中如果整个大题没有截图则整 ...

  5. Maven Jrebel 多模块热部署方案

    近期在构建maven多模块项目时,发现web module依赖的其它模块,每次都要clean install成一个jar包,然后运行web module才能加载. 本生jrebel是配置在了web m ...

  6. ChinaSkills-网络系统管理(2022年全国职业院校技能大赛-模块C-Window部署-02卷-评分标准 )

    B 模块 Windows 部署评分标准(300) 要求:使用下面指令查看其运行状态,并使用 FSCapture 截图软件进行截图,将输入结果的截图插入到文档中: 注: ² 答题卡中如果整个大题没有截图 ...

  7. ThinkPHP 学习笔记 ( 一 ) 项目部署:应用部署方式与模块分组部署方式

    /*** ThinkPHP version 3.1.3*/ ThinkPHP ( 官方网站:http://www.thinkphp.cn/ ) 目前最新版本是 3.2.2,它要求 PHP 的版本高于 ...

  8. maven实现多模块热部署

    2019独角兽企业重金招聘Python工程师标准>>> 一.背景 基于maven的项目工程都会按模块划分,每个模块最终形成一个jar包,那么每次对模块的修改就需要重新打包,这样的工作 ...

  9. 两个hc05蓝牙模块在两块单片机上通信(附完整代码)

    目录 第一步:进入AT模式 第二步:同时插在电脑上实现通信 第三步:单片机上通信 代码链接 所需材料:两个hc05蓝牙,两个usb转串口模块,两块单片机 第一步:进入AT模式 接线图如下所示 HC-0 ...

最新文章

  1. LTE中基本通信过程的理解——上行调度
  2. Quora Question Pairs 项目参考资料
  3. pymysql模块操作数据库及连接报错解决方法
  4. c语言中fflush的运用为什么没有效果呢,测试平台linux
  5. ajax c 提交form,使用ajax提交form表单,包括ajax文件上传
  6. 前端学习(1978)vue之电商管理系统电商系统之为每一行数据提供单独的value
  7. 2021中国低代码市场研究报告
  8. 中移动将整合手机邮箱和飞信业务
  9. Eclipse使用SVN操作说明
  10. 高职院校计算机基础课程,高职院校计算机基础课程教学探讨的论文
  11. 转:什么是Node.js?
  12. ubuntu 环境变量配置
  13. OpenCV3.4.13+OpenCV_contrib 双摄像头实时拼接 环境配置
  14. 渗透测试工具——Metasploit
  15. 简述导线平差计算的五个步骤_附合导线平差计算过程说明
  16. SIM868使用笔记
  17. H264解码过滤花屏视频帧
  18. 理财趣事:要想财富滚滚来 先学普京打野猪
  19. 太平人寿黄金十年 保险理财要买么?
  20. FCFS,SJF以及PSA进程调度算法效率的比较

热门文章

  1. TCP/IP总结(4)TCP 之3次握手
  2. C++ Primer 5th笔记(chap 17 标准库特殊设施)指定浮点数记数法
  3. C++ Primer 5th笔记(chap 19 特殊工具与技术)两种不可移植的特性之“volatile”
  4. 《Fabric 云存储的电子健康病历系统》(2)病历结构体 Records
  5. 《研磨设计模式》chap20 享元模式 Flyweight (2)模式介绍
  6. 数学建模——灰色预测模型Python代码
  7. JavaScript之事件
  8. HTML5中各种标签总结(列表标签、表格标签)
  9. [architecture]-ARMv8/armv7/linux的栈/sp的学习和总结
  10. Fabric--node测试