Flink 源码周边之Maven Plugin

Flink源码分析系列文档目录

请点击:Flink 源码分析系列文档目录

前言

为了实现构建自动化,Flink项目使用了多种Maven插件,从而将构建过程各个步骤做成标准的、配置式流程。我们可以根据实际需求,将这些plugin应用在自己的项目中。提高日常工作效率。

Maven assembly plugin

Maven assembly plugin用于组装项目。Flink包含众多子项目,他们的编译输出自然也是分散的。Flink版本发布包不仅包含了Java源码编译输出,还有shell脚本,example项目,配置文件等等。正是Maven assembly plugin这一插件,帮我们完成了从编译输出到组装Flink发版包这个过程。

配置

Maven assembly plugin的配置方式如下方xml:


  [...]
  
    [...]
    
      
        
        maven-assembly-plugin
        3.3.0
        
          
          
            jar-with-dependencies
          
        
        
          
            
            make-assembly 
            package 
            
              single
            
          
        
      
      [...]

我们发现,Assembly Plugin组装时候的具体行为在descriptorRef中指定。它对应一个专用的文件,叫做Assembly Descriptor。下面为大家讲解它的用法。

Assembly descriptor

即组装描述符,用于告知assembly plugin组装项目的时候,具体需要如何操作。接下来讲解它的编写方式和作用。下面的例子均引用Flink源代码项目的片段。

文件格式如下:


  [...]
  
  
    
      
        *:war
      
    
  
  [...]

dependencySets标签

该标签包含一个或多个dependencySet。用于将pom依赖复制到目标目录。配置方式如下:


    
    lib
    
    false
    
    false
    
    false
    
    true
    
    true

    
    
    
        org.apache.logging.log4j:log4j-api
        org.apache.logging.log4j:log4j-core
        org.apache.logging.log4j:log4j-slf4j-impl
        org.apache.logging.log4j:log4j-1.2-api
    

fileSets标签

包含一个或多个fileSet标签。用于复制一组文件到输出目录。


    
    src/main/flink-bin/bin
    bin
    
    0755

fileSet标签内可以使用includesexcludes标签,配合通配符,起到按照文件名过滤的功能。如下:


    ../flink-examples/flink-examples-streaming/target
    examples/streaming
    0644
    
    
        *.jar
    
    
    
        flink-examples-streaming*.jar
        original-*.jar
        MatrixVectorMul.jar
    

files标签

fileSets类似,用于复制单个文件到输出目录。包含一个或多个file标签。


    ../flink-table/flink-table-uber/target/flink-table-uber_${scala.binary.version}-${project.version}.jar
    lib/
    flink-table_${scala.binary.version}-${project.version}.jar
    0644

assembly plugin内置的descriptor

编写Assembly descriptor不是一件轻松的事。对于一些常用的操作,Maven assembly plugin已经为我们提供了内置的Assembly descriptor,使用方法参见Pre-defined Descriptor Files。

bin

生成项目默认的二进制发版包。完整的descriptor如下:


  bin
  
    tar.gz
    tar.bz2
    zip
  
  
    
      ${project.basedir}
      
      
        README*
        LICENSE*
        NOTICE*
      
    
    
      ${project.build.directory}
      
      
        *.jar
      
    
    
      ${project.build.directory}/site
      docs
    
  

jar-with-dependencies

将项目编译后连同依赖一起,打成jar包输出。完整的descriptor如下:


  
  jar-with-dependencies
  
    jar
  
  false
  
    
      /
      true
      true
      runtime
    
  

src

将项目源代码打包输出。完整的descriptor如下:


  src
  
    tar.gz
    tar.bz2
    zip
  
  
    
      ${project.basedir}
      
        README*
        LICENSE*
        NOTICE*
        pom.xml
      
      true
    
    
      ${project.basedir}/src
      true
    
  

project

