NIFI: NoClassDefFoundError - AbstractListProcessor

NIFI: NoClassDefFoundError - AbstractListProcessor

我正在扩展标准处理器以创建自定义 nifi 处理器。该项目构建良好。但是,当我将新生成的 nar 添加到 lib/ 目录后重新启动我的 nifi 时,nifi 无法以 NoClassDefFoundError:

开头
    java.lang.NoClassDefFoundError: org/apache/nifi/processor/util/list/AbstractListProcessor
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
        at java.net.URLClassLoader.access0(URLClassLoader.java:73)
        at java.net.URLClassLoader.run(URLClassLoader.java:368)
        at java.net.URLClassLoader.run(URLClassLoader.java:362)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
        at java.net.URLClassLoader.access0(URLClassLoader.java:73)
        at java.net.URLClassLoader.run(URLClassLoader.java:368)
        at java.net.URLClassLoader.run(URLClassLoader.java:362)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:348)
        at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:370)
        at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:404)
        at java.util.ServiceLoader.next(ServiceLoader.java:480)
        at org.apache.nifi.nar.ExtensionManager.loadExtensions(ExtensionManager.java:138)
        at org.apache.nifi.nar.ExtensionManager.discoverExtensions(ExtensionManager.java:113)
        at org.apache.nifi.web.server.JettyServer.start(JettyServer.java:699)
        at org.apache.nifi.NiFi.<init>(NiFi.java:160)
        at org.apache.nifi.NiFi.main(NiFi.java:267)

如果我遗漏了什么,有人可以帮助我理解吗?

我在处理器包的 POM.xml 中使用了以下依赖项:

    <dependency>
        <groupId>org.apache.nifi</groupId>
        <artifactId>nifi-api</artifactId>
        <version>1.3.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.nifi</groupId>
        <artifactId>nifi-standard-processors</artifactId>
        <version>1.3.0</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.nifi</groupId>
        <artifactId>nifi-processor-utils</artifactId>
        <version>1.3.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.nifi</groupId>
        <artifactId>nifi-utils</artifactId>
        <version>1.3.0</version>
    </dependency>

我在代码中的导入:

    import org.apache.commons.io.IOUtils;
    import org.apache.nifi.components.PropertyDescriptor;
    import org.apache.nifi.flowfile.attributes.CoreAttributes;
    import org.apache.nifi.processor.ProcessContext;
    import org.apache.nifi.processor.util.StandardValidators;
    import org.apache.nifi.processor.util.list.AbstractListProcessor;
    import org.apache.nifi.processors.standard.util.FileInfo;
    import org.apache.nifi.processors.standard.util.FileTransfer;
    import org.apache.nifi.processors.standard.ListFile;

检查你的 nar(nifi 存档)文件 META-INF/MANIFEST.MF 包含 Nar-* 个属性

例如这个定义了对另一个 nar 的依赖:

Nar-Dependency-Id: nifi-standard-services-api-nar

来自 nifi-standard-services-api-nar.nar 的库将在您的 nar 文件的类加载器中可用...

读这个:

https://nifi.apache.org/docs/nifi-docs/html/developer-guide.html#nars

通常处理器并不是真的要扩展,最好不要依赖 nifi-standard-nar。 nifi-processor-utils 项目的存在是为了保存通用代码以在 AbstractListProcessor 等处理器之间共享:

https://github.com/apache/nifi/tree/master/nifi-nar-bundles/nifi-extension-utils

如果 nifi-standard-processors 中还有其他代码应该共享,那么我们应该考虑重构并将其移动到 nifi-extension-utils 下的模块中。

目前,您最好将 ListFile、FileTransfer 和 FileInfo 复制并粘贴到您自己的项目中并相应地修改它们,并删除对 nifi-standard-processors 的依赖。

回答有关为什么会出现该异常的具体问题...这是因为您的 NAR 需要对 nifi-standard-nar 有 NAR 依赖才能在运行时解析 类。此 wiki 页面显示了一个相同情况的示例:

https://cwiki.apache.org/confluence/display/NIFI/Maven+Projects+for+Extensions#MavenProjectsforExtensions-LinkingProcessorsandControllerServices