0

おはようございます。WSDLからAARファイルを生成してデプロイした後、クライアント呼び出しが着信すると、スケルトンインターフェイスでNoClassDefFoundErrorが発生します。

奇妙なことに、services.xmlで定義したため、AARファイルと同じ場所にあるメッセージレシーバーがスタックトレースで引用されています。あるクラスをロードできるのに、まったく同じパスで別のクラスをロードできない理由は不明です。

私のサービスクラスはCoreSkeletonIntefaceを実装し、services.xmlで定義されていますが、AARファイルの外部のwebappのWEB-INF/classesフォルダーに存在します。問題は発生しないと思います。

これがスタックトレースです。どんな助けでもいただければ幸いです。

java.lang.NoClassDefFoundError: org/caqh/www/soap/wsdl/CoreSkeletonInterface
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:634)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2818)
at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1159)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1647)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1526)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:334)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:186)
at org.apache.axis2.util.Loader.loadClass(Loader.java:261)
at org.apache.axis2.util.Loader.loadClass(Loader.java:229)
at org.apache.axis2.receivers.AbstractMessageReceiver.makeNewServiceObject(AbstractMessageReceiver.java:250)
at org.apache.axis2.receivers.AbstractMessageReceiver.getTheImplementationObject(AbstractMessageReceiver.java:297)
at org.caqh.www.soap.wsdl.CoreMessageReceiverInOut.invokeBusinessLogic(CoreMessageReceiverInOut.java:23)
at org.apache.axis2.receivers.AbstractInOutMessageReceiver.invokeBusinessLogic(AbstractInOutMessageReceiver.java:40)
at org.apache.axis2.receivers.AbstractMessageReceiver.receive(AbstractMessageReceiver.java:114)
4

2 に答える 2

0

上記についていくつか考えてみるのは素晴らしいことですが、回避策を実装しました。

具体的には、生成されたクラスファイルをAARファイルから完全に引き出し(META-INFとservices.xmlを残して)、WEB-INF/lib内の独自のJARファイルに配置しました。

したがって、サービス定義のみがAARファイルにあり、関連するすべてのクラスはWEB-INF/classesおよびWEB-INF/lib内に存在します。

于 2012-09-25T16:26:02.087 に答える
0

生成されたクラスファイルはAAR内にあると言いますが、サービスクラスはAARの外に保存されていますか?その場合、クラスローダーの動作方法が原因で、サービスクラスは生成されたクラスファイルにアクセスできません。

ここには基本的に3つのクラスローダーがあります。

  1. Axis2クラスローダーはAAR内を読み取り、そこに格納されているクラスにアクセスできます。その親クラスローダーはカタリナクラスローダーです。

  2. カタリナクラスローダーは、Webアプリケーション環境によって提供されます。環境に付属するファイルを読み取ることができます。その親はJavaクラスローダーです。

  3. Javaクラスローダーは、CLASSPATH、JREとともにインストールされたjarなどを使用する標準のクラスローダーです。

各クラスローダーは、その親に延期できます。したがって、たとえば、Axis2クラスローダーがjava.lang.Stringへの参照を解決する必要がある場合、JRE環境からクラスをロードするjavaローダーに従うカタリナローダーに延期されます。

ただし、その逆は機能せず、エラーが発生しました。Axis2がサービスクラスを参照した結果、Axis2ローダーが呼び出されてクラスが読み込まれました。Axis2ローダーはCatalinaローダーに延期され、Catalinaローダーはクラスを見つけてロードしようとしました。サービスクラスはスケルトンインターフェイスクラスを参照しているため、カタリナクラスローダーはその参照を解決する必要がありました。ただし、カタリナローダーはAxis2ローダーにアクセスできないため、AAR内のクラスを「見る」ことができませんでした。

于 2012-09-26T00:38:13.517 に答える