我有一个Java桌面应用程序和我建立的JavaFX 2,然后我尝试运行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.dll , mat.dll 与JavaFX Runtime相关。我有JavaFX Netbeans插件,但我没有运行时。我现在有它,但没有修复或改变问题。我在.... netbeans \ 7.0 \ lib \ javafx2-win \ bin \中找到msvcr100.dll和mat.dll,并且(在我安装运行时之后)在C:\ Program Files \ Oracle \ JavaFX Runtime 2.0 \ bin中找到了。看起来我的程序在使用Netbeans运行时正在查找正确的位置。
这不是我第一次运行这个程序。在过去的尝试中,它是成功的。通过Netbeans运行不会产生任何错误,程序也能正常运行。
这可能是FX错误吗?如何让我的程序在正确的位置查找,为什么不呢?
答案 0 :(得分:1)
经过更多研究后,我决定将位于* .... netbeans \ 7.0 \ lib \ javafx2-win *中的bin文件夹复制到* C:\ Program Files \ Oracle \中(在我安装运行时之后) JavaFX Runtime 2.0 *到我的JAR所在的位置。
这个工作!我想JavaFX需要bin文件夹中的DLL。不确定为什么他们不会被自动包括在内。
答案 1 :(得分: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;
答案 2 :(得分:0)
我认为您的PATH
未设置为指向所需的JNI库。
请按照以下说明操作:
echo %PATH%
并报告您所看到的内容。set PATH=%PATH%;C:\Users\user\Desktop\bin
java -jar DesktopApp.jar
答案 3 :(得分:-2)
如果我没弄错的话,这与Microsoft Visual C Runtime有关。尝试安装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;
}