在玻璃鱼上加载dll



我正在遇到部署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。无法加载库例外

最新更新