Apache NiFi Custom NAR NoClassDefFoundError во время запуска - PullRequest
0 голосов
/ 03 марта 2019

Я пытаюсь установить специальный сервисный пакет контроллера NAR в моей установке NiFi, но получаю эту ошибку во время запуска.Он действует так, как будто не может найти класс RecordReaderFactory из nifi-record-serialization-service-api, даже если он включен как зависимость:

<dependency>
   <groupId>org.apache.nifi</groupId>
   <artifactId>nifi-record-serialization-service-api</artifactId>
   <version>1.9.0</version>
</dependency>

Вот проект: https://github.com/adamfisher/nifi-zonefile-record-serialization-service

Запуск maven install успешно создает NAR.Просто когда я запускаю NiFi, выдает эту ошибку.Я уверен, что это проблема конфигурации POM maven.Я просто не слишком много работаю с Java и надеюсь, что кто-то сможет пролить свет на то, почему он не находит зависимый класс, который ему нужен?

nifi-app.log:

2019-03-02 15:22:15,245 INFO [main] org.apache.nifi.web.server.JettyServer Loading WAR: D:\nifi\NIFI-1~2.0\.\work\nar\framework\nifi-framework-nar-1.9.0.nar-unpacked\NAR-INF\bundled-dependencies\nifi-web-error-1.9.0.war with context path set to /
2019-03-02 15:22:15,261 INFO [main] org.apache.nifi.web.server.JettyServer Running in HTTP mode; host headers not restricted
2019-03-02 15:22:16,386 ERROR [main] org.apache.nifi.NiFi Failure to launch NiFi due to java.lang.NoClassDefFoundError: org/apache/nifi/serialization/RecordReaderFactory
java.lang.NoClassDefFoundError: org/apache/nifi/serialization/RecordReaderFactory
    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.StandardExtensionDiscoveringManager.loadExtensions(StandardExtensionDiscoveringManager.java:152)
    at org.apache.nifi.nar.StandardExtensionDiscoveringManager.discoverExtensions(StandardExtensionDiscoveringManager.java:127)
    at org.apache.nifi.nar.StandardExtensionDiscoveringManager.discoverExtensions(StandardExtensionDiscoveringManager.java:113)
    at org.apache.nifi.web.server.JettyServer.start(JettyServer.java:925)
    at org.apache.nifi.NiFi.<init>(NiFi.java:158)
    at org.apache.nifi.NiFi.<init>(NiFi.java:72)
    at org.apache.nifi.NiFi.main(NiFi.java:297)
Caused by: java.lang.ClassNotFoundException: org.apache.nifi.serialization.RecordReaderFactory
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 23 common frames omitted
2019-03-02 15:22:16,387 INFO [Thread-1] org.apache.nifi.NiFi Initiating shutdown of Jetty web server...
2019-03-02 15:22:16,387 INFO [Thread-1] org.apache.nifi.NiFi Jetty web server shutdown completed (nicely or otherwise).

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Зависимости NAR используются во время выполнения для создания цепочки загрузчиков родительских классов.Итак, в вашем примере у вас есть

nifi-zonefile-record-serialization-service-nar -> (зависит от)

nifi-zonefile-record-serialization-service-api-nar ->(зависит от)

nifi-standard-services-api-nar

В работающем приложении, когда оно создает экземпляр вашего устройства чтения записей из NAR вашего сервиса, оно затем должно загрузить интерфейскоторый реализуется из NAR API вашего сервиса, который затем должен загрузить интерфейс RecordReader, который происходит из NAR API стандартных сервисов.

0 голосов
/ 03 марта 2019

Мне также пришлось включить файл API NAR, хотя он, кажется, нигде не используется.Это просто шаблонный класс с именем MyService.

...