【问题标题】:Generate and execute JavaFX jar using maven使用 maven 生成并执行 JavaFX jar
【发布时间】:2019-07-13 07:48:32
【问题描述】:

我正在尝试使用以下 JavaFX - Maven 模板(eclipse:版本:2018-09 (4.9.0) Build id:2018)生成和执行一个简单的可运行 jar

它带有一个简单的 JavaFX GUI,我在 Eclipse IDE 上编译的程序很好(我使用的是 JDK 10,jre 10.0.2),但是我不知道如何生成一个可执行的 jar 文件并运行它,如果我使用 Eclipse export->Runnable jar 执行此操作,我会在 main.java 文件的第 14 行收到著名的“java.lag.NullPointerException:需要位置”错误消息。

我搜索了这个错误但无法修复它,因为我只使用一个 fxml 文件并且它已经在 resources/fxml 目录中我不知道为什么它仍然从 getResource() 获得空值方法...

这是项目结构和主类代码 :

问题在于这行代码:

Parent root = FXMLLoader.load(getClass().getResource("/fxml/Scene.fxml"));

公共类 MainApp 扩展应用程序 {

@Override
public void start(Stage stage) throws Exception {
    Parent root = FXMLLoader.load(getClass().getResource("/fxml/Scene.fxml"));

    Scene scene = new Scene(root);
    scene.getStylesheets().add("/styles/Styles.css");

    stage.setTitle("JavaFX and Maven");
    stage.setScene(scene);
    stage.show();
}

/**
 * The main() method is ignored in correctly deployed JavaFX application.
 * main() serves only as fallback in case the application can not be
 * launched through deployment artifacts, e.g., in IDEs with limited FX
 * support. NetBeans ignores main().
 *
 * @param args the command line arguments
 */
public static void main(String[] args) {
    launch(args);
}

}

是eclipse生成jar的方式有问题,还是为maven项目生成可运行jar的更好方式?

【问题讨论】:

  • 您是否尝试过使用更简单的 Export: Jar File 而不是 Runnable Jar File?我从来没有能够让可运行的版本工作并且一直使用更简单的版本。而且,这个导出确实包括一个清单,所以我不明白说明区别是只有 Runnable 版本有一个清单的文档。我不熟悉 Maven,所以这个评论可能根本没有帮助。
  • 我尝试生成一个简单的 jar,但是当我单击它时没有任何反应,当我尝试使用“java -jar myjar.jar”命令运行时它告诉我没有清单文件。所以我无法执行jar文件。编辑:我还尝试通过eclipse javaFX项目生成一个简单的java项目(不使用maven,也不使用fxml文件),双击生成的jar仍然给我同样的错误,但通过命令行运行它就可以了,所以问题是在运行 jar 时定位 fxml 文件...

标签: maven javafx jar


【解决方案1】:

我认为getResources() 中的字符串参数将导致搜索以下内容:

AddressAppNew/fxml/Scene.fxml

由于该文件位于“src/main/resources”包中,因此您必须将这些包和子包作为地址的一部分。

我会尝试以下方法:

getClass().getResource("/src/main/resources/fxml/Scene.fxml")

或者这个:

getClass().getResource("../../../../resources/fxml/Scene.fxml")

后者基于MainApp位于文件夹中

AddressAppNew/src/main/java/com/corp/AdressAddNew

我找不到解释 getResource() 字符串参数的语法 API。我认为开头的“/”指的是项目根目录,如果没有“/”,则字符串会添加到被调用类的文件夹位置。但我可能是错的。这很麻烦,而且我经常不得不求助于一些摸索来获得正确的地址字符串。

【讨论】:

  • 遗憾的是,您的两个建议都不起作用,我仍然遇到同样的错误。据我所知,getResource() 中的第一个“/”是研究从“src/main/resources”文件夹开始的绝对路径,这就是“/fxml/Scene.fxml”的原因。我还尝试使用没有“/”的相对路径“Scene.fxml”,如果我将“Scene.fxml”文件放在与 MainApp.java 相同的文件夹中,它就可以工作。我不知道为什么,但是绝对路径和相对路径在运行 jar 时都不起作用,而它在我的 IDE 上工作得很好......
  • 从未了解过从名为 resources 的文件夹开始的绝对路径。也许那是Maven的事情?它不是 Java API 的一部分,afaik。建议:如果 getResources("Scene.fxml") 有效,则进行多次迭代,例如 getResources("../Scene.fxml") 其中 Scene.fxml 已放入 "corp" 包中,或 ("fxml/Scene .fxml") 其中 fxml 子文件夹位于 AppAdressNew 中,并按照自己的方式找到所需的文件结构。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-16
  • 2022-01-03
  • 2017-07-23
  • 1970-01-01
  • 2010-12-22
  • 2014-04-09
  • 1970-01-01
相关资源
最近更新 更多