程式設計師你的maven多模組專案如何對外輸出為一個構件?
阿新 • • 發佈:2020-09-05
![image.png](https://img2020.cnblogs.com/other/268922/202009/268922-20200905011752497-216705517.png)
上圖為常見的桌上型電腦,程式設計師,你看了有啥啟發?
| 桌上型電腦生產線 | 我的maven程式碼工程 xxx |
| --- | --- |
| 顯示器 | xxx-web |
| 主機 | xxx-app |
| 鍵盤 | xxx-domian |
| 滑鼠 | xxx-infrastration |
| 桌上型電腦 | xxx-all.jar |
雖然不能完全對應的上,我拿開源的dubbo描述一下我的問題。
**dubbo開發者:**
dubbo的開源專案採用maven多模組開發的,內部模組分的非常細。
充分利用了臺式電腦的分模組設計思想。
![image.png](https://img2020.cnblogs.com/other/268922/202009/268922-20200905011754524-2094519135.png)
**dubbo使用者:**
我只需要引入一個dubbo-all的依賴即可使用dubbo;
好比桌上型電腦的使用者,我只需要一個可使用的桌上型電腦,按照使用手冊來即可,內部的東西我不想知道;
只需要引入座標:
```xml
com.alibaba
dubbo
2.7.0
true
```
# 背景
最近的業務開發工作碰到過一個類似的問題。
| 問題 | 回答 |
| --- | --- |
| where are we?現狀 | 公共元件程式設計師開發採用多模組開發一個元件,業務程式設計師希望只引用一個元件 |
| where are we go?目的 | 多模組開發一個公共元件,業務專案只需要引入一個模組 |
| how we go there?實現路徑 | maven-shade-plugin |
# 實現路徑
## shade
shade提供了一個把你的maven多模組構件和構件的依賴打包為一個超級jar包的能力。
它繫結到了maven生命週期的package階段,提供了唯一的mavn的goal指令**shade:shade**
它的系統執行環境要求是:
| 執行需求 | 說明 |
| --- | --- |
| maven3 | 最低maven3 |
| jdk7 | 最低jdk7 |
| 記憶體和磁碟 | 無最低空間需求 |
用法如下:
```xml
org.apache.maven.plugins
maven-shade-plugin
3.2.4
org.apache.maven.plugins
maven-shade-plugin
3.2.4
package
shade
```
常見配置屬性:
ApacheLicenseResourceTransformer
防止證書重複
ApacheNoticeResourceTransformer
準備合併通知
AppendingTransformer
作為資源新增
ComponentsXmlResourceTransformer
聚合components.xml 從
DontIncludeResourceTransformer
排除資原始檔
IncludeResourceTransformer
包含的資原始檔
ManifestResourceTransformer
manifest的條目
ServicesResourceTransformer
合併meta-info/services 資源
XmlAppendingTransformer
新增xml內容作為一個xml資源
## dubbo
主要看dubbo-all模組的配置:
```xml
4.0.0
org.apache.dubbo
dubbo-parent
${revision}
../pom.xml
dubbo
jar
dubbo-all
The all in one project of dubbo
org.apache.dubbo
dubbo-config-api
${project.version}
compile
true
```
org.apache.maven.plugins
maven-shade-plugin
package
shade
true
false
com.alibaba:hessian-lite
org.apache.dubbo:dubbo-config-api
META-INF/dubbo/internal/org.apache.dubbo.common.compiler.Compiler
META-INF/dubbo/internal/org.apache.dubbo.common.config.configcenter.DynamicConfigurationFactory
org.apache.dubbo:dubbo
com/**
org/**
META-INF/dubbo/**
```
為控制程式碼佔用太多內容,上面貼的pom配置為刪除了大量相同或者類似的節點。
下面拆解一下它的結構:
| 核心節點 | 說明 |
| --- | --- |
| dependency | 直接依賴,即包含的當前工程中的模組 |
| plugin | shade |
shade的核心配置
| 配置 | 說明(見名知意,先猜測) |
| --- | --- |
| package | 掛接在maven的生命週期的package階段 |
| shade | 提供唯一的goal指令 shade |
| true | 是否建立原始碼到jar包中,方便ide直接檢視到原始碼 |
| false | 是否打包間接依賴 |
| | 包含的子模組或者排除的子模組 |
| | 轉換器配置 |
| | 過濾器中排出某些檔案 |
具體看上面的程式碼。
![dubbo-all.png](https://img2020.cnblogs.com/other/268922/202009/268922-20200905011755968-1505919930.png)
## 實際專案
參考dubbo,也是新增shade外掛,目的是隻把多模組的class和resource統一到一個jar中統一使用。
公司保密原因,不貼出來了。
# 小結
如果看完之後你只能記住一句話:
**maven多模組開發可以使用shade外掛對使用方輸出一個構件**。
![maven-shade-plugin.png](https://img2020.cnblogs.com/other/268922/202009/268922-20200905011757084-1846901888.png)
> 原創不易,關注誠可貴,轉發價更高!轉載請註明出處,讓我們互通有無,共同進步,歡迎溝通