我可以使用另一个构建系统来构建带有 NiFi 的自定义处理器吗?

Can I use another build system to build custom processors with NiFi?

我的公司使用 SBT/Scala,所以我的目标是用这些而不是 Maven/Java 开发我们的定制 NiFi 处理器。我遇到的问题是我不知道如何使用 SBT 生成 NAR 文件。 NiFi 有一个 nifi-nar-maven-plugin 包插件,它用于将所有处理器依赖项打包到一个 jar (nar) 中。有没有办法使用 SBT 构建 NAR?

我考虑过的选项:

NAR 用于在 NiFi 中提供 class-loader 隔离。每个 NAR 都是一个工件,其中包含它需要的所有 JAR,并且它们仅对该 NAR 可见。这可以防止不同 NAR 使用的库发生冲突,因此如果一个 NAR 使用 Guava 16 而另一个 NAR 使用 Guava 18,则不会造成问题。

NAR 被解压到 nifi_home/work/nar。例如,查看 nifi-0.7.0/work/nar/extensions/nifi-ambari-nar-0.7.0.nar-unpacked/META-INF/bundled-dependencies/ 它将显示包含在 ambari NAR 中的所有 JARS。

每个 NAR 都可以依赖于另一个 NAR,这就是处理器可以使 NAR 依赖于控制器服务的方式。在这些情况下,NAR Maven 插件在 NAR 中创建一个特殊的 MANIFEST 文件,指定父 NAR 的 id,NiFi 使用该 id 来执行适当的 class 加载。

开发人员指南涵盖了其中的一些内容: https://nifi.apache.org/docs/nifi-docs/html/developer-guide.html#nars

我个人建议使用 Maven,因为 NAR 插件是生成 NAR 的标准方式。正如您所指出的,可能可以使用 SBT 创建一个类似的插件,但似乎需要付出很多努力。使用 Maven 并不意味着你不能使用 Scala...这个项目提供了一个在 Scala 中开发处理器的模板,但仍然使用 Maven 作为构建工具:

https://github.com/jfrazee/nifi-processor-bundle-scala.g8

我创建了一个SBT plugin that is inspired from sbt-pack and nifi-maven