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 の経験はほとんどありません。したがって、追加の構成が必要かどうかはわかりません。

誰にもアイデアはありますか?

--------------------------解決策が見つかり、質問が変わる可能性があります--------------

さて、これを機能させる2つの方法を見つけました。そして、それらは関連しています。

まず、ここでは Tomcat 5 を使用しています。Tomcat フォルダーには、ユーザーがアプリケーションで共有される jar ファイルを配置するための common/lib ディレクトリがあります。

すでにいくつかの Apache commons-xxx.jar ファイルが配置されていますが、commons-collection.jar はありません。commons-collection.jar のコピーを既存の jar ファイルと一緒に配置すると、機能します。または、1 つの jar ファイル (commons-dbcp.jar) を削除しても機能します。commons-collection.jar と commons-dbcp.jar は両方とも、アプリケーション独自の lib フォルダーで利用できます。

それでも、これについてさらに調査する必要がありますが、呼び出す関数に対して commons-dbcp.jar が commons-collection.jar と連携する必要があり、その common/lib フォルダーが読み込まれる優先度が高いと思われますしたがって、commons-dbcp.jar が読み込まれると、Tomcat はアプリの lib フォルダーにある同じものを無視し、共通の lib フォルダーにあるものだけを操作します。commons-collection は common lib フォルダーで利用できませんでしたが、commons-dbcp.jar がそれを探しているときに不平を言いました。私が間違っている場合は、私を修正してください。Tomcatがどのように機能するのか完全にはわかりません..

したがって、この質問は Groovy と Grails ではなく、Java と Tomcat 5 でタグ付けされています。

4

0 に答える 0