首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >从jar运行时类的getResource和类加载器为null

从jar运行时类的getResource和类加载器为null
EN

Stack Overflow用户
提问于 2017-02-20 20:31:29
回答 1查看 966关注 0票数 0

在阅读了一大堆关于资源系统的帖子后,我仍然对这篇文章感到不快。

场景:

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

这两个版本在Eclipse中都工作得很好。

但是现在,一旦第一个fx控制器被调用,jar和小程序都会遇到同样的问题。

我的包结构:

代码语言:javascript
代码运行次数:0
运行
复制
/*
 1. 
    2.
        3.
            controller.
                        EntryPoint.class <-- Main
                        MenuController.class
                        TabsController.class
            ui.
                pane.
                        MainMenu.fxml
                        Startuppane.fxml
                        Tabs.fxml
                note.
                        NoteSearch.fxml
                        NoteView.fxml

 */

//edit:来自我解压的jar的树命令:Pastebin //edit End

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

首先,它从EntryPoint.class加载RootLayout

代码语言:javascript
代码运行次数:0
运行
复制
MainBorder = ROOTLOADER.load(EntryPoint.class.getResourceAsStream("/1/2/3/ui/pane/StartupPane.fxml"));

然后是两个孩子,一份菜单和一些标签。

菜单运行良好,因为MenuController本身不加载任何其他子项。

现在,当调用TabsController并试图加载它自己的子项时,实际的问题出现了,比如NoteView。

代码语言:javascript
代码运行次数:0
运行
复制
    TP  = TABSLOADER.load(EntryPoint.class.getResourceAsStream("/1/2/3/ui/pane/Tabs.fxml")); //Loading The Tabs.

因此加载了TabPane,并且当TabsController现在尝试加载他自己的子项时。我总是在导出的jar或webapplet中得到一个NullPointer。

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

代码语言:javascript
代码运行次数:0
运行
复制
NOTE_SEARCH_LOADER.load(TabsController.class.getResourceAsStream("/1/2/3/ui/note/NoteSearch.fxml")); 

在Eclipse中运行良好,但导出后会导致未知的路径/ NullPointer

代码语言:javascript
代码运行次数:0
运行
复制
NOTE_SEARCH_LOADER.load(TabsController.class.getClassLoader().getResourceAsStream("1/2/3/ui/note/NoteSearch.fxml")); 

改为使用ClassLoader,删除了第一个斜杠。在Eclipse中工作,一旦导出就会导致未知的路径/ NullPointer

代码语言:javascript
代码运行次数:0
运行
复制
NOTE_SEARCH_LOADER.load(EntryPoint.class.getResourceAsStream("/1/2/3/ui/note/NoteSearch.fxml"));

使用具有绝对路径的EntryPoint.class (main)。导出后即可在Eclipse中工作。导出时未知路径/ NullPointer。

代码语言:javascript
代码运行次数:0
运行
复制
NOTE_SEARCH_LOADER.load(EntryPoint.class.getClassLoader().getResourceAsStream("1/2/3/ui/note/NoteSearch.fxml"));

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

//edit3:我做了另一个测试,将代码从TabController复制到EntryPoint中。即使在Export to a Jar or Applet之后,代码的EntryPoint版本仍然有效。

我猜这与控制器是如何被调用有关的?

//编辑结束

我在挠头,想知道我还能尝试什么。

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

//编辑结束

也许我又遗漏了一些非常明显的东西。

辛克里

Fabian95qw

访问过的线程列表:

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-21 15:05:35

经过几个小时的尝试,我选择了一条简单的路线,只需将fxml放入需要特定FXML的类所在的文件夹中。

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

现在,我再次使用。

代码语言:javascript
代码运行次数:0
运行
复制
NOTE_SEARCH_LOADER.load(TabsController.class.getResourceAsStream("NoteSearch.fxml"));

现在,导出的Jar和Web Applet版本都可以工作。

Sincerly Fabian95qw

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42344698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档