我有一个java applet,它使用代理服务到WCF服务来显示数据。 applet在Eclipse中编译和运行完美,但是当我构建并导出一个Jar文件然后在一个html页面中运行它失败了
java.lang.NoClassDefFoundError: javax/xml/rpc/ServiceException.
我在构建路径中包含了jaxrpc.jar,我的jar文件包含了所有必需的类。
堆栈跟踪似乎在抱怨我在applet类中实例化代理服务的行。有没有人知道从Java applet调用WCF服务是否存在问题?
堆栈追踪:
java.lang.RuntimeException: java.lang.NoClassDefFoundError: javax/xml/rpc/ServiceException
at com.sun.deploy.uitoolkit.impl.awt.AWTAppletAdapter.instantiateApplet(Unknown Source)
at sun.plugin2.applet.Plugin2Manager.initAppletAdapter(Unknown Source)
at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NoClassDefFoundError: javax/xml/rpc/ServiceException
at ListProducts.ListProducts.<init>(ListProducts.java:25)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at java.lang.Class.newInstance0(Unknown Source)
at java.lang.Class.newInstance(Unknown Source)
at com.sun.deploy.uitoolkit.impl.awt.AWTAppletAdapter$1.run(Unknown Source)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$200(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: javax.xml.rpc.ServiceException
at sun.plugin2.applet.Applet2ClassLoader.findClass(Unknown Source)
at sun.plugin2.applet.Plugin2ClassLoader.loadClass0(Unknown Source)
at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source)
at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 27 more
这一直困扰着我。
答案 0 :(得分:0)
我认为您的问题是加载rpc jar,而不是调用wcf。
这篇文章可能会有所帮助: http://www.coderanch.com/t/259357/Applets/java/Applet-Axis-Client-Errors
它重新签名你的罐子,确认你可以通过浏览器访问你的所有罐子,确保你有所有dependent.jars。
如果这一切都无济于事 - 我会尝试解决它“ 来自spplet的问题NoClassDefFoundError“问题。
答案 1 :(得分:0)
确定。我通过做几件事来完成这项工作:
首先,我必须签署我正在使用的几个jar文件:
没有jaxrpc.jar
axis.jar
公地发现-0.2.jar
但不是:
javax.wsdl_1.6.2.v201012040545.jar
org.apache.commons.logging_1.0.4.v201101211617.jar
其次 - 所有这些文件必须与html页面存在于同一目录中,因为我没有在applet标记的codebase属性中指定目录。
第三,在我的主applet(ListProducts.class)中,我不得不在首先调用代理服务的代码周围使用AccessController.doPrivileged(): 编辑:这个步骤可能没有必要,因为它现在似乎在删除doPrivileged块时起作用。
AccessController.doPrivileged(new PrivilegedAction() {
public Object run() {
try {
//instantiate proxy service and make rpc's
//do other stuff with results...
} catch (RemoteException e) {
// catch error
}
return null;
}
});
这种组合让java applet做到了它应该做的事情。发现哪些jar文件丢失然后签署适当的jar文件是一个痛苦的缓慢过程。