組件化
什么是組件化,直接看下面兩張圖。
上面是非組件化的項目,下面是組件化的項目。
非組件化的問題
如果項目本身有多個互相不影響的模塊,甚至有多人分開負責各個模塊的開發時,非組件化項目的弊端就會暴露出來,主要是有下面幾個:
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中。