GWT Bootstrap3 Openlayers 离线
我正在使用 GWT 和 Bootstrap3 以及 Openlayers Map。我已经实现了自己的 OSM Map 服务器。 我的应用程序在没有互联网连接的情况下无法启动。我需要指导。
我按照 boostrap3 V1.0.2 中针对离线应用程序的说明进行操作。 但是我只得到了一个空白屏幕。
从 Firefox 调试器开始,我在控制台中收到以下消息:
Uncaught ReferenceError: OpenLayers is not defined
<anonymous> http://www.openstreetmap.org/openlayers/OpenStreetMap.js:7
从 Google Chrome 开始,我收到以下警告
[Deprecation] Application Cache API manifest selection is deprecated and will be removed in M85, around August 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
接着
GET http://www.openlayers.org/api/OpenLayers.js net::ERR_INTERNET_DISCONNECTED
和
localhost/:1 Application Cache Error event: Invalid or missing manifest origin trial token: http://localhost:8090/simaso/simasoweb/appcache.manifest
这是我的基本设置
SiMaSoWeb.gwt.xml:
...
<inherits name='com.google.gwt.json.JSON'/>
<inherits name="com.google.web.bindery.autobean.AutoBean"/>
<inherits name="org.gwtbootstrap3.extras.cachemanifest.Offline"/>
...
<add-linker name="offline" />
SiMaSoWeb.html:
<!doctype html>
<html manifest="simasoweb/appcache.manifest">
<head>
<title>Sirene</title>
<script type="text/javascript" language="javascript" src="simasoweb/simasoweb.nocache.js"></script>
<script src="http://www.openlayers.org/api/OpenLayers.js"></script>
<script src="http://www.openstreetmap.org/openlayers/OpenStreetMap.js"></script>
<link type="text/css" rel="stylesheet" href="SiMaSoWeb.css">
....
</html>
在 ...\simasoweb\appcache.manifest 中我发现:
CACHE MANIFEST
# Version: 1599380329409.0.6297069797290025
CACHE:
AF4477772D0DB53A10ABCF74A5AE0C4D.cache.js
fonts/fontawesome-webfont.woff
clear.cache.gif
fonts/FontAwesome.otf
css/bootstrap-notify-custom.min.cache.css
7192594CA2F468C2F793523022719FA0.cache.js
...
css/font-awesome-4.7.0.min.cache.css
NETWORK:
*
最后 我编译了所有这些。资源似乎包含在 war 文件中。 不用说,有了互联网连接,仅在启动后的前 1-2 秒内,一切都运行良好。
根据您添加的 Google Chrome 警告 ,App Cache 是已弃用的标准,即将被删除。它已从非安全上下文中移除。
您应该改用 Service Workers 来缓存资源以供离线使用。您可能必须编写自己的链接器,或者您可以使用 gwt-serviceworker-linker 。
感谢 ELEVATE,我成功从 AppCache 迁移到 ServiceWorker。但是 Openlayers 无法通过这种方式修复。因此,以下是解决问题的方法:
ServiceWorker
-
我仍在使用 Java 8
-
我升级到了 GWT 2.9
-
我添加到 .gwt.xml
<inherits name="org.realityforge.gwt.serviceworker.Linker"/> <inherits name="elemental2.dom.Dom"/> <inherits name="elemental2.promise.Promise"/> <inherits name="jsinterop.base.Base"/>
... 和
<add-linker name="serviceworker"/>
<extend-configuration-property name="serviceworker_static_files" value="./"/>
<extend-configuration-property name="serviceworker_static_files" value="../SiMaSoWeb.html"/>
在我的 onModuleLod 开头的条目 JAVA 例程中,我添加了
import static elemental2.dom.DomGlobal.*;
import elemental2.dom.DomGlobal;
public void onModuleLoad() {
...
initStatic();
...
后来在该模块中
public void initStatic() {
if ( null != navigator.serviceWorker )
{
navigator.serviceWorker.register("simasoweb/"+ GWT.getModuleName() + "-sw.js" ).then( registration -> {
console.log( "ServiceWorker registration successful with scope: " + registration.getScope() );
// Every minute attempt to update the serviceWorker. If it does update
// then the "controllerchange" event will fire.
DomGlobal.setInterval( v -> registration.update(), 60000 );
return null;
}, error -> {
console.log( "ServiceWorker registration failed: ", error );
return null;
} );
navigator.serviceWorker.addEventListener( "controllerchange", e -> {
// This fires when the service worker controlling this page
// changes, eg a new worker has skipped waiting and become
// the new active worker.
console.log( "ServiceWorker updated ", e );
} );
}
}
}
我在访问 gwt - war 目录中的正确文件时遇到了问题。因此我更新了 navigator.serviceWorker.register... 命令。 谷歌内置的调试器非常有用,只需按下 CTRL+SHIFT+I。在“控制台”选项卡中,您可以找到消息 - 红色表示不好 - 解决它!
作为外部 jar 库,我必须包含
elemental2-core
elemental2-dom
elemental2-promise
base
现在是 openlayers 问题......不用说,可能有一种更优雅的方式,而且,您需要一个离线地图,我已经自己渲染并且可用(德国 150GB!)。
- 在 HTML 文件中
请注意,我在浏览器中打开了 openlayers 和 openstreetmap .js 文件,将它们复制到一个文件中,然后将它们复制到子目录 src 中的 war 目录中。再次,浏览器调试器可以帮助查找目录问题。
<script type="text/javascript" language="javascript" src="simasoweb/simasoweb.nocache.js"></script>
<script src="src/OpenLayers.js"></script>
<script src="src/OpenStreetMap.js"></script>
- 复制困难 我下载了 gwt-openlayers 演示项目 GWT-OpenLayers-master.zip 并将 GWT-OpenLayers-master\gwt-openlayers-showcase\src\main\resources\org\gwtopenmaps\demo\openlayers\public\openlayers 中的所有文件复制到我的 ...war\src\ 目录中,我的 openlayers.js 文件就位于该目录中。
最后,我不确定 service-worker 的第 1-3 点是否真的有帮助。