0

早上好。从 WSDL 生成 AAR 文件并进行部署后,当客户端调用进入时,我在骨架接口上收到 NoClassDefFoundError。

奇怪的是,我的消息接收器位于 AAR 文件的同一位置,在堆栈跟踪中被引用,因为我在 services.xml 中定义了它。目前尚不清楚为什么它能够加载一个类,但不能以完全相同的路径加载另一个类。

我的服务类实现 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),并将它们放在自己的 JAR 文件中,位于 WEB-INF/lib 中。

因此,只有服务定义在 AAR 文件中,所有相关的类都存在于 WEB-INF/classes 和 WEB-INF/lib 中。

于 2012-09-25T16:26:02.087 回答
0

您说您生成的类文件在 AAR 内,但您的服务类存储在它之外?在这种情况下,由于类加载器的工作方式,服务类将无法访问生成的类文件。

这里基本上有三个类加载器:

  1. Axis2 类加载器可以读取 AAR 内部并访问存储在那里的类。它的父类加载器是 catalina 类加载器。

  2. catalina 类加载器由 Web 应用程序环境提供。它可以读取环境附带的文件。它的父级是 Java 类加载器。

  3. Java 类加载器是标准的类加载器,它使用 CLASSPATH、随 JRE 一起安装的 jar 等。

每个类加载器都可以遵循其父级。因此,例如,如果 Axis2 类加载器必须解析对 java.lang.String 的引用,它将推迟到 catalina 加载器,后者将推迟到 java 加载器,后者从 JRE 环境加载类。

但是,反过来是行不通的,这导致了你的错误。Axis2 引用了您的服务类,导致调用 Axis2 加载器来加载该类。Axis2 加载器延迟到 Catalina 加载器,后者找到并尝试加载该类。您的服务类引用了骨架接口类,因此 catalina 类加载器必须解析该引用。但是,catalina 加载器无法访问 Axis2 加载器,因此它无法“看到”AAR 中的任何类。

于 2012-09-26T00:38:13.517 回答