[英]JavaFX built with netbeans on my 64 bit Mac won't run on 32 bit Linux
我有點困惑。 我有一個正在使用的JavaFX程序(業余愛好),它可以在Mac上正常構建和運行。 (我有最新的Oracle Java 7)。 當我在32位Linux系統(也具有最新的Oracle版本)上運行在Mac(最新的NetBeans)中構建的jar文件時,出現以下錯誤:
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上完美運行,但不能在Mac上運行。)
由於我似乎無法在Linux上為Mac內置的jar文件運行調試器(反之亦然),因此我對從哪里開始尋找有所迷惑。 我已經確保使用File.separator並查找其他特定於OS的東西,但是我想找出FXMLLoader.java中的這些行是什么(在源代碼中),以了解為什么要進行交換。 注釋掉大部分代碼后,似乎導致barf的行是一個簡單的File實例化:
File myFile = new File(userDirectoryString);
我使用了許多文件和目錄,而這行是代碼中第一次使用文件或目錄。 我已經驗證了字符串“ userDirectoryString”,它是正確的。
有任何想法嗎?
我只能提供您在這里的想法:
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()在其工作期間引發了異常。
您必須在應該在其上運行的系統上編譯代碼。 JVM掃描您的系統,並為您在其上構建機器的機器寫字節碼。 您的代碼沒有錯,這就是JVM的工作方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.