2016-07-16 136 views
0

我試圖執行使用Microsoft SQL Server JDBC驅動程序的Groovy腳本。我試圖在模塊目錄中指定sql jdbc jar的路徑。但是,我的groovy腳本抱怨沒有找到SQLServerDriver類。NiFi使用Groovy執行腳本:java.lang.ClassNotFoundException:com.microsoft.sqlserver.jdbc.SQLServerDriver

如此配置的樣子 - enter image description here

這是我得到

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") 

The added URL shows up in the classloader.

+0

認爲jar必須位於所有盒子上的nifi lib文件夾中。而且nifi可能需要重啓。 Jdbi jar必須在系統類加載器 –

+0

謝謝Tim。這確實奏效。但是,我想知道在executionuteProcessor中是否添加模塊,或者我在那裏做錯了什麼。 –

回答

0

模塊將不會在你的java.class.path,相反,它被添加到類加載器。如果您正在使用DriverManager,而不是直接通過Class.forName()。newInstance()獲取驅動程序類的實例,則JAR只需位於系統類裝載器(lib /文件夾,例如)中。

也許嘗試在你的路徑中正斜槓,如果這不起作用,一個實驗可能是嘗試相對路徑。如果可行,處理器中會存在Windows路徑錯誤。

最後,您可以使用驅動程序JAR和設置設置DBCPConnectionPool控制器服務,然後使用我在我的博客中概述的技術從腳本訪問它:http://funnifi.blogspot.com/2016/04/sql-in-nifi-with-executescript.html。這樣,控制器服務可以被其他處理器重用(如果需要的話),並且所有的猜測都不需要設置驅動程序,連接等。

+0

謝謝馬特。我實際上調試了Nifi執行處理器並驗證了jar文件被找到並添加到路徑中。請參閱上面的編輯圖像。我可能會沿着創建共享處理器的路線走下去,並在您的腳本中使用它。只是想在我這樣做之前快速測試一下。順便感謝博客 - 非常豐富。 –