GWT,Tomcat,2个模块,JRebel:DevMode在错误的位置查找nocache.js并显示404未找到

时间:2013-12-17 09:20:38

标签: java tomcat tomcat7 jrebel gwt-dev-mode

我先问我的问题,然后详细说明:

  1. hosted.html文件在DevMode中播放了什么功能以及从hosted.html?<module-name>这样的页面请求它的原因以及如何控制/配置该请求返回的内容? 如果有人回答这个问题,我会upvote&amp;接受答案,因为我自己已经找到了第2和第3个问题的答案,而且它们似乎与我的问题无关。

  2. 有没有办法触发GWT缓存刷新而不是普通浏览器Ctrl-F5?在我编译clear.cache.gif文件期间生成的每个模块中 - 它与GWT缓存有任何关系吗? 已经由我自己回答,在这种情况下似乎没什么帮助

  3. 我是否正确指定了DevMode-war路径(见下文)?我应该指定src/main/webapp文件夹的绝对路径吗? 已经由我自己回答,在这种情况下似乎没什么帮助

  4. 我的设置有什么问题以及为什么我遇到下面描述的问题? (可选择回答,但如果回答正确 - 我会立即投票并接受答案:)

  5. 编辑 - 与第一个问题相关的详细信息

    因此,我的webapp中有2个GWT模块:logindashboard。问题是在DevMode页面login.html只包含login模块始终正常加载,提出以下请求

    GET http://localhost:8080/login/hosted.html?login                200 OK
    

    返回标准hosted.html页面,该页面由GWT编译器生成并放入每个模块的文件夹中。

    但是某些只包含dashboard.html模块的dashboard页面无法正常加载以下请求:

    GET http://localhost:8080/dashboard/hosted.html?dashboard        304 Not Modified
    
    Cache-Control:private
    Date:Tue, 17 Dec 2013 13:07:40 GMT
    ETag:W/"11781-1367504122000"
    Expires:Thu, 01 Jan 1970 03:00:00 EET
    Last-Modified:Thu, 02 May 2013 14:15:22 GMT
    Server:Apache-Coyote/1.1
    

    哪个令人惊讶返回login.html页面作为结果,而不是我期望的标准hosted.html文件。请注意,这在过去的半年中很少发生,并且通过多次按Ctrl-F5解决了。但从昨天开始,这种情况总是发生。

    继续搜索,向hosted.html?dashboard提出请求的人或者是谁,以及对此做出如此奇怪回应的回复。

    编辑#2 - 与第一个问题相关的详细信息 发现问题出在服务器端 - 为什么响应第二个请求(如上所述)的状态代码为304 Not Modified。在调试Catalina代码时,发现问题出在org.zeroturnaround.javarebel.integration.fileservlet.FileServlet类,它最终为文件提供服务。此类来自JRebel(版本5.2.2),它是使用-javaagent选项与Tomcat一起启动的。如果我删除-javaagent选项并在没有JRebel的情况下启动Tomcat,一切正常并且提供了正确的文件。将尝试深入挖掘并在JRebel的课程中找出问题。

    编辑#3 - 与第一个问题相关的详细信息

    升级到JRebel-5.4.2后,错误仍然存​​在。 在Zeroturnaround论坛上开始讨论主题: http://zeroturnaround.com/forums/topic/gwt-devmode-tomcat-7-0-39-possible-fileservlet-bug/

    我的问题的详细说明(没有什么非常有趣的 - 只是详情:)):

    我遇到了Devmode运行2个名为logindashboard的模块的webapp的问题。 Webapp正在本地部署到标准的tomcat安装,并具有如下目录结构:

    <tomcat_folder>/webapps/ROOT/login.html
    <tomcat_folder>/webapps/ROOT/login/
    <tomcat_folder>/webapps/ROOT/login/<single gwt.rpc file>
    <tomcat_folder>/webapps/ROOT/login/<multiple .cache.html files>
    <tomcat_folder>/webapps/ROOT/login/gwt/<standard files>
    <tomcat_folder>/webapps/ROOT/login/clear.cache.gif
    <tomcat_folder>/webapps/ROOT/login/login.nocache.js
    <tomcat_folder>/webapps/ROOT/login/hosted.html
    
    <tomcat_folder>/webapps/ROOT/dashboard.html
    <tomcat_folder>/webapps/ROOT/dashboard/
    <tomcat_folder>/webapps/ROOT/dashboard/<two .gwt.rpc files>
    <tomcat_folder>/webapps/ROOT/dashboard/<multiple .cache.html, .cache.png, etc files>
    <tomcat_folder>/webapps/ROOT/dashboard/gwt/<standard files>
    <tomcat_folder>/webapps/ROOT/dashboard/clear.cache.gif
    <tomcat_folder>/webapps/ROOT/dashboard/dashboard.nocache.js
    <tomcat_folder>/webapps/ROOT/dashboard/hosted.html
    <tomcat_folder>/webapps/ROOT/dashboard/<other css and image resources used by page>
    
    <tomcat_folder>/webapps/ROOT/<other files of webapp>
    

    现在,login.html包含对login.nocache.js文件的引用,如下所示:

        <script src="login/login.nocache.js" type="text/javascript" language="javascript"></script>
    

    dashboard.html分别包含对dashboard.nocache.js文件的引用:

        <script src="dashboard/dashboard.nocache.js" type="text/javascript" language="javascript"></script>
    

    我使用以下参数从DevMode启动Eclipse

    -remoteUI "${gwt_remote_ui_server_port}:${unique_id}" 
    -startupUrl http://localhost:8080/login.html -logLevel INFO 
    -noserver -war <absolute-path-to-tomcat-folder>/webapps/ROOT 
    -codeServerPort 9997 
    org.yura.cases.DashboardModule org.yura.cases.LoginModule
    

    现在,我正在使用这样的设置,现在已经半年了,一切都运行正常,但它完美地运行不在DevMode中,比方说,95%的时间我成功地使用{{1调试代码,在Eclipse等中更改它。

    但是,问题是(并且过去),我不时打开

    DevMode

    页面为空白,我在浏览器控制台中看到以下错误:

    http://localhost:8080/dashboard.html?gwt.codesvr=127.0.0.1:9997 
    

    当我转到在页面加载期间加载的GET http://localhost:8080/dashboard/login/login.nocache.js/ 404 (Not Found) hosted.html:10 文件时,我看到此文件是从以下URL加载的:

    hosted.html:10

    并且返回的HTML文件确实包含http://localhost:8080/dashboard/hosted.html?dashboard 的错误路径:

    login.nocache.js

    (路径错误,因为<script src="login/login.nocache.js" type="text/javascript" language="javascript"></script> dashboard / login / login.nocache.js`)

    直到今天,我通过简单地按住login/login.nocache.js' is relative path and it resolves to几秒钟来重新加载页面并清除浏览器缓存并最终在Ctrl-F5中正常加载页面来绕过这个问题。但是,今天,无论我按DevMode多长时间,错误仍然存​​在。这就是我决定一劳永逸地解决这个问题的原因。

    提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

找到我的第2和第3个问题的答案,尽管它们似乎对我的问题没什么帮助。无论如何,在这里分享它们:

  

问题2.是否有任何方法可以触发GWT缓存刷新而不是普通浏览器Ctrl-F5?在我编译过程中生成的每个模块中   clear.cache.gif文件 - 它与GWT缓存有任何关系吗?

根据http://www.gwtproject.org/doc/latest/DevGuideCompilingAndDebugging.html#launching_a_browser

  

修改源代码后,无需重新启动开发模式。相反,在开发模式仍在运行的情况下,编辑客户端代码或资源,保存更改,然后在浏览器中刷新页面。

根据GWT project directory creation by hand

  

clear.cache.gif是一个1x1可缓存图像,用于为标记添加占位符。请参阅http://code.google.com/p/google-web-toolkit/wiki/ImageBundleDesign(“用于图像的剪切构造函数”)

事实证明,在我的情况下,按F5或Ctrl-F5应该完全可以解决问题,并且没有其他方法可以“刷新”至少向公众宣传的GWT缓存。

  

问题3.我是否正确指定了DevModes -war路径(见下文)?我应该指定src / main / webapp文件夹的绝对路径吗?

是的,根据Using my own server in development mode instead of GWT's built-in Jetty instance教程,我已正确指定-war选项。

编辑 - 找到第4个问题的答案(解决我的问题) 好的,事实证明该错误发生在org.zeroturnaround.javarebel.integration.fileservlet.FileServlet类中,在极少数情况下错误地处理ETag标题。这就是为什么它服务于login.html内容,而Tomcat之前返回的内容是对受保护的/dashboard/hosted.html?dashboard资源的非认证访问(Tomcat的奇怪但标准行为)的结果。 JRebel的修正应出现在今天的每晚构建中,我99%肯定它会起作用:)

有关详细信息,请参阅此讨论:http://zeroturnaround.com/forums/topic/gwt-devmode-tomcat-7-0-39-possible-fileservlet-bug/#post-39379

真的希望这有助于其他人:)