JAVAFX:位置没有设置错误

我的项目在eclipse中正常运行,但是当我创build这个项目的jar文件并试图通过cmd运行它显示“位置未设置”错误。

我的项目结构是:

这是我的项目的结构

方法是(在eclipse中运行):

@FXML private void RegularCustomer(ActionEvent event) throws Exception{ Stage stage = (Stage) dailySales.getScene().getWindow(); Scene scene = dailySales.getScene(); FXMLLoader loader = new FXMLLoader(getClass().getResource("../customer/CustomerHome.fxml")); System.out.println(loader.getLocation()); scene.setRoot(loader.load()); stage.setScene(scene); stage.show(); } 

这段代码有什么问题?

有一些相对的问题,但它们不同。 他们的代码没有在IDE中运行,但是我的代码在IDE中运行。

参考:我做了一些文件夹结构的变化,并能够成功运行。 但是这个结构太可怕了,因为我把所有的FXML文件和控制器放在同一个包里。

当您使用getClass().getResource(...)您正在加载资源,而不是指定文件的path。 在类加载器从文件系统加载类的情况下,这些实质上等同于相同的事情,并且它实际上工作(尽pipe如此,没有技术上的理由)。 当类加载器正在通过其他机制加载类时(可能无论如何都是这样),那么注意资源的Java 规范是很重要的。

特别要注意的是:

资源,名称和上下文

资源由由一系列子string组成的string标识,由斜杠(/)分隔,后跟资源名称。 每个子string必须是有效的Java标识符。 资源名称的格式为shortName或shortName.extension。 shortName和extension都必须是Java标识符。

(我的重点。)由于..不是一个有效的Java标识符,不能保证这个资源是可以parsing的。 恰巧,文件系统类加载器以您期望的方式解决了这个问题,这就是为什么它在您的IDE中工作的原因,但是在jar类加载器中实现getResource(...)并没有按照您希望的方式实现。

尝试

 FXMLLoader loader = new FXMLLoader(getClass().getResource("/sm/customer/CustomerHome.fxml"));