Java 组件化(gradle)
组件化
什么是组件化,直接看下面两张图。


上面是非组件化的项目,下面是组件化的项目。
非组件化的问题
如果项目本身有多个互相不影响的模块,甚至有多人分开负责各个模块的开发时,非组件化项目的弊端就会暴露出来,主要是有下面几个:
1、依赖难以管理,不同的模块依赖不同的库,甚至是同一个库的不同版本。
2、各个模块单独打包麻烦。
3、增加额外开发成本,开发本身可能只需要开发一个模块,但是由于代码写在一起,所以不得不去了解整个项目。
4、如果一个项目有几十甚至几百个模块,模块化能极大减少编译时间。
例子
光讲理论还是让人难以理解,那么用个简单的例子来具体讲一下。

上图是非模块化的一个项目,其中包括base包中的一些基类,然后有Consumer和Producer两个应用类,Main类如下:
import implement.Consumer;
public class Main {
public static void main(String[] args){
new Consumer().start();
// new Producer().start();
}
}
场景是这样:我们有两个服务器,一个是消费者服务器,一个是生产者服务器,他们有相同的基类,但是提供服务器的逻辑是不同的,所以不同服务器上的jar需要分别打包。
如果是非模块化项目,我们就只能像上面的代码一样做,在打包Consumer的jar的时候将Producer代码注释掉,而在打包Producer的jar的时候将Consumer代码注释掉。
但是,实际开发中,代码并不是这么简单的,Consumer和Producer本身的逻辑可能就会比较复杂,这就会带来每次打包就会带来额外工作量的问题,久而久之,项目越来越大,只有对整个项目都了解了才会知道如何打包。
甚至,之后如果是多人负责这个项目,由于Consumer和Producer的代码都写在一个Project内,Consumer的程序员改动某一个依赖,很可能会给Producer的代码带去风险。
在这个例子中,如果使用组件化,就可以解决一下几个问题:
1、单独打包问题
2、依赖管理问题
3、开发只需要专注自己的模块,降低开发成本
如何组件化
主要步骤如下:
1、创建module,将代码放到各个module中
2、setting.gradle 添加module
3、依赖分开管理
创建module
如果和笔者一样使用的是IDEA的话,直接File->New->Module就可以创建。使用IDEA创建,src、build.gradle等文件,IDEA也会自动帮忙创建好。
创建后如下图:

如果不是使用IDEA,直接在主项目目录下创建BaseProject文件就可以,然后再去创建src等文件。
module都创建完毕后将代码都放到各个module中,效果大致如下:

setting.gradle 添加module
只有在setting.gradle 中添加了module,gradle构建项目的时候才能识别这几个文件夹是module。
如果是使用IDEA创建的,IDEA会自动在setting.gradle 添加module,如果是自己手动创建的项目,则也需要手动添加,该文件内容如下:
rootProject.name = 'TestProject'
include 'BaseProject'
include 'Consumer'
include 'Producer'
依赖分开管理
创建完module,将原来的类直接移动到module中,我们可以发现是会有error的,效果大致如下:

可以看到是因为找不到Base类,因此我们要在Consumer和Producer的module中添加BaseProject这个module的依赖,如下图,可以看到error已经消失。