除了编译输出目录外,将整个项目打包输出。完整的descriptor如下:


  project
  
    tar.gz
    tar.bz2
    zip
  
  
    
      ${project.basedir}
      
      true
      
        **/*.log
        **/${project.build.directory}/**
      
    
  

Maven checkstyle plugin

Maven代码规范检测插件。Checkstyle是一种代码规约工具。Maven checkstyle plugin用于将代码规约检查和构建过程绑定一起,实现代码检查自动化。


    org.apache.maven.plugins
    maven-checkstyle-plugin
    2.17
    
        
            com.puppycrawl.tools
            checkstyle
            
            8.14
        
    
    
        
            
            validate
            validate
            
                check
            
        
    
    
        
        /tools/maven/suppressions.xml
        
        true
        
        /tools/maven/checkstyle.xml
        
        true
        
        true
    

规则文件的编写很复杂,大家可参考Flink源代码中的tools/maven/checkstyle.xml文件。对于自己的项目,建议直接使用社区或厂商现成的规范。如果需要自己编写或加工,可参考checkstyle 官方网站。

Maven enforcer plugin

用于检查编译环境是否符合要求。例如Maven版本,JDK版本和操作系统类型等。

官网的配置示例如下:


  [...]
  
    
      
        org.apache.maven.plugins
        maven-enforcer-plugin
        3.0.0-M3
        
          
            enforce-versions
            
              enforce
            
            
              
                
                
                
                  
                  
                  WARN
                  
                    org.apache.maven.plugins:maven-verifier-plugin
                  
                  Please consider using the maven-invoker-plugin (http://maven.apache.org/plugins/maven-invoker-plugin/)!
                
                
                
                  2.0.6
                
                
                
                  1.5
                
                
                
                  unix
                
              
            
          
        
      
    
  
  [...]

其他的检查规则,可参考Apache Maven Enforcer Built-In Rules。

Maven spotless plugin

用于统一代码格式检查和修正。官方介绍可参考:spotless/README.md at main · diffplug/spotless (github.com)。

我们可以使用:

  • mvn spotless:check 执行代码规范检查
  • mvn spotless:apply 将代码格式化(自动修改代码)

下面是Flink项目中spotless插件的配置方式:


    com.diffplug.spotless
    spotless-maven-plugin
    ${spotless.version}
    
        
            
            
                1.7
                
            

            
            
            
                org.apache.flink,org.apache.flink.shaded,,javax,java,scala,\#
            

            
            
        
    
    
        
        
            spotless-check
            validate
            
                check
            
        
    

Maven shade plugin

为项目提供打uber-jar(将依赖和项目本身编译后的class文件打成一个jar包)的能力。

配置shade plugin的方式如下:


  ...
  
    
      
        org.apache.maven.plugins
        maven-shade-plugin
        3.2.4
        
          
        
        
          
            package
            
              shade
            
          
        
      
    
  
  ...

我们这里还是以Flink源代码根目录的pom.xml为例,分析下这个插件的功能和使用方式。


    org.apache.maven.plugins
    maven-shade-plugin
    
        
            shade-flink
            package
            
                shade
            
            
                
                true
                
                
                false
                
                true
                
                ${project.basedir}/target/dependency-reduced-pom.xml
                
                
                
                    
                    
                        
                        *
                        
                            log4j.properties
                            log4j2.properties
                            log4j-test.properties
                            log4j2-test.properties
                        
                    
                    
                    
                    
                        org.apache.flink:force-shading
                        
                            **
                        
                    
                    
                    
                    
                        io.netty:netty
                        
                            META-INF/LICENSE.txt
                        
                    
                
                
                    
                        
                        
                        org.apache.flink:force-shading
                    
                
                
                    
                    
                    
                    
                    
                    
                        Apache Flink
                        UTF-8
                    
                
            
        
    

除此之外,Maven shade plugin还可以创建可执行jar包。实例配置如下:


  ...
  
    
      
        org.apache.maven.plugins
        maven-shade-plugin
        3.2.4
        
          
            package
            
              shade
            
            
              
                
                  
                  org.sonatype.haven.HavenCli
                
              
            
          
        
      
    
  
  ...

通过这两个例子可以看到,Maven shade plugin提供了多种transformer。这些transformer可以理解为官方提供的常用的转换功能。官方提供的几个转换器介绍如下:

转换器 功能
ApacheLicenseResourceTransformer 防止license重复
ApacheNoticeResourceTransformer 合并NOTICE文件
AppendingTransformer 为资源增加内容
ComponentsXmlResourceTransformer 合并 Plexus components.xml
DontIncludeResourceTransformer 阻止包含匹配的资源
IncludeResourceTransformer 增加额外文件到项目中
ManifestResourceTransformer 追加内容到MANIFEST文件
ServicesResourceTransformer 合并所有的 META-INF/services文件
XmlAppendingTransformer 为XML类型资源追加内容

Maven shade plugin的其他功能使用,参见Apache Maven Shade Plugin – Introduction

Maven dependency plugin

用于处理依赖的插件,提供了依赖的分析,列出依赖树,复制依赖到某个目录等。下面介绍几个常用的命令。

dependency:tree

mvn dependency:tree

列出项目的所有依赖树。

dependency:copy-dependencies

mvn dependency:copy-dependencies -DoutputDirectory=src/main/webapp/WEB-INF/lib -DincludeScope=runtime

这个例子,复制项目所有的依赖到src/main/webapp/WEB-INF/lib目录,包含runtime scope的依赖。

当然通过xml方式配置也是可以的。官网的例子如下:


  [...]
  
    
      
        org.apache.maven.plugins
        maven-dependency-plugin
        3.2.0
        
          
            
            copy-dependencies
            package
            
              copy-dependencies
            
            
              
              ${project.build.directory}/alternateLocation
              
              false
              
              true
              
              true
            
          
        
      
    
  
  [...]

Maven frontend plugin

该插件可以通过maven下载并安装nodejs,然后执行配置好的node/npm命令。从而实现了maven可以一同编译前端工程的功能。

我们以flink-runtime-web为例,讲解frontend plugin的使用方式。


    com.github.eirslett
    frontend-maven-plugin
    1.6
    
        
        
            install node and npm
            
                install-node-and-npm
            
            
                
                
                v10.9.0
            
        
        
        
        
            npm install
            
                npm
            
            
                ci --cache-max=0 --no-save
                
                    true
                
            
        
        
        
            npm run build
            
                npm
            
            
                run build
            
        
    
    
        
        web-dashboard
    

更详细的使用方式,参见https://github.com/eirslett/frontend-maven-plugin。

你可能感兴趣的:(Flink 源码周边之Maven Plugin)