【问题标题】:getResource of Class and Classloader null when running from jar从 jar 运行时,Class 和 Classloader 的 getResource 为 null
【发布时间】:2017-07-09 17:46:08
【问题描述】:

在阅读了一堆关于资源系统的帖子后,我仍然遇到了这个问题。

情景:

我目前正在开发一个 javafx 应用程序,它既可以作为 jar 也可以作为 Applet 运行。 我正在使用简单的技巧 JavaFX into Swing Applications 将我的应用程序包装到 fxpanel 中。

两个版本在 Eclipse 中都能正常工作。

但是现在,一旦调用了第一个 fx 控制器,jar 和 Applet 都会遇到相同的问题。

我的包结构:

/*
 1. 
    2.
        3.
            controller.
                        EntryPoint.class <-- Main
                        MenuController.class
                        TabsController.class
            ui.
                pane.
                        MainMenu.fxml
                        Startuppane.fxml
                        Tabs.fxml
                note.
                        NoteSearch.fxml
                        NoteView.fxml

 */

//编辑:我解压后的 jar 中的树命令:Pastebin //edit End

我的应用程序执行以下操作:

首先,它从 EntryPoint.class 加载 RootLayout

MainBorder = ROOTLOADER.load(EntryPoint.class.getResourceAsStream("/1/2/3/ui/pane/StartupPane.fxml"));

然后是两个孩子、一个菜单和一些选项卡。

菜单工作正常,因为 MenuController 本身不加载任何其他子项。

现在真正的问题是在调用 TabsController 时出现,并尝试加载它自己的子项,例如 NoteView。

    TP  = TABSLOADER.load(EntryPoint.class.getResourceAsStream("/1/2/3/ui/pane/Tabs.fxml")); //Loading The Tabs.

所以 TabPane 被加载,当 TabsController 现在尝试加载他自己的 Childitems 时。我总是在导出的 jar 或 webapplet 中得到一个 NullPointer。

我尝试使用以下方法加载 ChildItems:

NOTE_SEARCH_LOADER.load(TabsController.class.getResourceAsStream("/1/2/3/ui/note/NoteSearch.fxml")); 

在 Eclipse 中工作正常,但一旦导出会导致未知路径/空指针

NOTE_SEARCH_LOADER.load(TabsController.class.getClassLoader().getResourceAsStream("1/2/3/ui/note/NoteSearch.fxml")); 

使用 ClassLoader 代替,删除第一个 Slash。在 Eclipse 中工作,一旦导出导致 Unknown path / NullPointer

NOTE_SEARCH_LOADER.load(EntryPoint.class.getResourceAsStream("/1/2/3/ui/note/NoteSearch.fxml"));

将 EntryPoint.class (main) 与绝对路径一起使用。在 Eclipse 中工作,一旦导出。导出时未知路径/NullPointer。

NOTE_SEARCH_LOADER.load(EntryPoint.class.getClassLoader().getResourceAsStream("1/2/3/ui/note/NoteSearch.fxml"));

使用我的主类中的 ClassLoader,删除第一个 Slash。在 Eclipse 中工作,导出时未知路径/NullPointer。

//edit3:我做了另一个测试,将代码从 TabController 复制到 EntryPoint。即使在导出到 Jar 或 Applet 之后,代码的 EntryPoint 版本也可以工作。

估计是有事,Controller是怎么调用的?

//编辑结束

我摸不着头脑,想知道我还能尝试什么。

//edit2:当我解压我的 fxml 时,可以在给定的位置找到导致 FXML 的 NullPointer。

//编辑结束

也许我又错过了一些非常明显的东西。

神仙

法比安95qw

访问线程列表:

Get a resource using getResource()

Preferred way of loading resources in Java

URL to load resources from the classpath in Java

How to reference javafx fxml files in resource folder?

How do I use Java getResource() to get a resource from a parent directory?

Why does getResource return null

【问题讨论】:

  • 你确认NoteSearch.fxml真的在jar文件里了吗?
  • 我打开了我的罐子以确保,是的​​,文件可以在给定的位置找到。

标签: javafx resources classloader


【解决方案1】:

经过数小时的尝试,我只是采取了简单的方法,只需将 FXML 放入与需要特定 fxml 的类相同的文件夹中。

所以我的结构现在看起来像这样:Pastebin

我现在再次访问资源文件。

NOTE_SEARCH_LOADER.load(TabsController.class.getResourceAsStream("NoteSearch.fxml"));

现在导出的 Jar 和 Web Applet 版本都可以使用了。

此致 Fabian95qw

【讨论】:

    猜你喜欢
    • 2016-02-27
    • 2020-01-30
    • 1970-01-01
    • 2015-05-10
    • 2019-05-13
    • 1970-01-01
    • 2014-12-25
    • 2017-04-09
    • 2015-09-07
    相关资源
    最近更新 更多