从javafx应用程序制作jar文件的正确方法

时间:2018-04-08 12:29:44

标签: java

我有一个javafx项目,它包含多个图像和文本文件路径:

private Image imgMan = new Image(getClass().getResource("../man.gif").toExternalForm());

FileHelper.resetScores("./bin/application/MAP/BestScores.txt");

...

当我从eclipse启动时,它可以正常工作,并且可以毫无问题地访问图像和文件。

但是当我尝试将项目导出到jar文件时,它会正确导出,但它不会启动!

我尝试从cmd启动它,堆栈的痕迹说他不知道路径......

  

引起:java.lang.NullPointerException           在application.Client。(Client.java:31)

(我的代码中的第31行引用了问题中给出的第一行代码)

我尝试创建一个资源文件夹并将所有文件放入其中,但没有结果。

那么最好的方法是什么? 我必须在哪里创建资源文件夹? 以及如何从代码中访问文件?

谢谢

1 个答案:

答案 0 :(得分:1)

你应该检查几件事:

  • 根据您正在查找的课程验证jar中的路径。你的形象必须在那里。
  • 验证您是否已成功加载资源,因为使用它,例如:检查getResource是否返回null。

首先,它取决于你如何建立你的jar:

  • Eclipse将默认将类文件和资源复制到bin,除非您使用m2e。如果您使用 Extract runnable JAR (来自 File> Export 菜单),它可能会忽略某些资源。
  • 如果您使用Maven,则默认情况下您的图片必须位于src/main/resources

对于第二点,您应该使用一种方法,该方法应该在委派给Image之前检查资源是否存在。虽然它不会改变你的核心问题,但你会有一个不那么微妙的错误:

static javafx.scene.image.Image loadImage(Class<?> source, String path) {
  final InputStream is = source.getResourceAsStream(path);
  if (null == is) {
    throw new IllegalStateException("Could not load image from " + source + " path: " + path);
  }
  try (is) { // Java 9 -> you may want to use InputStream is2 = is
    return new javafx.scene.image.Image(is); // use is2 for Java < 9
  }
}

您还应尝试使用绝对路径(来自jar的根目录,或者如果使用maven则使用src/main/resources):

Image image = loadImage(this.getClass(), "/images/man.gif");
相关问题