程序员你的maven多模块项目如何对外输出为一个构件?

上图为常见的台式机,程序员,你看了有啥启发?
| 台式机生产线 | 我的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的核心配置
| 配置 | 说明(见名知意,先猜测) |
|---|---|
| package | 挂接在maven的生命周期的package阶段 |
| shade | 提供唯一的goal指令 shade |
| true | 是否创建源码到jar包中,方便ide直接查看到源码 |
| false | 是否打包间接依赖 |
| 包含的子模块或者排除的子模块 | |
| 转换器配置 | |
| 过滤器中排出某些文件 |
具体看上面的代码。

实际项目
参考dubbo,也是添加shade插件,目的是只把多模块的class和resource统一到一个jar中统一使用。
公司保密原因,不贴出来了。
小结
如果看完之后你只能记住一句话:
maven多模块开发可以使用shade插件对使用方输出一个构件。

原创不易,关注诚可贵,转发价更高!转载请注明出处,让我们互通有无,共同进步,欢迎沟通交流。
程序员你的maven多模块项目如何对外输出为一个构件?的更多相关文章
- SpringBoot+Maven多模块项目(创建、依赖、打包可执行jar包部署测试)完整流程
一,创建Maven多模块项目先建立外层父工程 File →new →project 选择Spring Initializr Next下一步到以下页面 工程结构如下 ...
- SpringBoot+Maven 多模块项目的构建、运行、打包实战
前言 最近在做一个很复杂的会员综合线下线上商城大型项目,单模块项目无法满足多人开发和架构,很多模块都是重复的就想到了把模块提出来,做成公共模块,基于maven的多模块项目,也好分工开发,也便于后期微服 ...
- IntelliJ Idea14 创建Maven多模块项目
Maven多模块项目的参考资料 Sonatype上的教程 http://books.sonatype.com/mvnex-book/reference/multimodule.html 在这个教程里, ...
- Maven入门,Maven项目的创建,nexus 2.x搭建私服以及Maven多模块项目创建
maven的了解做一个总结,以便日后查阅, 若有不足之处,还望指出,学无止境 当然也能起到入门效果. 一,搭建maven私服 1.工具 a. Nexus 2.5.1-01 b. Maven 3.3.9 ...
- eclipse导入SVN上的Maven多模块项目
eclipse导入SVN上的Maven多模块项目 博客分类: Eclipse&MyEclipse SVN Maven 一.SVN上Maven多模块项目结构 使用eclipse导入SVN上的 ...
- IntelliJ IDEA中创建Web聚合项目(Maven多模块项目)
Eclipse用多了,IntelliJ中创建Maven聚合项目可能有小伙伴还不太熟悉,我们今天就来看看. IntelliJ中创建普通的Java聚合项目相对来说比较容易,不会涉及到web操作,涉及到we ...
- maven多模块项目构建
描述 一个大的企业级项目通常跨越了数十万行代码,牵涉了数十或数百软件人员的努力.如果开发者在同一个项目下开 发,那么项目的管理.构建将会变得很难控制.因此设计人员会将项目划分为多个模块,多个模块独 ...
- Maven多模块项目加载
Maven多模块项目中如何让Spring运行时成功加载指定的子模块 将子模块pom加入到父模块pom的定义中,并继承父模块 在web.xml中配置加载子模块的Spring配置文件 在启 ...
- Spring Boot 项目实战(一)Maven 多模块项目搭建
一.前言 最近公司项目准备开始重构,框架选定为 Spring Boot ,本篇主要记录了在 IDEA 中搭建 Spring Boot Maven 多模块项目的过程. 二.软件及硬件环境 macOS S ...
随机推荐
- MVVM 框架
问题: 1.MVVM 的定义 M (Model): 数据来源,服务器上业务逻辑操作 V (View): 界面,页面 VM (ViewModel): view 和 model 的核心枢纽,如 vue.j ...
- Android 的OkHttp(发送网络请求)
今天讲的是和HttpURLConnection差不多的OkHttp; 先把网站献上: 官网介绍okhttp的: https://square.github.io/okhttp/ 下载postman的: ...
- Java常用类:包装类,String,日期类,Math,File,枚举类
Java常用类:包装类,String,日期类,Math,File,枚举类
- 【模式识别与机器学习】——logistic regression
虽然叫做“回归”,但是这个算法是用来解决分类问题的.回归与分类的区别在于:回归所预测的目标量的取值是连续的(例如房屋的价格):而分类所预测的目标变量的取值是离散的(例如判断邮件是否为垃圾邮件).当然, ...
- C#LeetCode刷题之#896-单调数列(Monotonic Array)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3760 访问. 如果数组是单调递增或单调递减的,那么它是单调的. ...
- myBatis源码解析-反射篇(4)
前沿 前文分析了mybatis的日志包,缓存包,数据源包.源码实在有点难顶,在分析反射包时,花费了较多时间.废话不多说,开始源码之路. 反射包feflection在mybatis路径如下: 源码解析 ...
- Python3 执行JS出现JSON未定义问题
two = function(e) { var t = e.data; e.url.match(/(https?:)?(\/\/)([^/]*)/) || (e.url = "https:/ ...
- .net Core 下使用 X509Certificate2 给报文加签
起因 项目开发中途出现需求需要对接其他公司接口,使用证书进行认证传输,之前在.Net下搞过但是都是对方给我证书 这次需要我生成公钥/私钥,公钥给他这样操作. 生成私钥/公钥(这里是RSA算法,长度规定 ...
- 谈谈javascript的基本规范~~~~
1.不要在同一行声明多个变量. 2.请使用===或==来比较true或false或者数值 3.使用对象字面量代替new Array这种形式 4.不要使用全局函数 5.switch语句必须带有defau ...
- html中datalist 是什么??????
<datalist>标签定义选项列表,与input元素配合使用该元素,来定义input可能值.datdallist及其选项不会被显示出来,它仅仅是合法的输入值列表. <input i ...