NiFi ExecuteScript с Groovy: java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver

Я пытаюсь выполнить сценарий Groovy, который использует драйвер JDBC сервера Microsoft SQL. Я пытаюсь указать путь к банке sql jdbc в каталоге модулей. Однако мой отличный скрипт жалуется, что класс SQLServerDriver не найден.

Вот как выглядит конфигурация - введите описание изображения здесь

Это ошибка, которую я получаю

Caused by: java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:264)
    at groovy.sql.Sql.loadDriver(Sql.java:705)
    at groovy.sql.Sql.newInstance(Sql.java:445)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
    at org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite$StaticMetaMethodSiteNoUnwrap.invoke(StaticMetaMethodSite.java:133)
    at org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite.call(StaticMetaMethodSite.java:91)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:149)
    at Script1.run(Script1.groovy:23)
    at org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.eval(GroovyScriptEngineImpl.java:352)

Когда я печатаю свой путь к классам java в своем Groovy-скрипте, я также не вижу добавленный модуль в пути к классам.

println "classPath:" + System.getProperty("java.class.path")

Добавленный URL отображается в загрузчике классов.


person abhishek mishra    schedule 16.07.2016    source источник
comment
Думаю, банка должна находиться в папке nifi lib на всех ящиках. И нифи, вероятно, потребуется перезагрузка. Jdbi-файлы должны быть в системном загрузчике классов   -  person tim_yates    schedule 16.07.2016
comment
Спасибо, Тим. Это сработало. Однако я хотел знать, работает ли добавление модулей в execuuteProcessor или я что-то там делаю не так.   -  person abhishek mishra    schedule 17.07.2016


Ответы (1)


Модуль не будет в вашем java.class.path, вместо этого он будет добавлен в загрузчик классов. JAR должен быть только в системном загрузчике классов (например, lib / folder), если вы используете DriverManager, а не получаете экземпляр вашего класса драйвера напрямую через Class.forName (). NewInstance ().

Возможно, попробуйте использовать косую черту на своем пути, и если это не сработает, в качестве эксперимента можно попробовать относительный путь. Если это сработает, в процессоре есть ошибка пути Windows.

Наконец, вы можете настроить службу контроллера DBCPConnectionPool, используя драйвер JAR и настройки, а затем получить к ней доступ из своего скрипта, используя технику, которую я описываю в моем блоге: http://funnifi.blogspot.com/2016/04/sql-in-nifi-with-executescript.html. Таким образом, служба контроллера может быть повторно использована другими процессорами (при необходимости), и это избавляет от всех догадок при настройке драйвера, соединения и т. Д.

person mattyb    schedule 16.07.2016
comment
Спасибо, Мэтт. Я фактически отлаживал процессор выполнения Nifi и убедился, что файл jar был найден и добавлен в путь. См. Отредактированное изображение выше. Я, вероятно, пойду по пути создания общего процессора и буду использовать его в моем скрипте, как вы показали. Просто хотел быстро протестировать это, прежде чем делать это. Кстати, спасибо за блог - очень информативный. - person abhishek mishra; 17.07.2016