将GWT应用程序打包为完全脱机运行,而不是通过;市场“;

将GWT应用程序打包为完全脱机运行,而不是通过;市场“;,gwt,desktop-application,offline,Gwt,Desktop Application,Offline,有几个问题与此类似,所以我会尽量澄清 我们有一个现有的、相当大和复杂的GWT网络游戏,我被要求离线制作。严格来说,它必须离线。 想象一下,我们被告知要用CD-Rom制作它。 所以安装是允许的,但我们不能期望用户去Chrome/Firefox商店并从那里安装它。它需要脱离光盘。 同样,改变浏览器启动标志对用户来说也是不合理的 理想情况下,如果他们只是单击一个HTML文件作为起始页,并在他们选择的浏览器中打开它,那就太好了 我们成功地在Firefox中通过添加 "<add-linker nam

有几个问题与此类似,所以我会尽量澄清

我们有一个现有的、相当大和复杂的GWT网络游戏,我被要求离线制作。严格来说,它必须离线。 想象一下,我们被告知要用CD-Rom制作它。 所以安装是允许的,但我们不能期望用户去Chrome/Firefox商店并从那里安装它。它需要脱离光盘。 同样,改变浏览器启动标志对用户来说也是不合理的

理想情况下,如果他们只是单击一个HTML文件作为起始页,并在他们选择的浏览器中打开它,那就太好了

我们成功地在Firefox中通过添加

"<add-linker name='xsiframe' />"
现在我意识到同源策略问题可能会弹出,因为在开发过程中,我们经常使用chrome中的标志进行本地测试,以通过bi传递它们

问题是…现在我不知道当我们不能使用启动标志时如何绕过它们

显然,在给定的示例中,GWT仅使用.properties文件获取一些与语言相关的文本。我可以用这样或那样的方式将其内联转储。 然而,它只是被阻止的众多文件中的一个。 整个游戏都是为了在服务器上运行*.txt游戏脚本而制作的,以便于非编码人员进行更新。实际上,实际的GWT代码只是一个“引擎”,所有XMLHttpRequested文件都提供了实际的“游戏”

这些档案种类繁多;csv、txt、ntlist、jam。 最后两个是真正的txt文件的自定义扩展名

所有这些文件都被chromes security阻止。据我所知,似乎只有图像被允许在本地访问

编译所有这些文件是不可能的,因为它们的数量不是固定的(即,一个中心.txt文件决定各种场景.txt文件,而这些文件又决定各种对象文件和目录…)。 将所有这些都放到一个捆绑包中是一个创建和维护的噩梦


所以本质上,我需要某种方法来提供GWT项目的脱机版本,该版本可以访问其子目录中的大量不同文件,而不会出现安全问题

到目前为止,我所能想到的只有

A)我可以通过html或gwt告诉chrome,允许像FF一样在chrome中读取这些文件。(我怀疑这是不可能的)。 可能是XMLHttpRequest的替代方案

B)我需要以某种方式将游戏+网络浏览器打包到一个可执行包中,该可执行包有权访问其目录中的文件。( ? ?? ).

C)我需要打包并让用户运行一个完整的Web服务器,然后该服务器可以以XMLHttp可访问的方式交付所有这些文件

D)有点滑稽……我们不能告诉用户在浏览器启动时添加标志……但也许我可以编写一个游戏安装程序,只检测他们是否有Chrome或Firefox。然后在浏览器中打开带有正确标志的游戏html?但是,如果他们使用该实例浏览其他地方,这将带来安全问题,因此如果可能的话,Id可能需要其他标志来禁用url栏


我很高兴对我们的代码进行各种更改以实现这些功能,但是如上所述,没有办法阻止在编译时访问所有需要访问的文件

最后,当然,对于最终用户来说,这一切都必须尽可能简单。 理想情况下,只需单击一个html文件,或者安装一个比标准windows程序更简单的程序

感谢您阅读这篇相当长的解释,欢迎您提出任何建议和想法。我特别感谢做过这件事的人提供多种不同的选择或反馈

========================================

我接受了使用铬的建议,如下所示。

这很有效,并且满足了我的需要(还有更多)

为了帮助其他可能想要使用它的人,我特别对示例项目进行了两个关键更改

<> L> > P>因为CEF需要一个绝对路径来访问Web应用程序本地HTML,所以我编写了一个C++函数来获取.exe的目录。这是一个特定于平台的实现,因此如果支持几个操作系统(CEF支持),请确保为每个操作系统编写专用代码

  • 因为我的webapp将使用本地文件,所以我通过更改浏览器设置启用了Chrome标志; browser\u settings.file\u access\u from\u file\u url=状态\u ENABLED


  • 这两个变化足以让我的应用程序正常工作,但这显然是制作应用程序的最低要求。希望我的发现能对其他人有所帮助。

    我建议走包装路线。也就是说,提供直接打开文件的最小浏览器实现。选项已嵌入[1]。如果应用程序的性质绝对要求将文件作为非文件URL提供,则绑定一个最小的Web服务器,让磁盘上的可执行文件启动服务器,并使用所需的任何启动参数打开绑定的浏览器


    [1]

    谢谢,我会检查Chromium Embedded,看看它是否可用。很抱歉花了这么长时间,是的,CEF正是我们所需要的,它似乎工作得很好。将编辑我的帖子,帮助他人了解细节。
    XMLHttpRequest cannot load file:///E:/Game%20projects/[Thorn]%20Game/ThornGame/text/messages_en.properties. Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https, chrome-extension-resource.MyApplication-0.js:34053 com_google_gwt_http_client_RequestBuilder_$doSend__Lcom_google_gwt_http_client_RequestBuilder_2Ljava_lang_String_2Lcom_google_gwt_http_client_RequestCallback_2Lcom_google_gwt_http_client_Request_2 MyApplication-0.js:34053