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

程序员你的maven多模块项目如何对外输出为一个构件?_第1张图片

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

台式机生产线 我的maven代码工程 xxx
显示器 xxx-web
主机 xxx-app
键盘 xxx-domian
鼠标 xxx-infrastration
台式机 xxx-all.jar 

虽然不能完全对应的上,我拿开源的dubbo描述一下我的问题。

dubbo开发者:
dubbo的开源项目采用maven多模块开发的,内部模块分的非常细。

充分利用了台式电脑的分模块设计思想。

程序员你的maven多模块项目如何对外输出为一个构件?_第2张图片

dubbo使用者:
我只需要引入一个dubbo-all的依赖即可使用dubbo;

好比台式机的用户,我只需要一个可使用的台式机,按照使用手册来即可,内部的东西我不想知道;

只需要引入坐标:

 
      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
内存和磁盘 无最低空间需求

用法如下:


 
  
  
   
    
     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模块的配置:


    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](/img/bVbMrxj)

## 实际项目


参考dubbo,也是添加shade插件,目的是只把多模块的class和resource统一到一个jar中统一使用。

公司保密原因,不贴出来了。




# 小结


如果看完之后你只能记住一句话:

**maven多模块开发可以使用shade插件对使用方输出一个构件**。

![maven-shade-plugin.png](/img/bVbMrxk)



> 原创不易,关注诚可贵,转发价更高!转载请注明出处,让我们互通有无,共同进步,欢迎沟通交流。

你可能感兴趣的:(java)