找不到AAR文件中的Skeleton接口类

时间:2012-09-25 15:27:57

标签: axis2 axis

早上好。从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)

2 个答案:

答案 0 :(得分:0)

虽然对上述内容有所了解,但我确实实施了一种解决方法。

具体来说,我完全从AAR文件(保留META-INF和services.xml)中取出生成的类文件,并将它们放在WEB-INF / lib中自己的JAR文件中。

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

答案 1 :(得分:0)

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

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

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

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

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

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

    然而,反向不会起作用,这导致了您的错误。 Axis2引用了您的服务类,导致调用Axis2加载程序来加载该类。 Axis2加载程序延迟到Catalina加载程序,它发现并试图加载该类。您的服务类引用了框架接口类,因此catalina类加载器必须解析该引用。然而,catalina装载机无法访问Axis2装载机,因此它无法看到"" AAR内的任何课程。