如果本身在主项目中,module就有一些依赖,可以将这些依赖分开到各个module中。
就拿例子中的项目来说,共用的一些依赖可以放到BaseProject这个module中,私有的一些依赖就分别放到Consumer和Producer这两个module中。
Java 组件化(gradle)的更多相关文章
- Android业务组件化之Gradle和Sonatype Nexus搭建私有maven仓库
前言: 公司的业务组件化推进的已经差不多三四个月的时间了,各个业务组件之间的解耦工作已经基本完成,各个业务组件以module的形式存在项目中,然后项目依赖本地的module,多少有点不太利于项目的并行 ...
- Java开源博客My-Blog之docker组件化修改
前言 5月13号上线了自己的个人博客,<Docker+SpringBoot+Mybatis+thymeleaf的Java博客系统开源啦>,紧接着也在github上开源了博客的代码,到现在为 ...
- Gradle自动实现Android组件化模块构建
背景 随着App的不断迭代,业务会变得越来越复杂,业务模块会越来越多,且每个模块的代码也会变得越来越多.为了应对这一场景,我们需要把不同的业务模块划分成一个个组件,在修改业务代码的时候只需要在对应模块 ...
- Java开源博客My-Blog之docker容器组件化修改
前言 5月13号上线了自己的个人博客,<Docker+SpringBoot+Mybatis+thymeleaf的Java博客系统开源啦>,紧接着也在github上开源了博客的代码,到现在为 ...
- 组件化框架设计之Java SPI机制(三)
阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680 本篇文章将从深入理解java SPI机制来介绍组件化框架设计: ...
- Android业务组件化之子模块SubModule的拆分以及它们之间的路由Router实现
前言: 前面分析了APP的现状以及业务组件化的一些探讨(Android业务组件化之现状分析与探讨),以及通信的桥梁Scheme的使用(Android业务组件化之URL Scheme使用),今天重点来聊 ...
- Android组件化框架设计与实践
在目前移动互联网时代,每个 APP 就是流量入口,与过去 PC Web 浏览器时代不同的是,APP 的体验与迭代速度影响着用户的粘性,这同时也对从事移动开发人员提出更高要求,进而移动端框架也层出不穷. ...
- Android组件化开发的简单应用
组件化开发的主要步骤: 一.新建Modules 1.新建Project,作为应用的主Module. 2.新建Module:"Common",类型选择"Android Li ...
- Android组件化探索与实践
什么是组件化 不用去纠结组件和模块语义上的区别,如果模块间不存在强依赖且模块间可以任意组合,我们就说这些模块是组件化的. 组件化的好处 实现组件化本身就是一个解耦的过程,同时也在不断对你的项目代码进行 ...
随机推荐
- Hbase meta 表异常修复
Hbase meta表异常修复 标签(空格分隔): Hbase 一,Hbase meta元数据表 1.1 背景 线上Hbase 因为在hbase shell中清空 truncate 'table'一张 ...
- 手动创建Maven项目并建立两个项目之间的依赖关系
用命令行快速建立maven项目 -> mvn:archetype:generate -> 直接回车或者自己输入你想生成的 -> groupId ->artifactId -&g ...
- [LeetCode]-DataBase-Employees Earning More Than Their Managers
The Employee table holds all employees including their managers. Every employee has an Id, and there ...
- 图的普里姆(Prim)算法求最小生成树
关于图的最小生成树算法------普里姆算法 首先我们先初始化一张图: 设置两个数据结构来分别代表我们需要存储的数据: lowcost[i]:表示以i为终点的边的最小权值,当lowcost[i]=0说 ...
- @清晰掉 malloc是如何分配内存的?
任何一个用过或学过C的人对malloc都不会陌生.大家都知道malloc可以分配一段连续的内存空间,并且在不再使用时可以通过free释放掉.但是,许多程序员对malloc背后的事情并不熟悉,许多人甚至 ...
- Python深度学习读书笔记-6.二分类问题
电影评论分类:二分类问题 加载 IMDB 数据集 from keras.datasets import imdb (train_data, train_labels), (test_data, t ...
- 红帽虚拟化RHEV-架构简介
目录 目录 软件环境 RHEV简介 RHEV与KVM的区别 RHEV的组成 RHEV-MManager RHEV-HHypervisor 虚拟机管理程序 存储 RHEV的架构 LDAPIPAAD We ...
- debian ssh/sftp
检查是否安装了openssh dpkg --get-selections | grep openssh 安装命令 sudo apt-get install openssh-server 安装成功的字样 ...
- c# 匿名委托递归
Func<List<int>, int> GetVirtualCode = null; // 递归不能直接=,要赋初值.微软得优化啊,这语法糖不够甜 GetVirtualCod ...
- 虚拟化 RemoteApp 远程接入 源码 免费
远程接入 RemoteApp 虚拟化 源码 免费 1.终端安装与配置: 此远程接入组件的运行原理与瑞友天翼.异速连.CTBS等市面上常见的远程接入产品一样,是透过Windows的终端服务来实现的,速度 ...