我正在扩展标准处理器以创建自定义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.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中使用以下依赖项:
<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;
答案 0 :(得分:1)
在您的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
答案 1 :(得分:1)
一般来说,处理器并没有真正意义上的扩展,最好不要依赖于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依赖性才能在运行时解析类。这个维基页面显示了一个相同情况的例子: