我可以使用另一个构建系统来构建带有 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?
我考虑过的选项:
- 构建一个 fat jar(例如:https://github.com/sbt/sbt-assembly)。我在 NAR 中看到 pom 文件,但这些文件实际上用于任何用途还是只是元数据?我看到 类 像 NarUnpacker、NarClassLoader,所以我想知道 Nar 格式中是否有特定的东西会阻止 Fat jars 工作。
- 对插件进行逆向工程并创建一个 SBT 插件。可能需要一些工作,然后我们冒着与原始插件的更改不同步的风险。
- 围绕 SBT 的 maven 插件构建一个包装器。但是我认为这不会起作用,因为该插件是基于 Maven 库构建的。
- 只留下 NiFi 子项目作为 Maven 构建,运行 通过 SBT 父项目。 (例如 http://www.scala-sbt.org/0.13/docs/Process.html)
- 放弃并说服管理层使用 maven。
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 作为构建工具:
我创建了一个SBT plugin that is inspired from sbt-pack and nifi-maven。
我的公司使用 SBT/Scala,所以我的目标是用这些而不是 Maven/Java 开发我们的定制 NiFi 处理器。我遇到的问题是我不知道如何使用 SBT 生成 NAR 文件。 NiFi 有一个 nifi-nar-maven-plugin 包插件,它用于将所有处理器依赖项打包到一个 jar (nar) 中。有没有办法使用 SBT 构建 NAR?
我考虑过的选项:
- 构建一个 fat jar(例如:https://github.com/sbt/sbt-assembly)。我在 NAR 中看到 pom 文件,但这些文件实际上用于任何用途还是只是元数据?我看到 类 像 NarUnpacker、NarClassLoader,所以我想知道 Nar 格式中是否有特定的东西会阻止 Fat jars 工作。
- 对插件进行逆向工程并创建一个 SBT 插件。可能需要一些工作,然后我们冒着与原始插件的更改不同步的风险。
- 围绕 SBT 的 maven 插件构建一个包装器。但是我认为这不会起作用,因为该插件是基于 Maven 库构建的。
- 只留下 NiFi 子项目作为 Maven 构建,运行 通过 SBT 父项目。 (例如 http://www.scala-sbt.org/0.13/docs/Process.html)
- 放弃并说服管理层使用 maven。
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 作为构建工具:
我创建了一个SBT plugin that is inspired from sbt-pack and nifi-maven。