如何让 NetBeans 在 src 文件夹而不是 dist 文件夹中搜索我的文件?
Posted
技术标签:
【中文标题】如何让 NetBeans 在 src 文件夹而不是 dist 文件夹中搜索我的文件?【英文标题】:How do I make NetBeans search for my files in the src folder instead of the dist folder? 【发布时间】:2016-01-20 07:28:39 【问题描述】:我正在使用JavaFX
创建一个应用程序。每次我尝试运行它时,我都会得到一个LoadException
。问题是当我尝试运行这段代码时,例如:
public void start(Stage stage) throws Exception
Parent root = FXMLLoader.load(getClass().getResource("MainTabPane.fxml"));
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
stage.setTitle("Global Car Trading");
它使用此路径搜索 MainTabPane.fxml:
文件:/C:/Users/Jesper/Documents/NetBeansProjects/3semester/trunk/dist/GlobalCarTrading.jar!/GUI/MainTabPane.fxml
但该文件不在 dist 文件夹中,它位于 src
文件夹中。我该如何解决这个问题?
fxml 和类文件的位置: C:\Users\Jesper\Documents\NetBeansProjects\3semester\trunk\src\GUI
当代码是
Parent root = FXMLLoader.load(getClass().getResource("GUI/MainTabPane.fxml"));:
我得到以下异常:
Exception in Application start method
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:363)
at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:303)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)
Caused by: java.lang.RuntimeException: Exception in Application start method
at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:875)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$147(LauncherImpl.java:157)
at com.sun.javafx.application.LauncherImpl$$Lambda$48/1268447657.run(Unknown Source)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NullPointerException: Location is required.
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3201)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3169)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3142)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3118)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3098)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3091)
at GUI.GlobalCarTrading.start(GlobalCarTrading.java:23)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$153(LauncherImpl.java:821)
at com.sun.javafx.application.LauncherImpl$$Lambda$51/1715882599.run(Unknown Source)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$166(PlatformImpl.java:323)
at com.sun.javafx.application.PlatformImpl$$Lambda$45/128893786.run(Unknown Source)
at com.sun.javafx.application.PlatformImpl.lambda$null$164(PlatformImpl.java:292)
at com.sun.javafx.application.PlatformImpl$$Lambda$47/1127003017.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$165(PlatformImpl.java:291)
at com.sun.javafx.application.PlatformImpl$$Lambda$46/1108411398.run(Unknown Source)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$141(WinApplication.java:102)
at com.sun.glass.ui.win.WinApplication$$Lambda$37/1147985808.run(Unknown Source)
... 1 more
Exception running application GUI.GlobalCarTrading
当我删除“GUI/”部分时,如下所示:
Parent root = FXMLLoader.load(getClass().getResource("MainTabPane.fxml"));:
我也遇到了这个异常:
Caused by: javafx.fxml.LoadException: file:/C:/Users/Jesper/Documents/NetBeansProjects/3semester/trunk/dist/GlobalCarTrading.jar!/GUI/MainTabPane.fxml
at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2595)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2573)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2435)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3208)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3169)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3142)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3118)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3098)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3091)
at GUI.GlobalCarTrading.start(GlobalCarTrading.java:23)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$153(LauncherImpl.java:821)
at com.sun.javafx.application.LauncherImpl$$Lambda$51/281867444.run(Unknown Source)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$166(PlatformImpl.java:323)
at com.sun.javafx.application.PlatformImpl$$Lambda$45/128893786.run(Unknown Source)
at com.sun.javafx.application.PlatformImpl.lambda$null$164(PlatformImpl.java:292)
at com.sun.javafx.application.PlatformImpl$$Lambda$47/170597113.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$165(PlatformImpl.java:291)
at com.sun.javafx.application.PlatformImpl$$Lambda$46/1108411398.run(Unknown Source)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$141(WinApplication.java:102)
at com.sun.glass.ui.win.WinApplication$$Lambda$37/1147985808.run(Unknown Source)
... 1 more
【问题讨论】:
能否在项目中添加class和fxml文件的位置? 您不希望它在 src 文件夹中查找:无法保证 src 文件夹在应用程序运行时甚至会存在。 @James_D 事实上它很有可能不会。 您可以发布 .fxml 文件吗?另外,您使用的是什么项目类型?有一个与 fxml 一起使用的特定项目类型(类别 = JavaFX,类型 = JavaFX FXML 应用程序)可能值得一试。 【参考方案1】:它不是在 dist 文件夹中寻找文件,而是在 dist 文件夹中的 Jar 中寻找资源。 Jar 文件实际上是 zip 文件,其中可以包含文件和目录。这是查看它的正确位置,因为当您分发应用程序时,用户将需要访问 .fxml 文件并且没有您的源代码。构建 jar 时,源目录中的文件存储在 jar 文件中。您可以通过将 MainTabPane.fxml 放在与此类相同的目录中来使此代码工作,该目录似乎是 src/GUI 目录。另一种选择是使用:
Parent root = FXMLLoader.load(ClassLoader.getSystemClassLoader().getSystemResource("MainTabPane.fxml"));
这也将从 dist 文件夹中的 jar 文件中获取 MainTabPane.fxml,但它将从 jar 文件中的***目录中获取它,其中存储 src 目录中的文件,而不是 jar 中的 GUI 子目录.
【讨论】:
您的意思是我应该将 MainTabPane.fxml 放在与 .jar 文件相同的文件夹中吗? .jar 文件的路径是 C:\Users\Jesper\Documents\NetBeansProjects\3semester\trunk\dist\GlobalCarTrading.jar 不,我的意思是把它放在与调用 getClass() 的 .java 文件相同的目录中。构建jar时会从该目录复制到对应子目录下的jar文件中。 能不能解压jar文件并贴出jar文件中的文件列表,以及src目录下的文件列表,注意显示文件夹结构? 您可能只需要重建以使事情同步。 我刚查了一下,src文件夹中的文件和.jar文件完全一样,只是.jar文件中有一个名为META-INF的文件夹,里面有文件“MANIFEST.MF”。 【参考方案2】:getClass() 获取调用它的类。如果资源在同一个文件夹/包中,您可以直接使用 getResource("file") 获取它。如果文件位于父文件夹/包或不同的文件夹/包中,您可以调用 getClass().getResource("../foo/file")。这可能不是最好的解决方案,但它确实有效。
【讨论】:
为什么?有什么例外吗?您可以通过添加 .getContent() 来获取内容,这将为您提供 BufferedInputStream。将字符读取为字符串并对其进行解析。 我得到了这些:InvocationTargetException、RuntimeException、NullPointerException 它可能读取 .fxml 就好了,但 .fxml 文件有问题。打开 .fxml 文件并尝试 Source-> Make Controller。 试试这个:BufferedInputStream input = (BufferedInputStream) getClass().getResource("../foo/file.ext").getContent(); String content = ""; while (input.available() > 0) content += (char) input.read();
@Jesper,也许是这个:Parent root = FXMLLoader.load(getClass().getResource("MainTabPane.fxml").getContent());
以上是关于如何让 NetBeans 在 src 文件夹而不是 dist 文件夹中搜索我的文件?的主要内容,如果未能解决你的问题,请参考以下文章
Netbeans 使用 pom.xml (Maven) 而不是 build.gradle (Gradle)
如何让 CakePHP 加载我的 <project_root>/src 目录而不是 vendor/maiconpinto/cakephp-adminlte-theme/src