【问题标题】:GWT, Tomcat, 2 modules, JRebel: DevMode looks for nocache.js in wrong location and shows 404 not foundGWT、Tomcat、2 个模块、JRebel:DevMode 在错误位置查找 nocache.js 并显示 404 not found
【发布时间】:2013-12-17 09:20:37
【问题描述】:

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

  1. hosted.html 文件在DevMode 中播放什么函数,为什么从像hosted.html?<module-name> 这样的页面请求它,我如何控制/配置该请求返回的内容? 如果有人回答了这个问题,我会投赞成票并接受答案,因为我自己已经找到了第二个和第三个问题的答案,而且它们似乎与我的问题无关。

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

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

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

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

所以我的 webapp 中有 2 个 GWT 模块:logindashboard。问题是 DevMode 页面 login.html 仅包含 login 模块 always 正常加载,发出以下请求

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),它使用 Tomcat 使用-javaagent 选项启动。如果我删除-javaagent 选项并在没有JRebel 的情况下启动Tomcat,一切正常并提供正确的文件。将尝试更深入地挖掘并找出JRebel课堂中的问题。

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

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

我的问题的详细描述(没什么有趣的 - 只是细节:)):

我在运行 2 个名为 logindashboard 的模块的 webapp 中遇到了 Devmode 的问题。 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>

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

-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% 的时间我都在成功使用 DevMode - 调试代码,在 Eclipse 等中更改它。

但是,问题是(过去也是如此),当我不时打开时

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

当我转到在页面加载期间加载的 hosted.html:10 文件时,我看到该文件是从以下 URL 加载的:

http://localhost:8080/dashboard/hosted.html?dashboard

并且返回的 HTML 文件确实包含错误的 login.nocache.js 路径:

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

(路径错误,因为login/login.nocache.js' is relative path and it resolves todashboard/login/login.nocache.js`)

直到今天,我通过简单地按住Ctrl-F5 几秒钟来重新加载页面并清除浏览器缓存并最终在DevMode 中正常加载页面来绕过这个问题。但是,今天,无论我按Ctrl-F5 多久,错误仍然存​​在。这就是为什么我决定最终一劳永逸地解决这个问题。

提前感谢您的帮助!

【问题讨论】:

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


    【解决方案1】:

    找到了我的第二个和第三个问题的答案,尽管它们似乎对我的问题没有太大帮助。无论如何,在这里分享它们:

    问题 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 选项。

    编辑 - 找到第四个问题的答案(我的问题的解决方案) 好的,事实证明该错误位于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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-18
      • 1970-01-01
      • 2015-05-31
      • 2019-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多