去年一年发现 Apache NIFI的迭代速度加快了,一年的时间发布了很多版本。我们自定义开发NIFI,希望在满足自定义的同时, 又能够很方便快速的升级版本(毕竟是吧,一两个人的开发怎么能搞得过我大Apache开源社区)。所以结合NIFI源码结构的特点, 我做了一个自定义开发NIFI的项目结构规范。
1. 自定义开发时能够独立新建子moudle的,优先新建子moudle项目。
1.1 只要是新建的component组件,都是可以新建子项目独立处理的
1.2 大部分针对组件级别的修改(比如加个属性改写个功能什么的),是可以通过继承覆盖解决的。当然,发现问题,在源码上解决问题,
推个PR并被社区采纳才是最棒的。
1.3 新建子moudle的NIFI内部nar、jar依赖版本要重视统一管理
2. 需要修改源码的,代码层级需要详细注释,并在相应的wiki里做出文档说明并及时维护
3. 切记轻易不要修改源码的包名路径名
4. 注意代码质量
1. 尽量不要修改或大篇幅的修改前端代码(关于NIFI国际化的想法我认为是没必要考虑的,本身架构不支持,修改代价太大)
2. 不得已必须修改前端的源码,需要详细注释,并在wiki里做出文档说明并及时维护
1. 指定整个应用的dependencyManagement
2. 定义项目的发布的仓库地址distributionManagement
3. 所有第三方依赖的版本号全部定义在properties下
4. 所有内部模块依赖版本号统一使用${project.version}
(注:NIFI所有的内部模块依赖版本号全部在custom-nar-bundles中声明)
5. 指定所有的子模块modules
1. 明确定义parent模块的artifactId,groupId,version
2. 不要定义子模块的version(同parent保持一致)
3. 子模块无需定义groupId
4. 建议子模块所有的依赖包版本管理全部集成在直接parent模块
(如果是隶属不同nar的依赖版本管理,需要明确在名称命名上显示出来,比如<nar1.jackson.version>))
升级NIFI版本,需要统一各个Moudle <parent>中的<version>时,修改完custom-nar-bundles的版本号后,
在custom-nar-bundles目录下执行以下maven命令
mvn -N versions:update-child-modules
参考custom-standard-bundle的配置
这一套自定义开发代码结构规范,达到了对NIFI源码侵入程度最小的效果了。总体只要微微修改了源码文件四处地方就可以融合到源码项目
第一处:
nifi的pom.xml 添加 custom-nar-bundles的依赖
第二处:
在nifi-assembly的pom.xml 添加zip依赖
<dependency>
<groupId>org.apache.nifi</groupId>
<artifactId>custom-assembly</artifactId>
<version>2.2.0</version>
<classifier>resources</classifier>
<scope>runtime</scope>
<type>zip</type>
</dependency>第三处:
在nifi-assembly的src/main/assembly/dependencies.xml中排除custom-assembly.zip包
<dependencySets>
<!-- Write out all dependency artifacts to lib directory -->
<dependencySet>
<scope>runtime</scope>
<useProjectArtifact>false</useProjectArtifact>
<outputDirectory>lib</outputDirectory>
<directoryMode>0770</directoryMode>
<fileMode>0664</fileMode>
<useTransitiveFiltering>true</useTransitiveFiltering>
<excludes>
<exclude>nifi-bootstrap</exclude>
<exclude>nifi-resources</exclude>
<exclude>nifi-docs</exclude>
<exclude>custom-assembly</exclude>
<!-- exclude jaxb/activation/annotation libs from lib, they'll be included in the java11 subdir -->
<!-- TODO: remove these once minimum Java version is 11 -->
<exclude>javax.xml.bind:jaxb-api</exclude>
<exclude>com.sun.xml.bind:jaxb-impl</exclude>
<exclude>com.sun.xml.bind:jaxb-core</exclude>
<exclude>javax.activation:javax.activation-api</exclude>
<exclude>javax.annotation:javax.annotation-api</exclude>
</excludes>
</dependencySet>
</dependencySets>
添加一行 custom-assembly
第四处:
在nifi-assembly的src/main/assembly/common.xml中配置解压策略,在dependencySets中添加如下dependencySet 注意unpackOptions不能加 true 会导致nar jar文件损坏
<!-- Write out all dependency artifacts to jdbc directory -->
<dependencySet>
<scope>runtime</scope>
<useProjectArtifact>false</useProjectArtifact>
<outputDirectory>./</outputDirectory>
<directoryMode>0770</directoryMode>
<fileMode>0664</fileMode>
<useTransitiveFiltering>true</useTransitiveFiltering>
<includes>
<include>custom-assembly</include>
</includes>
<unpack>true</unpack>
<unpackOptions>
<includes>
<include>conf/*</include>
<include>jdbc/*</include>
<include>lib/*</include>
</includes>
</unpackOptions>
<excludes>
</excludes>
</dependencySet>