上图为常见的台式机,程序员,你看了有啥启发?

台式机生产线 我的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多模块项目如何对外输出为一个构件?的更多相关文章

  1. SpringBoot+Maven多模块项目(创建、依赖、打包可执行jar包部署测试)完整流程

    一,创建Maven多模块项目先建立外层父工程         File →new →project  选择Spring Initializr          Next下一步到以下页面 工程结构如下 ...

  2. SpringBoot+Maven 多模块项目的构建、运行、打包实战

    前言 最近在做一个很复杂的会员综合线下线上商城大型项目,单模块项目无法满足多人开发和架构,很多模块都是重复的就想到了把模块提出来,做成公共模块,基于maven的多模块项目,也好分工开发,也便于后期微服 ...

  3. IntelliJ Idea14 创建Maven多模块项目

    Maven多模块项目的参考资料 Sonatype上的教程 http://books.sonatype.com/mvnex-book/reference/multimodule.html 在这个教程里, ...

  4. Maven入门,Maven项目的创建,nexus 2.x搭建私服以及Maven多模块项目创建

    maven的了解做一个总结,以便日后查阅, 若有不足之处,还望指出,学无止境 当然也能起到入门效果. 一,搭建maven私服 1.工具 a. Nexus 2.5.1-01 b. Maven 3.3.9 ...

  5. eclipse导入SVN上的Maven多模块项目

    eclipse导入SVN上的Maven多模块项目 博客分类: Eclipse&MyEclipse SVN Maven   一.SVN上Maven多模块项目结构 使用eclipse导入SVN上的 ...

  6. IntelliJ IDEA中创建Web聚合项目(Maven多模块项目)

    Eclipse用多了,IntelliJ中创建Maven聚合项目可能有小伙伴还不太熟悉,我们今天就来看看. IntelliJ中创建普通的Java聚合项目相对来说比较容易,不会涉及到web操作,涉及到we ...

  7. maven多模块项目构建

    描述 一个大的企业级项目通常跨越了数十万行代码,牵涉了数十或数百软件人员的努力.如果开发者在同一个项目下开   发,那么项目的管理.构建将会变得很难控制.因此设计人员会将项目划分为多个模块,多个模块独 ...

  8. Maven多模块项目加载

      Maven多模块项目中如何让Spring运行时成功加载指定的子模块   将子模块pom加入到父模块pom的定义中,并继承父模块   在web.xml中配置加载子模块的Spring配置文件   在启 ...

  9. Spring Boot 项目实战(一)Maven 多模块项目搭建

    一.前言 最近公司项目准备开始重构,框架选定为 Spring Boot ,本篇主要记录了在 IDEA 中搭建 Spring Boot Maven 多模块项目的过程. 二.软件及硬件环境 macOS S ...

随机推荐

  1. 银弹谷零代码开发V百科|使用技巧:Vbase技巧二则之二

    银弹谷零代码开发V百科|使用技巧:Vbase技巧二则之二 结构树设置 Vbase系统提供机构树默认展开层级和加载模式的设置. sa账号登录,默认密码8. 打开机构与权限管理—机构初始化设置菜单,选择“ ...

  2. 2017面向对象程序设计(Java)第十七周助教工作总结

            本学期已接近尾声,java课程也即将结束.经过一学期的java学习,相信大家已经从最初的懵懂.困惑渐渐的走向了柳暗花明,并对java的体系结构有了更加清晰的认识.但一学期的学习是远远不 ...

  3. python获取系统内存占用信息的实例方法

    psutil是一个跨平台库(http://code.google.com/p/psutil/),能够轻松实现获取系统运行的进程和系统利用率(包括CPU.内存.磁盘.网络等)信息.它主要应用于系统监控, ...

  4. puppet单机模型

    puppet配置 命令 facter -p: 显示所有的变量 puppet apply [-v] [--noop] [-e 'puppet expression: 一般为include httpd等' ...

  5. 图解比原链Tensority算法:如何让POW做到人工智能友好

    共识算法说起 区块链系统首先是分布式系统,而一致性是分布式系统的基础问题,要保证系统满足不同程度的一致性,则就要用到共识算法. 现在主流的算法有POW.POS.DPOS等等,比特币采用的POW共识算法 ...

  6. 伸展树(Splay)学习笔记

    二叉排序树能够支持多种动态集合操作,它可以被用来表示有序集合,建立索引或优先队列等.因此,在信息学竞赛中,二叉排序树应用非常广泛. 作用于二叉排序树上的基本操作,其时间复杂度均与树的高度成正比,对于一 ...

  7. [学习笔记] Numpy基础 系统学习

    [学习笔记] Numpy基础 上专业选修<数据分析程序设计>课程,老师串讲了Numpy基础,边听边用jupyter敲了下--理解+笔记. 老师讲的很全很系统,有些点没有记录,在PPT里就不 ...

  8. ALGEBRA-前言

    “当你读一页不到一个小时的话,可能是你读太快了” 哈哈 可以 慢慢品

  9. externaltrafficpolicy的有关问题说明

    环境描述 生产环境通过gitlab-running实现自动化发布业务,现需要收集客户端的真实ip,需要将externaltrafficpolicy改为lacal模式(原来是cluster模式),前天开 ...

  10. troubleshoot之:使用JFR解决内存泄露

    目录 简介 一个内存泄露的例子 使用JFR和JMC来分析内存泄露 OldObjectSample 总结 简介 虽然java有自动化的GC,但是还会有内存泄露的情况.当然java中的内存泄露跟C++中的 ...