我正在遇到部署servlet的问题。Servlet使用JNA加载一些DLL,这些DLL放置在com.myproject.Etc中。(例如" my_dll.dll"(:
public static final MyDllInterface INSTANCE = (MyDllInterface) Native.loadLibrary("./com/myproject/main/jna/dll/my_dll", MyDllInterface.class);
只要我在测试类中本地测试这些JNA接口,就可以正常工作。一旦我将它们部署到玻璃鱼(通过Netbeans(,我会遇到这样的错误:
java.lang.UnsatisfiedLinkError: Unable to load library './com/myproject/main/jna/dll/my_dll': The specified module could not be found.
我怀疑这与Glassfish如何处理classPath有关或内部的加载方式与.war包装应用程序有效有关。
我尝试使用的东西:
- 相对类路径(../dll_file(
- 绝对类路径(com/etc和/com/etc(
- 绝对系统路径(c:/users/etc(
任何人可以帮忙吗?
(我使用的是Netbeans 8.2,玻璃鱼4.1.1(带有NetBeans(。Windows上的DLL在Windows C 上编译并使用我的测试代码(
我想问题与 java.library.path
有关,并且您将dll文件包装在WebApp中。不建议这样做。
关于变量java.library.path
:
当Java应用程序使用该应用程序加载本机库时 System.loadLibrary((方法,Java.Library.Path被扫描 指定的库。如果JVM无法检测到所请求的 图书馆,它抛出了一个不满意的Linkerror。最后,用法 本地库使Java程序更加依赖于此 需要特定本地库的存在。
因此,在Glassfish上,此变量通常设置为JVM文件夹和glassfish/lib
目录。
一个解决方案可能是,将DLL文件放入文件夹glassfish/lib
并从loadLibrary()
调用中删除路径。
如果这不起作用或不够容易适合您,则可以尝试将java.library.path
设置为爆炸的战争目录的路径(THS是部署战争文件的内容的目录在玻璃鱼上(。
您可以使用玻璃鱼管理UI,asadmin
实用程序或直接在domain.xml
中更改玻璃鱼域的变量。
这是一个示例:-Djava.library.path=c:somewherewheretheDLLsarelocated
您爆炸的Web应用程序的路径应与以下方式相似:glassfishdomainsdomain1applicationsYOUR_WEBAPPLICATIONWEB-INFclasseswhereTheDLLsAre
。请查看此文件夹以确保DLL文件在那里。
那么您的设置应该与此相似:
-Djava.library.path=c:SOMETHINglassfish4glassfishdomainsdomain1applicationsYOUR_WEBAPPLICATIONWEB-INFclasseswhereTheDLLsAre
另请参阅:
- 我可以将本地dll打包到战争中吗?
- 尝试使用Java(JNA(的DLL。无法加载库例外