在 Glassfish 上使用 JNA 加载 DLL
Loading DLLs with JNA on Glassfish
我在部署 servlet 时遇到问题。 servlet 使用 JNA 加载一些 DLL,这些 DLL 位于 classpath com.myproject..etc 内。 (例如 "my_dll.dll"):
public static final MyDllInterface INSTANCE = (MyDllInterface) Native.loadLibrary("./com/myproject/main/jna/dll/my_dll", MyDllInterface.class);
只要我使用测试 classes 在本地测试这些 JNA 接口,它就可以正常工作。一旦我将它们部署到 glassfish(通过 Netbeans),我就会收到这样的错误:
java.lang.UnsatisfiedLinkError: Unable to load library './com/myproject/main/jna/dll/my_dll': The specified module could not be found.
我怀疑这与 glassfish 如何处理 class 路径或如何在 *.war 打包应用程序中加载有关。
我尝试使用的东西:
- 相对 class 路径 (../dll_file)
- 绝对 class 路径(com/etc 和 /com/etc)
- 绝对系统路径(C:/Users/etc)
有人可以帮忙吗?
(我在 Windows 上使用 Netbeans 8.2、Glassfish 4.1.1(Netbeans 附带)。DLL 在 Windows C++ 上编译并使用我的测试代码)
我猜问题与 java.library.path
有关,并且您正在将 DLL 文件打包到您的 webapp 中。不推荐这样做。
关于变量java.library.path
:
When a Java application loads a native library using the
System.loadLibrary() method, the java.library.path is scanned for the
specified library. If the JVM is not able to detect the requested
library, it throws an UnsatisfiedLinkError. Finally, the usage of
native libraries makes a Java program more platform dependent, as it
requires the existence of specific native libraries.
因此,在 Glassfish 上,此变量通常设置为 JVM 文件夹和 glassfish/lib
目录。
一个解决方案可能是,将 DLL 文件放入文件夹 glassfish/lib
并从您的 loadLibrary()
调用中删除路径。
如果这不起作用或对您来说不够便携,您可以尝试将 java.library.path
设置为展开的 WAR 目录的路径(这是内容所在的目录您的 WAR 文件在部署到 Glassfish 上时会被提取)。
您可以通过 Glassfish Admin UI、使用 asadmin
实用程序或直接在 domain.xml
.
中更改 Glassfish 域的变量
这是一个例子:-Djava.library.path=c:\somewhere\where\the\DLLs\are\located
展开的 Web 应用程序的路径应与此类似:glassfish\domains\domain1\applications\YOUR_WEBAPPLICATION\WEB-INF\classes\whereTheDLLsAre\
。查看此文件夹以确保 DLL 文件在那里。
那么您的设置应该与此类似:
-Djava.library.path=c:\SOMETHIN\glassfish4\glassfish\domains\domain1\applications\YOUR_WEBAPPLICATION\WEB-INF\classes\whereTheDLLsAre\
另请参阅:
- Could I pack native DLLs into WAR?
- Trying to use DLL from Java (JNA). Unable to load library exception
我在部署 servlet 时遇到问题。 servlet 使用 JNA 加载一些 DLL,这些 DLL 位于 classpath com.myproject..etc 内。 (例如 "my_dll.dll"):
public static final MyDllInterface INSTANCE = (MyDllInterface) Native.loadLibrary("./com/myproject/main/jna/dll/my_dll", MyDllInterface.class);
只要我使用测试 classes 在本地测试这些 JNA 接口,它就可以正常工作。一旦我将它们部署到 glassfish(通过 Netbeans),我就会收到这样的错误:
java.lang.UnsatisfiedLinkError: Unable to load library './com/myproject/main/jna/dll/my_dll': The specified module could not be found.
我怀疑这与 glassfish 如何处理 class 路径或如何在 *.war 打包应用程序中加载有关。
我尝试使用的东西:
- 相对 class 路径 (../dll_file)
- 绝对 class 路径(com/etc 和 /com/etc)
- 绝对系统路径(C:/Users/etc)
有人可以帮忙吗?
(我在 Windows 上使用 Netbeans 8.2、Glassfish 4.1.1(Netbeans 附带)。DLL 在 Windows C++ 上编译并使用我的测试代码)
我猜问题与 java.library.path
有关,并且您正在将 DLL 文件打包到您的 webapp 中。不推荐这样做。
关于变量java.library.path
:
When a Java application loads a native library using the System.loadLibrary() method, the java.library.path is scanned for the specified library. If the JVM is not able to detect the requested library, it throws an UnsatisfiedLinkError. Finally, the usage of native libraries makes a Java program more platform dependent, as it requires the existence of specific native libraries.
因此,在 Glassfish 上,此变量通常设置为 JVM 文件夹和 glassfish/lib
目录。
一个解决方案可能是,将 DLL 文件放入文件夹 glassfish/lib
并从您的 loadLibrary()
调用中删除路径。
如果这不起作用或对您来说不够便携,您可以尝试将 java.library.path
设置为展开的 WAR 目录的路径(这是内容所在的目录您的 WAR 文件在部署到 Glassfish 上时会被提取)。
您可以通过 Glassfish Admin UI、使用 asadmin
实用程序或直接在 domain.xml
.
这是一个例子:-Djava.library.path=c:\somewhere\where\the\DLLs\are\located
展开的 Web 应用程序的路径应与此类似:glassfish\domains\domain1\applications\YOUR_WEBAPPLICATION\WEB-INF\classes\whereTheDLLsAre\
。查看此文件夹以确保 DLL 文件在那里。
那么您的设置应该与此类似:
-Djava.library.path=c:\SOMETHIN\glassfish4\glassfish\domains\domain1\applications\YOUR_WEBAPPLICATION\WEB-INF\classes\whereTheDLLsAre\
另请参阅:
- Could I pack native DLLs into WAR?
- Trying to use DLL from Java (JNA). Unable to load library exception