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

上面是非组件化的项目,下面是组件化的项目。

非组件化的问题
如果项目本身有多个互相不影响的模块,甚至有多人分开负责各个模块的开发时,非组件化项目的弊端就会暴露出来,主要是有下面几个:
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)的更多相关文章

  1. Android业务组件化之Gradle和Sonatype Nexus搭建私有maven仓库

    前言: 公司的业务组件化推进的已经差不多三四个月的时间了,各个业务组件之间的解耦工作已经基本完成,各个业务组件以module的形式存在项目中,然后项目依赖本地的module,多少有点不太利于项目的并行 ...

  2. Java开源博客My-Blog之docker组件化修改

    前言 5月13号上线了自己的个人博客,<Docker+SpringBoot+Mybatis+thymeleaf的Java博客系统开源啦>,紧接着也在github上开源了博客的代码,到现在为 ...

  3. Gradle自动实现Android组件化模块构建

    背景 随着App的不断迭代,业务会变得越来越复杂,业务模块会越来越多,且每个模块的代码也会变得越来越多.为了应对这一场景,我们需要把不同的业务模块划分成一个个组件,在修改业务代码的时候只需要在对应模块 ...

  4. Java开源博客My-Blog之docker容器组件化修改

    前言 5月13号上线了自己的个人博客,<Docker+SpringBoot+Mybatis+thymeleaf的Java博客系统开源啦>,紧接着也在github上开源了博客的代码,到现在为 ...

  5. 组件化框架设计之Java SPI机制(三)

    阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680 本篇文章将从深入理解java SPI机制来介绍组件化框架设计: ...

  6. Android业务组件化之子模块SubModule的拆分以及它们之间的路由Router实现

    前言: 前面分析了APP的现状以及业务组件化的一些探讨(Android业务组件化之现状分析与探讨),以及通信的桥梁Scheme的使用(Android业务组件化之URL Scheme使用),今天重点来聊 ...

  7. Android组件化框架设计与实践

    在目前移动互联网时代,每个 APP 就是流量入口,与过去 PC Web 浏览器时代不同的是,APP 的体验与迭代速度影响着用户的粘性,这同时也对从事移动开发人员提出更高要求,进而移动端框架也层出不穷. ...

  8. Android组件化开发的简单应用

    组件化开发的主要步骤: 一.新建Modules 1.新建Project,作为应用的主Module. 2.新建Module:"Common",类型选择"Android Li ...

  9. Android组件化探索与实践

    什么是组件化 不用去纠结组件和模块语义上的区别,如果模块间不存在强依赖且模块间可以任意组合,我们就说这些模块是组件化的. 组件化的好处 实现组件化本身就是一个解耦的过程,同时也在不断对你的项目代码进行 ...

随机推荐

  1. Luogu P5469 [NOI2019]机器人 (DP、多项式)

    不用FFT的多项式(大雾) 题目链接: https://www.luogu.org/problemnew/show/P5469 (这题在洛谷都成绿题了海星) 题解: 首先我们考虑,一个序列位置最右边的 ...

  2. 新年第一发--HDU1848--Fibonacci again and again(SG函数)

    Problem Description 任何一个大学生对菲波那契数列(Fibonacci numbers)应该都不会陌生,它是这样定义的:F(1)=1;F(2)=2;F(n)=F(n-1)+F(n-2 ...

  3. XAMPP 1.8.2-2 Apache Web Server won't start, always stops immediately

    sudo apachectl stop apachectl是Apache超文本传输协议服务器的前端程序. 其设计意图是帮助管理员控制Apachehttpd后台的功能. MacOS中安装完Apache之 ...

  4. DataList是外部传入的子项数据列表

    //定义适配器类public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>{ private C ...

  5. java分页原理及分类

    1.使用List接口最终subList()方法实现分页 2.直接使用数据库SQL语句实现分页 3.使用hibernate等框架实现跨数据库的分页 mybatis是面向SQL的,本质上和第二种分页方式相 ...

  6. Jupiter Code Review Reference -- Jupiter代码审查工具使用参考

    Jupiter Code Review Reference -- Jupiter代码审查工具使用参考 (修改版) 原创 2010年07月06日 10:43:00 标签: 审查 / reference  ...

  7. tcpdump指定IP和端口抓包

    如下指定抓www.baidu.com 并且80端口的包 保存到test.cap 可以在Windows下面用wireshark打开 tcpdump 'port 80 and host www.baidu ...

  8. Linux内核中的cmpxchg函数

    http://www.longene.org/forum/viewtopic.php?t=2216 前几天,为了这个函数花了好多时间,由于参考的资料有误,一直都没有看明白,直到google之后,总算搞 ...

  9. NAACL 2019 字词表示学习分析

    NAACL 2019 表示学习分析 为要找出字.词.文档等实体表示学习相关的文章. word embedding 搜索关键词 word embedding Vector of Locally-Aggr ...

  10. 【c++进阶:c++ algorithm的常用函数】

    c++ algorithm的常用函数 https://blog.csdn.net/hy971216/article/details/80056933 reverse() reverse(it,it2) ...