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
标签内可以使用includes
和excludes
标签,配合通配符,起到按照文件名过滤的功能。如下:
../flink-examples/flink-examples-streaming/target
examples/streaming
0644
*.jar
flink-examples-streaming*.jar
original-*.jar
MatrixVectorMul.jar
files标签
和fileSets
类似,用于复制单个文件到输出目录。包含一个或多个file
标签。
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。