GWT开发模式问题

时间:2013-05-13 14:23:39

标签: gwt jetty

我在开发模式下使用自定义Jetty容器运行GWT应用程序。应用程序第一次加载正常,但是,如果我刷新它,我会在开发模式窗口中看到以下错误(路径已更改):

00:16:44.854 [ERROR] Unable to create file 'C:\somePath\src\war\msjavaSnack\C4EA130FD0ED44BE513FEEDDE13614DA.cache.png'
java.io.FileNotFoundException: C:\somePath\src\war\msjavaSnack\C4EA130FD0ED44BE513FEEDDE13614DA.cache.png (The requested operation cannot be performed on a file with a user-mapped section open) 
at java.io.FileOutputStream.open(Native Method) 
at java.io.FileOutputStream.<init>(FileOutputStream.java:194) 
at java.io.FileOutputStream.<init>(FileOutputStream.java:145) 
at com.google.gwt.core.ext.linker.impl.StandardLinkerContext.writeArtifactToFile(StandardLinkerContext.java:658) 
at com.google.gwt.core.ext.linker.impl.StandardLinkerContext.produceOutputDirectory(StandardLinkerContext.java:595) 
at com.google.gwt.dev.DevMode.produceOutput(DevMode.java:476) 
at com.google.gwt.dev.DevModeBase.relink(DevModeBase.java:1131) 
at com.google.gwt.dev.DevModeBase.access$000(DevModeBase.java:67) 
at com.google.gwt.dev.DevModeBase$2.accept(DevModeBase.java:1076) 
at com.google.gwt.dev.shell.ShellModuleSpaceHost$1.accept(ShellModuleSpaceHost.java:122) 
at com.google.gwt.dev.shell.StandardRebindOracle$Rebinder.rebind(StandardRebindOracle.java:59) 
at com.google.gwt.dev.shell.StandardRebindOracle.rebind(StandardRebindOracle.java:154) 
at com.google.gwt.dev.shell.ShellModuleSpaceHost.rebind(ShellModuleSpaceHost.java:119) 
at com.google.gwt.dev.shell.ModuleSpace.rebind(ModuleSpace.java:531) 
at com.google.gwt.dev.shell.ModuleSpace.rebindAndCreate(ModuleSpace.java:414) 
at com.google.gwt.dev.shell.GWTBridgeImpl.create(GWTBridgeImpl.java:39) 
at com.google.gwt.core.client.GWT.create(GWT.java:98) 
at com.extjs.gxt.ui.client.GXT.<clinit>(GXT.java:38) 
at com.extjs.gxt.ui.client.widget.Component.<clinit>(Component.java:202) 
at msjava.snack.gui.client.MSHeaderPanelViewport.<init>(MSHeaderPanelViewport.java:62) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
at com.google.gwt.dev.shell.ModuleSpace.rebindAndCreate(ModuleSpace.java:422) 
at com.google.gwt.dev.shell.ModuleSpace.onLoad(ModuleSpace.java:361) 
at com.google.gwt.dev.shell.OophmSessionHandler.loadModule(OophmSessionHandler.java:185) 
at com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:380) 
at com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:222) 
at java.lang.Thread.run(Thread.java:662)

更新

在ProcessExplorer中,我可以看到托管Jetty的JVM进程有一个打开的文件句柄,所以这可能是其他JVM(托管开发模式)无法写入的原因。有什么方法可以解决它吗?

2 个答案:

答案 0 :(得分:0)

似乎两个(打开/关闭)(打开/关闭)rutines在同一个文件上一个接一个地发生一个接一个导致这个...一些开发人员建议调用gc。检查每次I / O操作是否正确关闭。不要太快执行完整(打开,循环(写入),关闭)。似乎当一个操作将在第二个请求到达时完成并且抛出问题。

答案 1 :(得分:0)

我在此页面上找到了解决方案:

http://docs.codehaus.org/display/JETTY/Files+locked+on+Windows

修改

上面的网址现在已经死了。

现在在Jetty的wiki中找到解决方案非常容易:

  

Jetty在webdefault.xml文件中提供配置开关   DefaultServlet,用于启用或禁用内存映射的使用   文件。如果您在Windows上运行并且正在进行文件锁定   问题,您应该将此开关设置为禁用内存映射文件   缓冲器。

     

默认的webdefault.xml文件位于lib / jetty.jar中   组织/日蚀/码头/ web应用/ webdefault.xml。将其提取到方便的地方   磁盘位置并编辑它以将useFileMappedBuffer更改为false。

https://wiki.eclipse.org/Jetty/Howto/Deal_with_Locked_Windows_Files