4

我有一个使用 JavaFX 2 构建的 Java 桌面应用程序,然后我尝试运行 JAR。运行失败,所以我通过命令行运行它以获取错误。这是我得到的:

编辑:我更新了堆栈跟踪,因为添加/删除了一些代码行(错误是一样的)

C:\Users\user\Desktop>java -jar DesktopApp.jar
Error: failed to msvcr100.dll java.lang.UnsatisfiedLinkError: Can't load library: C:\Users\user\Desktop\bin\msvcr100.dll
*** Fallback to Prism SW pipeline
Exception in thread "main" java.lang.ExceptionInInitializerError
Caused by: java.lang.RuntimeException: java.lang.UnsatisfiedLinkError: Can't load library: C:\Users\user\Desktop\bin\mat.dll
        at com.sun.javafx.tk.quantum.QuantumToolkit.startup(QuantumToolkit.java:252)
        at com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:30)
        at javafx.embed.swing.JFXPanel.initFx(JFXPanel.java:128)
        at javafx.embed.swing.JFXPanel.<init>(JFXPanel.java:138)
        at app.Main.<clinit>(Main.java:150)
Caused by: java.lang.UnsatisfiedLinkError: Can't load library: C:\Users\user\Desktop\bin\mat.dll
        at java.lang.ClassLoader.loadLibrary(Unknown Source)
        at java.lang.Runtime.load0(Unknown Source)
        at java.lang.System.load(Unknown Source)
        at com.sun.glass.utils.NativeLibLoader.loadLibraryFullPath(NativeLibLoader.java:155)
        at com.sun.glass.utils.NativeLibLoader.loadLibraryInternal(NativeLibLoader.java:85)
        at com.sun.glass.utils.NativeLibLoader.loadLibrary(NativeLibLoader.java:30)
        at com.sun.glass.ui.Application$1.run(Application.java:27)
        at java.security.AccessController.doPrivileged(Native Method)
        at com.sun.glass.ui.Application.loadNativeLibrary(Application.java:25)
        at com.sun.glass.ui.win.WinApplication.<clinit>(WinApplication.java:33)
        at com.sun.glass.ui.win.WinPlatformFactory.createApplication(WinPlatformFactory.java:20)
        at com.sun.glass.ui.win.WinPlatformFactory.createApplication(WinPlatformFactory.java:17)
        at com.sun.glass.ui.Application.Run(Application.java:49)
        at com.sun.javafx.tk.quantum.QuantumToolkit.startup(QuantumToolkit.java:242)
        ... 4 more
Could not find the main class: app.Main. Program will exit.

编辑: Main.java 中的第 150 行是public static JFXPanel javafxPanel = new JFXPanel. 似乎 FX 需要mat.dll并且它在错误的位置寻找它,所以它找不到它。我在 Vista(32 位)上运行程序,但是当我在 Windows 7(64 位)上运行时,第一行(下面)不存在。

Error: failed to msvcr100.dll java.lang.UnsatisfiedLinkError: Can't load library: C:\Users\user\Desktop\bin\msvcr100.dll

经过更多研究:

经过一些互联网研究后,我发现了以下类似的讨论,我仍在研究:

看起来msvcr100.dllmat.dll与 JavaFX 运行时有关。我有 JavaFX Netbeans 插件,但没有运行时。我现在有了它,但这并没有解决或改变问题。我在 ....netbeans\7.0\lib\javafx2-win\bin\ 和 C:\Program Files\Oracle\JavaFX Runtime 2.0\bin 中找到了 msvcr100.dll 和 mat.dll(在我安装了运行时之后)。使用 Netbeans 运行时,我的程序似乎在正确的位置。


这不是我第一次运行这个程序。在过去的尝试中,它是成功的。通过 Netbeans 运行不会产生任何错误,程序运行正常。

这可能是FX错误吗?如何让我的程序出现在正确的位置,为什么不是?

4

4 回答 4

1

经过更多研究后,我决定复制位于 *....netbeans\7.0\lib\javafx2-win* 中的 bin 文件夹以及 *C:\Program Files\Oracle\JavaFX Runtime 2.0 中的 bin 文件夹(在我安装运行时之后) * 到我的 JAR 所在的位置。

这有效!我猜 JavaFX 需要 bin 文件夹中的 DLL。不知道为什么它们不会自动被包括在内。

于 2011-08-01T13:20:58.227 回答
1

我有同样的问题,但这就是我解决它的方法。在 Windows 下,我用以下几行创建了一个批处理文件

call c:\bkn-batfiles\setclasspath.bat 
set
java -jar  E:\DATA\JAVACLASSES-NETBEANS\search_files_with_java_fx\dist\search_files.jar 
pause 

它运行良好。在 setcalsspath.bat 我设置 PATH 如下

SET PATH=.;C:\bkn-batfiles;
SET PATH=%PATH%c:\Program Files\java\jdk1.7.0_03\bin;
SET PATH=%PATH%c:\Program Files\java\jdk1.7.0_03\lib;
SET PATH=%PATH%C:\Program Files\Oracle\JavaFX 2.0 SDK\rt\bin;
于 2012-02-19T19:24:45.477 回答
0

我认为您PATH没有设置为指向所需的 JNI 库。

请遵循以下说明:

  1. 请输入echo %PATH%并报告您看到的内容。
  2. 在同一命令提示符下,键入set PATH=%PATH%;C:\Users\user\Desktop\bin
  3. 在同一命令提示符下,重复您的原始命令:java -jar DesktopApp.jar
于 2011-07-26T17:49:22.667 回答
-2

如果我没记错的话,这与 Microsoft Visual C 运行时有关。尝试安装 Microsoft Visual C++ 2010 Redistributable Package (x86)

然而,一个更有趣的问题是你的应用程序为什么要尝试使用它,为什么它会在你的桌面上寻找它?

编辑:尝试将addDllLocationToPath("C:\\WINDOWS\\system32\\msvcr100.dll");第一行代码添加到您的应用程序中。


    /**
     * Allows you to add a path to the library path during runtime
     * @param dllLocation The path you would like to add
     * @return True if the operation completed successfully, false otherwise
     */
    public static boolean addDllLocationToPath(final String dllLocation)
    {
        //our return value
        boolean retVal = false;
        try
        {
            System.setProperty("java.library.path", System.getProperty("java.library.path") + ";" + dllLocation);
            //get the sys path field
            Field fieldSysPath = ClassLoader.class.getDeclaredField("sys_paths");
            fieldSysPath.setAccessible(true);
            fieldSysPath.set(null, null);
            retVal = true;
        }
        catch (Exception e)
        {
            System.err.println("Could not modify path");
        }
        return retVal;
    }

于 2011-07-26T18:31:12.260 回答