上圖為常見的桌上型電腦,程式設計師,你看了有啥啟發?
桌上型電腦生產線 | 我的maven程式碼工程 xxx |
---|---|
顯示器 | xxx-web |
主機 | xxx-app |
鍵盤 | xxx-domian |
滑鼠 | xxx-infrastration |
桌上型電腦 | xxx-all.jar |
雖然不能完全對應的上,我拿開源的dubbo描述一下我的問題。
dubbo開發者:
dubbo的開源專案採用maven多模組開發的,內部模組分的非常細。
充分利用了臺式電腦的分模組設計思想。
dubbo使用者:
我只需要引入一個dubbo-all的依賴即可使用dubbo;
好比桌上型電腦的使用者,我只需要一個可使用的桌上型電腦,按照使用手冊來即可,內部的東西我不想知道;
只需要引入座標:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.7.0</version>
<optional>true</optional>
</dependency>
背景
最近的業務開發工作碰到過一個類似的問題。
問題 | 回答 |
---|---|
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 |
記憶體和磁碟 | 無最低空間需求 |
用法如下:
<project>
<build>
<!-- To define the plugin version in your parent POM -->
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</version>
</plugin>
</plugins>
</pluginManagement>
<!-- To use the plugin goals in your POM or parent POM -->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</version><configuration>
<!-- put your configurations here -->
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
常見配置屬性:
ApacheLicenseResourceTransformer
防止證書重複
ApacheNoticeResourceTransformer
準備合併通知
AppendingTransformer
作為資源新增
ComponentsXmlResourceTransformer
聚合components.xml 從
DontIncludeResourceTransformer
排除資原始檔
IncludeResourceTransformer
包含的資原始檔
ManifestResourceTransformer
manifest的條目
ServicesResourceTransformer
合併meta-info/services 資源
XmlAppendingTransformer
新增xml內容作為一個xml資源
dubbo
主要看dubbo-all模組的配置:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-parent</artifactId>
<version>${revision}</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>dubbo</artifactId>
<packaging>jar</packaging>
<name>dubbo-all</name>
<description>The all in one project of dubbo</description>
<dependencies>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-config-api</artifactId>
<version>${project.version}</version>
<scope>compile</scope>
<optional>true</optional>
</dependency>
```
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<createSourcesJar>true</createSourcesJar>
<promoteTransitiveDependencies>false</promoteTransitiveDependencies>
<artifactSet>
<includes>
<include>com.alibaba:hessian-lite</include>
<include>org.apache.dubbo:dubbo-config-api</include>
</includes>
</artifactSet>
<transformers>
<!-- dubbo-common beginning -->
<transformer
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>
META-INF/dubbo/internal/org.apache.dubbo.common.compiler.Compiler
</resource>
</transformer>
<transformer
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>
META-INF/dubbo/internal/org.apache.dubbo.common.config.configcenter.DynamicConfigurationFactory
</resource>
</transformer>
</transformers>
<filters>
<filter>
<artifact>org.apache.dubbo:dubbo</artifact>
<excludes>
<!-- These two line is optional, it can remove some warn log -->
<exclude>com/**</exclude>
<exclude>org/**</exclude>
<!-- This one is required -->
<exclude>META-INF/dubbo/**</exclude>
</excludes>
</filter>
</filters>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
為控制程式碼佔用太多內容,上面貼的pom配置為刪除了大量相同或者類似的節點。
下面拆解一下它的結構:
核心節點 | 說明 |
---|---|
dependency | 直接依賴,即包含的當前工程中的模組 |
plugin | shade |
shade的核心配置
配置 | 說明(見名知意,先猜測) |
---|---|
掛接在maven的生命週期的package階段 | |
提供唯一的goal指令 shade | |
是否建立原始碼到jar包中,方便ide直接檢視到原始碼 | |
是否打包間接依賴 | |
包含的子模組或者排除的子模組 | |
轉換器配置 | |
過濾器中排出某些檔案 |
具體看上面的程式碼。
實際專案
參考dubbo,也是新增shade外掛,目的是隻把多模組的class和resource統一到一個jar中統一使用。
公司保密原因,不貼出來了。
小結
如果看完之後你只能記住一句話:
maven多模組開發可以使用shade外掛對使用方輸出一個構件。
原創不易,關注誠可貴,轉發價更高!轉載請註明出處,讓我們互通有無,共同進步,歡迎溝通交流。