【问题标题】:NiFi ExecuteScript with Groovy: java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver带有 Groovy 的 NiFi ExecuteScript:java.lang.ClassNotFoundException:com.microsoft.sqlserver.jdbc.SQLServerDriver
【发布时间】:2016-07-16 14:21:23
【问题描述】:

我正在尝试执行一个使用 Microsoft SQL 服务器 JDBC 驱动程序的 Groovy 脚本。我正在尝试在模块目录中指定 sql jdbc jar 的路径。但是,我的 groovy 脚本抱怨找不到 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)

当我在我的 groovy 脚本中打印我的 java 类路径时,我也没有在类路径中看到添加的模块。

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

The added URL shows up in the classloader.

【问题讨论】:

  • 认为 jar 必须在所有盒子的 nifi lib 文件夹中。并且 nifi 可能需要重新启动。 Jdbi jars 必须在系统类加载器中
  • 谢谢蒂姆。这确实奏效了。但是,我想知道在 execuuteProcessor 中添加模块是否有效,或者我在那里做错了什么。

标签: groovy classpath apache-nifi


【解决方案1】:

模块不会在您的 java.class.path 中,而是添加到类加载器中。如果您使用 DriverManager 而不是直接通过 Class.forName().newInstance() 获取驱动程序类的实例,则 JAR 只需要位于系统类加载器(例如 lib/ 文件夹)中。

也许尝试在您的路径中使用正斜杠,如果这不起作用,则可以尝试使用相对路径。如果这样可行,则处理器中存在 Windows 路径错误。

最后,您可以使用驱动程序 JAR 和设置设置 DBCPConnectionPool 控制器服务,然后使用我在我的博客中概述的技术从脚本中访问它:http://funnifi.blogspot.com/2016/04/sql-in-nifi-with-executescript.html。这样,控制器服务就可以被其他处理器(如果需要)重用,并且可以消除设置驱动程序、连接等的所有猜测。

【讨论】:

  • 谢谢马特。我实际上调试了 Nifi 执行处理器并验证找到了 jar 文件并将其添加到路径中。请参阅上面的编辑图像。正如您所展示的,我可能会沿着创建共享处理器并在我的脚本中使用它的路线走下去。只是想在我这样做之前快速测试一下。顺便说一句,感谢您的博客 - 内容丰富。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-21
相关资源
最近更新 更多