1. 程式人生 > >程式設計師你的maven多模組專案如何對外輸出為一個構件?

程式設計師你的maven多模組專案如何對外輸出為一個構件?

![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) > 原創不易,關注誠可貴,轉發價更高!轉載請註明出處,讓我們互通有無,共同進步,歡迎溝通