首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >nifi: NoClassDefFoundError - AbstractListProcessor

nifi: NoClassDefFoundError - AbstractListProcessor
EN

Stack Overflow用户
提问于 2017-08-15 07:51:15
回答 2查看 1.1K关注 0票数 0

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

代码语言:javascript
复制
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.access$100(URLClassLoader.java:73)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
    at java.net.URLClassLoader$1.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.access$100(URLClassLoader.java:73)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
    at java.net.URLClassLoader$1.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$1.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中使用以下依赖项:

代码语言:javascript
复制
<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>

我在代码中的导入:

代码语言:javascript
复制
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;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-15 21:42:43

一般来说,处理器实际上并不是用来扩展的,最好不要依赖于nifi-standard-nar。nifi-processor-utils项目的存在是为了保存通用代码,以便在AbstractListProcessor等处理器之间共享:

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

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

现在,您最好将ListFile、FileTransfer和FileInfo复制并粘贴到您自己的项目中,并对它们进行相应的修改,并删除对nifi标准处理器的依赖。

要回答关于为什么会出现这种异常的具体问题...这是因为您的NAR需要对nifi-standard-nar具有NAR依赖,以便在运行时解析类。此维基页面显示了一个与此相同的示例:

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

票数 2
EN

Stack Overflow用户

发布于 2017-08-15 19:18:30

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

例如,下面的代码定义了对另一个nar的依赖:

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45684653

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档