程序员你的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 ...
随机推荐
- QString字符串的查找与截取实例
QString是Qt中封装的字符串类,相对于标准库里的string,使用方法有些不同,个人感觉使用qt习惯后,感觉QString更好用,下面的代码主要是针对QString的字符查找.截取做的测试: # ...
- 文档写作利器:Markdown
大佬的文章,写的很好,里面推荐的Markdown编辑工具很不错,值的推荐. 文档写作利器:Markdown_网络_xcbeyond|疯狂源自梦想,技术成就辉煌-CSDN博客https://blog.c ...
- Qt使用MD5加密
Qt中包含了大部分常用的功能,比如json.数据库.网络通信.串口通信以及今天说的这个MD5加密: Qt中将字符串进行MD5加密其实比较简单,代码如下: #include <QCoreAppli ...
- Windows下使用命令行编译Qt项目(解决DLL丢失问题)
一.前言 我之前用Qt做了个hello world,结果各种报错,一大堆DLL找不到,今天用命令行编译就通过了 二.准备工作 1.Visual Studio(有nmake就行) 2.Qt 3.把qma ...
- 配置JDK的环境变量
1.官网下载JDK安装包并进行安装,记住安装目录 2.安装完JDK后配置环境变量 计算机→属性→高级系统设置→高级→环境变量 3.系统变量→新建 JAVA_HOME 变量 .变量值填写jdk的安装目 ...
- C#设计模式之6-适配器模式
适配器模式(Adapter Pattern) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/399 访问. 适配器模式属 ...
- 【CF1110E】 Magic Stones - 差分
题面 Grigory has n n magic stones, conveniently numbered from \(1\) to \(n\). The charge of the \(i\)- ...
- 无法将“vue”项识别为 cmdlet、函数、脚本文件或可运行程序的名称
状况 如果在使用 vue 初始化项目的时候提示: vue : 无法将“vue”项识别为 cmdlet.函数.脚本文件或可运行程序的名称.请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次. ...
- JavaFX桌面应用-loading界面
上次使用JavaFX开发了一个视频转码工具,当用户点击"启动"按钮开始转码的时候,会禁用启动按钮,防止多次启动转码. 这种处理方式对用户来说可能并是很友好,其实可以在启动转码的时弹 ...
- ceph 快照,克隆
转载 https://my.oschina.net/wangzilong/blog/1595081 ceph 快照,克隆 ceph是一个非常好的后端存储系统.其中包括最常用的块存储,对象存储,文件系统 ...