【问题标题】:Google Maps API works in Eclipse, Not when Exported as a JARGoogle Maps API 在 Eclipse 中工作,而不是在导出为 JAR 时
【发布时间】:2016-05-22 08:58:01
【问题描述】:

注意:问题似乎与访问资源无关。尝试访问相关资源时不会引发异常或发出警告。我花了两天时间解决这个问题,现在当你搜索“javafx google map does + not work in JAR”时,这个问题是谷歌上的第一个和第二个问题。

我有一个项目可以在 Eclipse 中工作,但在导出为 JAR 时不能。它使用 JRE 1.8.0_65、JavaFX、GMapsFX,并引用 javax.json-1.0.4.jar 库。我在运行 OS X 10.9.5 的 Mac 上。

该项目是对 Google Map 的一些路径查找功能的重新创建。它使用由 JavaFX 和 GMapsFX 构建的 GUI,可与 Google 地图交互。

当我将项目导出为 JAR 并运行 JAR 时,专用于显示 Google 地图并允许用户选择位置标记以添加到路径的 GUI 部分中没有出现任何内容。请注意,交互式谷歌地图应该在启动时出现,然后在用户加载一些数据后添加标记。以下是一些截图用于说明:

在 Eclipse 中运行时的工作截图:

导出为 JAR 后屏幕截图无效:

Google Map API 的 URL 位于项目中名为“index.html”的文件中。我测试了,JAR 正确加载了这个文件。此外,JAR 会正确加载数据文件并根据这些数据文件创建标记对象以添加到显示中。

因此,问题在于 JAR 没有显示交互式 Google 地图和由数据文件构建的标记,这些数据文件应放置在 Google 地图上。为什么???

加载 Goole 地图的逻辑框架如下所示:

GoogleMapView mapComponent =
   (
    webview = new WebView();
    webengine = new JavaFxWebEngine(webview.getEngine());
    JavascriptRuntime.setDefaultWebEngine(webengine);
    webengine.getLoadWorker()[etc];
    webengine.load(getClass().getResource(htmlFile).toExternalForm()); // the variable "htmlFile" is "/html/index.html" and seems to be access properly by both Eclipse and the JAR.
   )
mapComponent.addMapInitializedListener(); 
[the mapComponent is initialized and so the mapInitilized() function fires]
MapOptions options = [some options to pass the GoogleMap constructor, such as a zoom level and a center]
GoogleMap map = mapComponent.createMap(options);

此时,Eclipse 项目显示带有给定选项的 Google 地图,而 JAR 版本显示空白区域,其中应该有带有给定选项的 Google 地图。

当从 Eclipse 将项目导出为可运行的 JAR 时,我已经尝试了包含引用库的三个选项中的每一个,并且我在导出构建路径中包含了 JRE 运行时库和 javax.json 引用库。

我在运行 JAR 时遇到的唯一错误,无论我做什么或点击哪里,都如下:

com.sun.javafx.css.StyleManager getCachedImage
WARNING: Error loading image: rsrc:dialog-error.png
com.sun.javafx.css.StyleManager getCachedImage
WARNING: Error loading image: rsrc:dialog-information.png

这些错误来自一个警告框,当我点击“显示路线”时弹出一个警告框,没有选择起点或终点,并且似乎与未显示的 Google 地图无关。

这里是一个 GitHub 存储库的链接,您可以在其中检查整个代码:https://github.com/ToolsForInsight/GraphSearch

任何想法是什么问题?如果有帮助,我可以提供更多详细信息和一些代码。谢谢!

【问题讨论】:

  • 您的所有图片/资源和库都在项目中,还是您的磁盘上都有?你使用相对路径还是绝对路径?
  • 我电脑上的所有资源都在项目中,使用相对路径。如果您想看一下,我在问题末尾添加了更新。
  • 您是否引用了带有file: 的任何网址?喜欢stackoverflow.com/questions/28724478/javafx-image-loading-error?您是否取消了 WebView 以显示此 .html 文件?
  • 是的,Eclipse 使用file: 引用了.html url。因此,当打印webengine.load(getClass().getResource(htmlFile).toExternalForm()); 的getClass() 部分时,Eclipse 打印file:/absolutepath/index.html,但JAR 打印relativepath/index.html。是的,我使用 WebView 来显示 .html 文件。所以逻辑是这样的:webview = new WebView();; webengine = new JavaFxWebEngine(webview.getEngine()); ; JavascriptRuntime.setDefaultWebEngine(webengine); ; webengine.getLoadWorker()[etc] ; webengine.load(getClass().getResource(htmlFile).toExternalForm());
  • 然后,一旦该代码被执行,我将mapInitializedListener 添加到创建的mapComponent,即GoogleMapView 对象。在 JAR 中,mapInitializedListener 识别视图何时初始化并触发 mapInitialized() 方法中的代码,该方法包括传递给 map = mapComponent.createMap(options) 的中心纬度/经度等选项,从而创建 google.maps.Map JavaScript带有选项的对象。然后下一行在 WebView 上设置警报。这是 Eclipse 中 Google Map 出现的地方,但它没有出现在 JAR 版本中。

标签: java eclipse google-maps javafx jar


【解决方案1】:

我想这不适合评论。 我的模拟程序的项目结构是这样的:

    C:.
    └───src
        ├───main
        │   ├───java
        │   │   └───com
        │   │       └───domain
        │   │           └───d3project
        │   │               └───adapter
        │   └───resources
        │       └───com
        │           └───domain
        │               └───d3project
        │                   ├───JavaScript
        │                   ├───JSON
        │                   ├───pictures
        │                   ├───index.html 
//                                ^  index in resource folder                             
        │                   └───Styles
        │                       └───images
        └───test
            └───java
                └───com
                    └───domain
                        └───d3project
                            └───adapter

src/main 下,我有一个文件夹javaresources,只要它们有相同的包,我就可以像这样加载我的index.html

webView = new WebView();
webEngine = webView.getEngine();
try {
    webEngine.load(getClass().getResource("index.html").toExternalForm());
} catch (Exception e) {
     e.printStackTrace();
}

我不知道这是否能解决您的问题或对您有任何帮助,但这是我在设置项目时遇到的问题之一。 This helped me.

【讨论】:

  • 嗯。我将不得不仔细看看,但我不确定这一点。如果我的问题与您的问题相似,JAR 版本在尝试访问 .html 文件或基于或访问 .html 文件中的任何代码创建任何对象时不会抛出异常吗?
  • 它可能会,我想这超出了我的范围:-/
猜你喜欢
  • 2013-04-03
  • 1970-01-01
  • 1970-01-01
  • 2015-06-05
  • 1970-01-01
  • 2012-09-15
  • 2015-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多