Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Axis2 在AAR文件中找不到骨架接口类_Axis2_Axis - Fatal编程技术网

Axis2 在AAR文件中找不到骨架接口类

Axis2 在AAR文件中找不到骨架接口类,axis2,axis,Axis2,Axis,早上好。从WSDL生成AAR文件并进行部署后,当客户端调用传入时,我在骨架接口上得到一个NoClassDefFoundError 奇怪的是,我的消息接收器位于AAR文件的同一位置,因为我在services.xml中定义了它,所以堆栈跟踪中引用了它。不清楚为什么它能够加载一个类,但不能加载完全相同路径中的另一个类 My service类实现CoreSkeletOnInterface,并在services.xml中定义,但它存在于webapp的WEB-INF/classes文件夹中的AAR文件之外。

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

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

My service类实现CoreSkeletOnInterface,并在services.xml中定义,但它存在于webapp的WEB-INF/classes文件夹中的AAR文件之外。我想这不会引起任何问题

这是堆栈跟踪。任何帮助都将不胜感激

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)

尽管对上述内容有一些想法会很好,但我确实实现了一个变通方法

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


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

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

这里基本上有三个类装入器:

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

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

  • Java类加载器是标准类加载器,它使用类路径、与JRE一起安装的JAR等

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

    然而,相反的方法不起作用,这导致了您的错误。Axis2引用了您的服务类,导致调用Axis2加载程序来加载该类。Axis2加载程序延迟到Catalina加载程序,后者发现并尝试加载该类。您的服务类引用了骨架接口类,因此catalina类装入器必须解析该引用。但是,catalina加载器无法访问Axis2加载器,因此它无法“看到”AAR中的任何类