在Glassfish上使用JNA加载DLL

时间:2018-02-15 16:53:02

标签: java servlets dll glassfish jna

我在部署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接口,这就可以正常工作。一旦我将它们部署到glassfish(通过Netbeans),我就会遇到这样的错误:

java.lang.UnsatisfiedLinkError: Unable to load library './com/myproject/main/jna/dll/my_dll': The specified module could not be found.

我怀疑它与glassfish如何处理类路径有关,也可能与* .war压缩应用程序内部的加载有关。

我尝试过的事情:

  • 相对类路径(../ dll_file)
  • 绝对类路径(com / etc和/ com / etc)
  • 绝对系统路径(C:/ Users / etc)

有人可以帮忙吗?

(我在Windows上使用Netbeans 8.2,Glassfish 4.1.1(Netbeans附带)。在Windows C ++上编译DLL并使用我的测试代码)

1 个答案:

答案 0 :(得分:0)

我想这个问题与java.library.path有关,并且您正在将DLL文件打包到您的webapp中。不建议这样做。

关于变量java.library.path

  

当Java应用程序使用时加载本机库   System.loadLibrary()方法,扫描java.library.path   指定的库。如果JVM无法检测到请求   库,它抛出一个UnsatisfiedLinkError。最后,用法   本机库使Java程序更依赖于平台,因为它   需要存在特定的本地库。

因此,在Glassfish上,此变量通常设置为JVM文件夹和glassfish/lib目录。

一种解决方案可能是将DLL文件放入文件夹glassfish/lib并从loadLibrary()来电中删除路径。

如果这不起作用或者不够便携,您可以尝试将java.library.path设置为展开的WAR目录的路径(这是提取WAR文件内容的目录)当它部署在Glassfish上时。)

您可以通过Glassfish管理界面,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\

另见: