在我的64位Mac上使用netbeans构建的JavaFX将无法在32位Linux上运行

时间:2013-05-14 15:37:08

标签: java cross-platform javafx-2

我有点困惑。我有一个我正在研究的JavaFX程序(爱好),它在我的Mac上构建并运行得很好。 (我有最新的Oracle Java 7)。当我运行在Mac上构建的jar文件(在最新的NetBeans中),在我的32位Linux系统上(也使用最新的Oracle版本)时,它给出了以下错误:

java.lang.reflect.InvocationTargetException
file:/home/me/aFolder/SomeOne/Saved/Something.jar!/Something/mainWindow.fxml
   at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2186)
   at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2028)
   at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2744)
   at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2723)
   at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2709)
   at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2696)
   at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2685)
   at Something.Something.start(Something.java:33)
   at com.sun.javafx.application.LauncherImpl$5.run(LauncherImpl.java:319)
   at com.sun.javafx.application.PlatformImpl$5.run(PlatformImpl.java:215)
   at com.sun.javafx.application.PlatformImpl$4$1.run(PlatformImpl.java:179)
   at com.sun.javafx.application.PlatformImpl$4$1.run(PlatformImpl.java:176)
   at java.security.AccessController.doPrivileged(Native Method)
   at com.sun.javafx.application.PlatformImpl$4.run(PlatformImpl.java:176)
   at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:76)
   at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
   at com.sun.glass.ui.gtk.GtkApplication$3$1.run(GtkApplication.java:82)
   at java.lang.Thread.run(Unknown Source)

Something.java:33的行是我调用的地方

AnchorPane mainWindowPane =     
  (AnchorPane)FXMLLoader.load(UdoMail.class.getResource("mainWindow.fxml"));

所以,我很困惑从哪里开始。这是一个在我的Mac上构建的jar文件,移动到32位Linux(运行最新的32位Oracle Java),然后运行。

更奇怪的是,如果我在32位Linux上构建它,然后在我的Mac上运行Linux内置的jar文件,我会在Mac上(有效地)得到相同的错误。

如果我在我构建的同一平台上运行,一切正常。 (也就是说,如果我在Linux上使用代码并在Linux上构建代码,它在Linux上运行完美,但在Mac上运行不正确。)

由于我似乎无法在Linux上为Mac构建的jar文件运行调试器(反之亦然),所以我对于从何处开始寻找感到有点迷茫。我已经确保我正在使用File.separator并寻找其他操作系统特定的东西,但我想知道FXMLLoader.java中的这些行(在源代码中)是什么,以了解它为什么是barfing。在注释掉大部分代码之后,似乎导致barf的行是一个简单的File实例化:

File myFile = new File(userDirectoryString);

我使用了很多文件和目录,这行是我代码中第一次调用文件或目录。我已经验证了字符串“userDirectoryString”并且它是正确的。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

我只能帮助你,因为你在这里:

public static final String INITIALIZE_METHOD_NAME = "initialize";

// Initialize the controller
            Method initializeMethod =   getControllerMethods().get(INITIALIZE_METHOD_NAME);

            if (initializeMethod != null) {
                try {
                    MethodUtil.invoke(initializeMethod, controller, new Object [] {});
                } catch (IllegalAccessException exception) {
                    // TODO Throw when Initializable is deprecated/removed
                    // throw new LoadException(exception);
                } catch (InvocationTargetException exception) {
                    throw new LoadException(exception);
                }
            }

您可以在OpenJFX中找到此代码。

我们可以看到,这意味着,该方法initialize()在其工作期间抛出了一个异常。

答案 1 :(得分:0)

你必须在它应该运行的系统上编译代码。 JVM扫描您的系统并为您构建它的机器写入字节代码。您的代码没有任何问题,这是JVM的工作方式。