我可以使用其他构建系统来构建具有NiFi的自定义处理器吗?

时间:2016-07-13 21:13:54

标签: maven-plugin apache-nifi

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

我考虑的选项:

  • 建造一个胖罐(例如:https://github.com/sbt/sbt-assembly)。我看到NAR中的pom文件,但实际上是用于任何东西还是只是元数据?我看到像NarUnpacker,NarClassLoader这样的类,所以我想知道Nar格式中是否有某些特定内容会阻止Fat jar工作。
  • 对插件进行反向工程并创建一个SBT。可能是一些工作,然后我们冒险与原始插件的更改失去同步。
  • 围绕SBT的maven插件构建一个包装器。我认为这不会起作用,因为插件是由maven库构建的。
  • 仅将NiFi子项目作为maven构建并通过SBT父项目运行。 (例如http://www.scala-sbt.org/0.13/docs/Process.html
  • 放弃并说服管理层使用maven。

1 个答案:

答案 0 :(得分:3)

NAR用于在NiFi中提供类加载器隔离。每个NAR都是一个包含它所需的所有JAR的工件,它们只对该NAR可见。这可以防止不同NAR使用的冲突库,因此如果一个NAR使用Guava 16而另一个NAR使用Guava 18,则不会导致问题。

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

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

开发者指南涵盖了以下内容: 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