我正在制作一个涉及用户能够上传文件的GWT应用程序。我的问题是......
GWT有什么问题?似乎每次我尝试在我的项目中包含一个jar文件时,它都不喜欢它。我正在使用Eclipse。一切都编译得很好,但是在运行时,会发生UmbrellaExceptions,最终会追溯到某些ClassNotFoundException(与我刚尝试使用的任何新的jarrified类有关)。
我在其他地方读过一些关于此事的内容,但我不记得究竟是什么交易;无论出于什么原因,GWT只是与某些库不兼容..?比如java.io。几乎包装中的所有内容都会导致这种情况发生。就像,我甚至无法将FileNotFoundException用于简单的文件I / O.
再次,澄清一下:所有导入和编译都很好,但GWT不希望因某种原因加载某些类。
我最近的问题是尝试使用Apache的Tika内容进行文件验证。试图实例化他们的任何类,例如
Metadata metadata = new Metadata();
原因
java.lang.ClassNotFoundException: org.apache.tika.metadata.Metadata
at com.google.gwt.dev.shell.CompilingClassLoader.findClass(CompilingClassLoader.java:1061)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at gwtupload.client.Uploader$10.onSubmit(Uploader.java:454)
at com.google.gwt.user.client.ui.FormPanel$SubmitEvent.dispatch(FormPanel.java:178)
at com.google.gwt.user.client.ui.FormPanel$SubmitEvent.dispatch(FormPanel.java:1)
at com.google.gwt.event.shared.GwtEvent.dispatch(GwtEvent.java:1)
at com.google.web.bindery.event.shared.EventBus.dispatchEvent(EventBus.java:40)
at com.google.web.bindery.event.shared.SimpleEventBus.doFire(SimpleEventBus.java:193)
at com.google.web.bindery.event.shared.SimpleEventBus.fireEvent(SimpleEventBus.java:88)
at com.google.gwt.event.shared.HandlerManager.fireEvent(HandlerManager.java:127)
at com.google.gwt.user.client.ui.Widget.fireEvent(Widget.java:129)
at com.google.gwt.user.client.ui.FormPanel.fireSubmitEvent(FormPanel.java:618)
at com.google.gwt.user.client.ui.FormPanel.submit(FormPanel.java:556)
at gwtupload.client.Uploader.submit(Uploader.java:1051)
at gwtupload.client.SingleUploader$1.onClick(SingleUploader.java:141)
at com.google.gwt.event.dom.client.ClickEvent.dispatch(ClickEvent.java:54)
at com.google.gwt.event.dom.client.ClickEvent.dispatch(ClickEvent.java:1)
at com.google.gwt.event.shared.GwtEvent.dispatch(GwtEvent.java:1)
at com.google.web.bindery.event.shared.EventBus.dispatchEvent(EventBus.java:40)
at com.google.web.bindery.event.shared.SimpleEventBus.doFire(SimpleEventBus.java:193)
at com.google.web.bindery.event.shared.SimpleEventBus.fireEvent(SimpleEventBus.java:88)
at com.google.gwt.event.shared.HandlerManager.fireEvent(HandlerManager.java:127)
at com.google.gwt.user.client.ui.Widget.fireEvent(Widget.java:129)
at com.google.gwt.event.dom.client.DomEvent.fireNativeEvent(DomEvent.java:116)
at com.google.gwt.user.client.ui.Widget.onBrowserEvent(Widget.java:177)
at com.google.gwt.user.client.DOM.dispatchEventImpl(DOM.java:1351)
at com.google.gwt.user.client.DOM.dispatchEvent(DOM.java:1307)
at sun.reflect.GeneratedMethodAccessor33.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)
at com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)
at com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:172)
at com.google.gwt.dev.shell.BrowserChannelServer.reactToMessagesWhileWaitingForReturn(BrowserChannelServer.java:337)
at com.google.gwt.dev.shell.BrowserChannelServer.invokeJavascript(BrowserChannelServer.java:218)
at com.google.gwt.dev.shell.ModuleSpaceOOPHM.doInvoke(ModuleSpaceOOPHM.java:136)
at com.google.gwt.dev.shell.ModuleSpace.invokeNative(ModuleSpace.java:561)
at com.google.gwt.dev.shell.ModuleSpace.invokeNativeObject(ModuleSpace.java:269)
at com.google.gwt.dev.shell.JavaScriptHost.invokeNativeObject(JavaScriptHost.java:91)
at com.google.gwt.core.client.impl.Impl.apply(Impl.java)
at com.google.gwt.core.client.impl.Impl.entry0(Impl.java:213)
at sun.reflect.GeneratedMethodAccessor27.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)
at com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)
at com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:172)
at com.google.gwt.dev.shell.BrowserChannelServer.reactToMessages(BrowserChannelServer.java:292)
at com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:546)
at com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:363)
at java.lang.Thread.run(Unknown Source)
答案 0 :(得分:5)
GWT将您的代码编译为Javascript,后者在Web浏览器中运行。您不能使用java.io
来执行简单的文件I / O,因为浏览器中的Javascript不允许执行文件I / O.几乎任何有趣的库都将访问未由GWT运行时模拟的类。
此外,在编译为Javascript时,GWT运行时不会自动包含JAR文件。您需要可用的源代码,并且需要编写XML描述符以在Javascript生成中包含库源。
有关扩展GWT的信息,请参阅this thread和this tutorial。
答案 1 :(得分:3)
这是因为由于它的工作方式,GWT必须emulate classes of the JRE。
如果你想在GWT中使用另一个类,你必须从GWT的基类派生它。存在一些库,它们在客户端扩展GWT。
但是,在服务器端,可以使用任何库。