0

我正在调试一个为某个数据库事务调用运行 Groovy 程序的 Java 应用程序。当指针经过 Groovy 程序的以下行时

sql.eachRow("select.....from...where...",[value0, value1])

它打印以下异常

    - Servlet.service() for servlet Groovy threw exception
java.lang.NoClassDefFoundError: org/apache/commons/collections/CursorableLinkedList
    at org.apache.commons.pool.impl.GenericObjectPool.<init>(GenericObjectPool.java:392)
    at org.apache.commons.pool.impl.GenericObjectPool.<init>(GenericObjectPool.java:258)
    at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:795)
    at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:540)
    at groovy.sql.Sql$36.run(Sql.java:1192)
    at java.security.AccessController.doPrivileged(Native Method)
    at groovy.sql.Sql.createConnection(Sql.java:1190)
    at groovy.sql.Sql.eachRow(Sql.java:466)
    at gjdk.groovy.sql.Sql_GroovyReflector.invoke(Unknown Source)
    at groovy.lang.MetaMethod.invoke(MetaMethod.java:115)
    at org.codehaus.groovy.runtime.MetaClassHelper.doMethodInvoke(MetaClassHelper.java:713)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:560)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:450)
    at org.codehaus.groovy.runtime.Invoker.invokeMethod(Invoker.java:119)
    at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:111)
    at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(ScriptBytecodeAdapter.java:187)
    at sce_expiry$_run_closure1_closure4_closure5.doCall(sce_expiry.groovy:70)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:592)
    at org.codehaus.groovy.runtime.ReflectionMetaMethod.invoke(ReflectionMetaMethod.java:69)
    at org.codehaus.groovy.runtime.MetaClassHelper.doMethodInvoke(MetaClassHelper.java:713)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:560)
    at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodOnCurrentN(ScriptBytecodeAdapter.java:97)
    at sce_expiry$_run_closure1_closure4_closure5.doCall(sce_expiry.groovy)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:592)

sce_expiry.groovy 是 groovy 文件名。

其他人推荐的解决方案就像确保 common-collections.jar 和 groovy-all.jar 在类路径中。我已经验证过了。这两个 jar 文件都位于我的 Tomcat 内 webapp 目录的 lib 文件夹中。并且可以在 common-collections.jar 中找到具有相同包名的类。

实际上,我对 Groovy 的体验几乎为零。所以我真的不确定是否需要一些额外的配置。

有人有什么主意吗?

--------------找到的解决方案和问题可能会改变-------------

好的,所以我找到了两种方法来完成这项工作。它们是相关的。

首先,我在这里使用的是 Tomcat 5。在Tomcat文件夹中,有一个common/lib目录供用户放置应用程序共享的jar文件。

已经有一些 Apache commons-xxx.jar 文件,但没有 commons-collection.jar。如果我将 commons-collection.jar 的副本与现有的 jar 文件放在一起,它将起作用!或者,删除一个 jar 文件(commons-dbcp.jar),它也可以工作。commons-collection.jar 和 commons-dbcp.jar 都可以在应用程序自己的 lib 文件夹中找到。

然而,我需要对此做更多的研究,但我怀疑 commons-dbcp.jar 需要与 commons-collection.jar 一起用于我调用的函数,并且 common/lib 文件夹需要更高的优先级才能读入. 因此,一旦commons-dbcp.jar 被读入,Tomcat 将在应用程序的lib 文件夹中引入相同的内容,并且只与common lib 文件夹中的那个一起工作。虽然 common lib 文件夹中没有 commons-collection,但在 commons-dbcp.jar 查找它时它会抱怨。如果我错了,请纠正我。我不完全了解Tomcat是如何工作的..

所以这个问题不再用 Groovy 和 Grails 标记,而是用 Java 和 Tomcat 5 标记。

4

0 回答 0